De this question uno podría comenzar a creer que la alineación de una unión no es menor que la alineación más grande de sus miembros individuales. Pero tengo un problema con el tipo long long
en gcc/g ++. El ejemplo completo se puede encontrar here, pero aquí están las partes relevantes para mi pregunta:¿Por qué la alineación del miembro de unión largo largo es más grande que la unión/estructura contenedora? ¿Es esto correcto?
union ull {
long long m;
};
struct sll {
long long m;
};
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(sizeof(long long));
pr(__alignof__(long long));
pr(sizeof(ull));
pr(__alignof__(ull));
pr(sizeof(sll));
pr(__alignof__(sll));
};
Esto se traduce en la siguiente salida:
sizeof(long long): 8
__alignof__(long long): 8
sizeof(ull): 8
__alignof__(ull): 4
sizeof(sll): 8
__alignof__(sll): 4
¿Por qué es la alineación de un miembro de un sindicato más grande de lo que se de la unión que contiene?
[ACTUALIZACIÓN]
Según la respuesta de Keith alignof está mal aquí. Pero pruebo lo siguiente y parece que alignof nos dice la verdad. Ver:
union ull {
long long m;
};
long long a;
char b;
long long c;
char d;
ull e;
int main() {
#define pr(v) cout << #v ": " << (v) << endl
pr(size_t((void*)&b));
pr(size_t((void*)&c));
pr(size_t((void*)&d));
pr(size_t((void*)&e));
pr(size_t((void*)&c) - size_t((void*)&b));
pr(size_t((void*)&e) - size_t((void*)&d));
};
La salida:
size_t((void*)&b): 134523840
size_t((void*)&c): 134523848
size_t((void*)&d): 134523856
size_t((void*)&e): 134523860
size_t((void*)&c) - size_t((void*)&b): 8
size_t((void*)&e) - size_t((void*)&d): 4
Así, la alineación de long long
es 8 y la alineación de la unión que contiene long long
es 4 en los datos globales. Para el ámbito local no puedo probar esto, ya que parece que el compilador puede reorganizar los datos locales, por lo que este truco no funciona. ¿Puedes comentar sobre esto?
[/ ACTUALIZACIÓN]
Veo lo mismo en Red Hat, gcc 4.7.0 con '-m32', pero * no * con' -m64' (todos '8's). – BoBTFish
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023 un enlace al error gcc correspondiente para _Alignof (C11). –