История изменений
Исправление proud_anon, (текущая версия) :
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023
Fixed for 4.9. The semantics of __alignof__ and C++11 alignof remain, deliberately, the alignment used outside structures.
Спасибо, это ты как раз нашёл то, что нужно. Теперь становится понятно, что у этих операторов в C и C++ разная семантика, по крайней мере в GCC. В C мы получаем минимальное необходимое выравнивание, зависящее от платформы. В C++ мы получаем предпочтительное выравнивание, то же, что выдаёт встроенный в GCC оператор __alignof__ и которое, в частности, не действует внутри структур.
Например:
#include <stdio.h>
#include <stdalign.h>
int main() {
printf("alignof(double) == %u\n", alignof(double));
printf("__alignof__(double) == %u\n", __alignof__(double));
}
% gcc -march=i686 -m32 -o test-c test-c.c
% ./test-c
alignof(double) == 4
__alignof__(double) == 8
Исходная версия proud_anon, :
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023
Fixed for 4.9. The semantics of __alignof__ and C++11 alignof remain, deliberately, the alignment used outside structures.
Теперь становится понятно, что у этих операторов в C и C++ разная семантика, по крайней мере в GCC. В C мы получаем минимальное необходимое выравнивание, зависящее от платформы. В C++ мы получаем предпочтительное выравнивание, то же, что выдаёт встроенный в GCC оператор __alignof__ и которое, в частности, не действует внутри структур.
Например:
#include <stdio.h>
#include <stdalign.h>
int main() {
printf("alignof(double) == %u\n", alignof(double));
printf("__alignof__(double) == %u\n", __alignof__(double));
}
% gcc -march=i686 -m32 -o test-c test-c.c
% ./test-c
alignof(double) == 4
__alignof__(double) == 8