De ANSI-ISO-IEC 14882-2003, p.87 (C++ 03):
"75) Otra manera de acercarse puntero aritmética es primero en convertir el puntero (s) al puntero del personaje (s): En este esquema el valor integral de la expresión suma o se resta de el puntero convertido es primero multiplicado por el tamaño del objeto señaló originalmente para, y la puntero resultante se convierte de nuevo a el tipo original. para puntero resta, el resultado de la diferencia entre el carácter poin ters se divide de manera similar por el tamaño del objeto originalmente apuntado a ".
Esto parece sugerir que la diferencia del puntero es igual al tamaño del objeto.
Si eliminamos la UB'ness de incrementar un puntero a un escalar A y convertir a en una matriz:
int a[1];
size_t size_of_int = (char*)(a+1) - (char*)(a);
std::cout<<size_of_int;// or printf("%zu",size_of_int);
Luego Esto tiene buen aspecto. Las cláusulas sobre los requisitos de alineación son consistentes con la nota al pie, si los requisitos de alineación son siempre divisibles por el tamaño del objeto.
ACTUALIZACIÓN: Interesante. Como la mayoría de ustedes probablemente sepa, GCC permite especificar una alineación explícita a los tipos como una extensión. Pero no puedo romper método "sizeof" de OP con él porque se niega GCC para su compilación:
#include <stdio.h>
typedef int a8_int __attribute__((aligned(8)));
int main()
{
a8_int v[2];
printf("=>%d\n",((char*)&v[1]-(char*)&v[0]));
}
El mensaje es error: alignment of array elements is greater than element size
.
portátil a qué? int no es independiente de la plataforma y tiene un significado diferente en los sistemas de 64 bits. Aunque mi C++ es probablemente demasiado oxidado para esto. – Blub
@Blub: me refiero a que lo anterior siempre codificará sizeof (int) (por ejemplo: 4 en un entorno típico de 32 bits)? –
para los registros, ¿podría elegir un título apropiado para su pregunta? algo que al menos menciona la aritmética del puntero. gracias –