Pregunta ¿Qué es exactamente un 'puntero alineado'?


¿Alguien podría decirme qué? puntero alineado en realidad significa?


32
2017-12-01 09:34


origen


Respuestas:


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

A veces se utiliza el término "alineación natural", que generalmente significa que los objetos que tienen una alineación natural deben colocarse en direcciones que sean divisibles de manera uniforme por el tamaño del objeto.

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

Por ejemplo, en el clásico SPARC arquitectura (y también en la clásica BRAZO, Creo), no se puede leer un número entero mayor a un byte desde 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 también pueden afectar el 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;
};

muy probablemente terminaría teniendo 7 bytes de relleno entre los campos, para hacer double campo alinear en un desplazamiento divisible por su propio tamaño (que he supuesto que es 8).

Cuando se ve en binario, una dirección alineada a norte los bytes tendrán su log2 (norte) bits menos significativos establecidos en 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.


34
2017-12-01 09:38



Para agregar a lo que relajarse está explicando, aquí hay un struct Recientemente utilicé una tarea:

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

Puede esperar el tamaño de este struct ser (4 + 30 + 11 + 4 =) 49 bytes, pero de hecho es 52 comparado con sizeof. Porque noseq es 4 bytes + salesman es 32 bytes (alineados) + product es 12 bytes (alineados) y count es 4 bytes, por lo tanto 52 bytes.


3
2017-12-01 09:49



Depende del contexto, pero podría ser el puntero mismo alineado o lo que señala está alineado.

'Alineado' significa que un determinado objeto se almacena en una dirección que es un múltiplo de una determinada 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.


2
2017-12-01 09:42



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.

Usualmente no tienes que preocuparte 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.


1
2017-12-01 09:39



Como la gente mencionó antes que yo, significa que su puntero es divisible de manera pareja por una cierta cantidad de bytes.

Para verificar si su puntero está alineado, puede hacer esto:

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

Ahora, "isaligned" es verdadero si "pointer" está alineado con bytes de "bytes".


0
2017-12-01 11:28



Puntero Alineado significa el puntero con la ubicación de la memoria adyacente a la que se puede acceder agregando una constante y sus múltiplos

para char a[5] = "12345"; 

aquí a es un puntero constante si tiene el tamaño de char cada vez que puede acceder al siguiente carácter que es,

a+ sizeofchar tendrá acceso 2

a+ (sizeofchar * 2) accederá 3 etc

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


0
2017-12-01 13:18