2010-12-01 17 views

Respuesta

32

Significa que la dirección a la que se apunta es divisible de manera uniforme por algún factor.

A veces el término "alineación natural" se utiliza, lo que significa generalmente que los objetos que tienen alineación natural necesitan ser colocados en direcciones que están uniformemente divisible por el tamaño del objeto.

La alineación es somestimes muy importante, ya que muchas cosas relacionadas con el hardware imponen restricciones a dicha alineación.

Por ejemplo, en la arquitectura clásica SPARC (y también en la clásica ARM, creo), no se puede leer un entero mayor que un byte de una dirección impar. Intentar hacerlo detendrá inmediatamente su programa con un error de bus. En la arquitectura x86, el hardware de la CPU maneja el problema (al hacer múltiples accesos a la memoria caché y/o memoria según sea necesario), aunque podría llevar más tiempo. RISC: sus arquitecturas típicas no hacen esto por usted.

Este tipo de situaciones pueden afectar al relleno, es decir, la inserción de datos falsos entre, p. Ej. estructurar los campos para mantener la alineación. Una estructura como esta:

struct example 
{ 
    char initial; 
    double coolness; 
}; 

sería muy probable llegar a tener 7 bytes de relleno entre los campos, para que el campo double alinear en una divisible compensado por su propio tamaño (que he asumido para ser 8) .

Cuando se ve en binario, una dirección alineada con n bytes tendrá su log2 (n ) bits menos significativos puestos a cero. Por ejemplo, un objeto que requiere una alineación de 32 bytes tendrá una dirección alineada correctamente que termine con (binario) 00000, ya que log2 (32) es 5. Esto también implica que una dirección puede ser forzada a la alineación borrando el número requerido de bits.

+0

@unwind: OOC, ¿conoce alguna implementación que tenga dicho factor como * impar *? – SiegeX

+2

"alineado con n bytes" debe leer "alineado con n * bits *", ya que log2 (1) = 0. Usted quiso decir log2 (8) = 3. –

+0

@Axel: No sigo ... Sí, log2 (1) es 0, un objeto que requiere 1 alineación de byte no necesita ningún LSB forzado a cero. Agregué un ejemplo, espero que eso lo aclare. ¿Todavía crees que está mal? – unwind

1

Es un puntero a una dirección "alineada". Alineado en el sentido de que la dirección es un múltiplo de algún valor, por lo general, el tamaño de cualquier tipo de cosa que señalará (si es un tipo primitivo), o de algún miembro de datos que requiera dicha alineación.

Por lo general, no tiene que preocuparse por esto; las funciones de asignación de memoria asegurarán que la memoria que le dan esté alineada correctamente. Comienza a preocuparse por la alineación en el punto donde comienza a hacer cosas inseguras con moldes de puntero.

2

Depende del contexto, pero podría ser el puntero mismo alineado o lo que apunta a estar alineado.

'Aligned' significa que un determinado objeto se almacena en una dirección que es un múltiplo de una cierta constante. P.ej. para enteros de 32 bits esto es casi siempre 4. Esto se debe a que un byte es de 8 bits: 4 * 8 = 32 bits. A menudo, un procesador puede hacer un acceso a la memoria mucho más rápido si el objeto se almacena en una dirección alineada, o para algunos procesadores ni siquiera es posible hacer accesos no alineados.

3

que añadir a lo unwind está explicando, que aquí hay una struct he utilizado recientemente en una misión:

struct infosale {    
    int noseq;     
    char salesman[30];   
    char product[11];   
    int count;     
};        

Usted puede esperar que el tamaño de este struct sea (4 + 30 + 11 + 4 =) 49 bytes, pero de hecho es 52 en comparación con sizeof. Debido noseq es 4 bytes + salesman es 32 bytes (alineados) + product es 12 bytes (alineados) y count es 4 bytes, por lo tanto 52 bytes.

+1

Tu matemáticas están apagadas. Además, de alguna manera dudo que el relleno esté dividido, en lugar de solo agregar los 3 espacios obligatorios necesarios directamente antes del último 'int'. – Deduplicator

+1

Lo he probado con GCC (no recuerdo la versión), en C, y esto es lo que informó el depurador en ese momento. Tendría que revisar eso para confirmarlo. Sin embargo, estoy bastante seguro de que al compilador no le gustan las direcciones impares y alineará las variables a un desplazamiento par; por lo que se rellenará a menos que se indique explícitamente que no. (¡Ha pasado un tiempo desde que codifiqué en C!) –

+1

Sry por no estar claro: su primera suma es 49 no 48, y me gustaría saber qué compilador lo probó y qué alineó la matriz de caracteres como un int. – Deduplicator

0

Como la gente ha mencionado antes que yo, significa que su puntero es divisible por una cierta cantidad de bytes.

para comprobar si el puntero está alineado usted puede hacer esto:

isaligned = !((long)pointer % bytes); 

Ahora, "isaligned" es verdadero si "puntero" se alinea con "bytes" bytes.

+0

En realidad, no se puede, y su compilador se lo dirá. Puede intentar 'bool isAligned = ((reinterpret_cast (puntero)% sizeof (* puntero)) == 0);'. – MSalters

+0

Sí, eso es correcto. No puede hacer modulo en los punteros, por lo que debe convertirlo en algo más apropiado. ¡Voy a arreglar! – onemasse

0

Alineados puntero significa que el puntero con la ubicación de memoria adyacentes que se puede acceder por una adición de una constante y sus múltiplos

para char a[5] = "12345";

aquí a es puntero constante si usted y el tamaño de char a cada tiempo se puede acceder a la siguiente chracter que es,

a + sizeofchar accederá a 2

a + (sizeofchar * 2) accederá a 3 y así sucesivamente

de forma similar si accede a los valores de bit variable por bit.