LINUX.ORG.RU

История изменений

Исправление 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