¿Alguien podría decirme qué significa puntero alineado en realidad?¿Qué es exactamente un 'puntero alineado'?
Respuesta
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.
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.
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.
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.
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
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!) –
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
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.
En realidad, no se puede, y su compilador se lo dirá. Puede intentar 'bool isAligned = ((reinterpret_cast
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
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.
- 1. ¿Qué significa EXACTAMENTE "desreferenciando un puntero NULL"?
- 2. ¿Qué es exactamente un marco?
- 3. Puntero no alineado liberado, en Java?
- 4. ¿Por qué es un puntero
- 5. ¿Qué es un puntero largo?
- 6. ¿Qué es un puntero sintético?
- 7. ¿Qué es un puntero desnudo?
- 8. ¿Qué es exactamente Rake?
- 9. ¿Qué es exactamente OWASP?
- 10. ¿Qué es exactamente WPF?
- 11. ¿Qué es exactamente Java?
- 12. ¿Qué es exactamente Parrot?
- 13. ¿Qué es hash exactamente?
- 14. ¿Qué es exactamente Heroku?
- 15. ¿Qué es exactamente OData?
- 16. ¿Qué es exactamente JSON?
- 17. ¿Exactamente qué es PLINQ?
- 18. ¿Qué es exactamente sun.jnu.encoding?
- 19. ¿Qué es exactamente NoSQL?
- 20. ¿Qué es exactamente "manejar"?
- 21. ¿Qué es Container.DataItem exactamente?
- 22. ¿Qué es LINQ exactamente?
- 23. ¿Qué es exactamente súper en Objective-C?
- 24. TCPDF - Número de páginas no exactamente alineado a la derecha
- 25. Eclipse - ¿Qué es exactamente un generador?
- 26. ¿Qué es exactamente un filtro de origen?
- 27. ¿Qué es exactamente un contexto en Java?
- 28. ¿Qué es exactamente un ataque de arcoíris?
- 29. ¿Qué es un trabajador de appharbor ... exactamente?
- 30. ¿Qué es exactamente un "papel" en Capistrano?
@unwind: OOC, ¿conoce alguna implementación que tenga dicho factor como * impar *? – SiegeX
"alineado con n bytes" debe leer "alineado con n * bits *", ya que log2 (1) = 0. Usted quiso decir log2 (8) = 3. –
@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