спецификатор alignas vs атрибут (выровненный), c++11

В настоящее время я разрабатываю ядро ОС на C++11, и я столкнулся с вопросом, я не могу найти ответ на себя.

В настоящее время я выравниваю свои структуры подкачки, используя определенные атрибуты компилятора (например. gcc __attribute__(aligned)), однако я хочу использовать спецификатор C++11 alignas вместо этого, на Clang++ это не проблема, так как он с радостью принимает выравнивание 4096 в качестве параметра для alignas, однако G++ этого не делает!

Итак, прежде всего, что основное различие между alignas specifier, и gcc __attribute__(aligned), очевидно, оба обеспечивают выравнивание до определенного значения, однако спецификатор alignas в gcc, похоже, имеет предел 128, в то время как атрибут кажется почти безграничным, почему это?

также Почему нельзя передать целое число const спецификатору alignas?

1 ответов


похоже, что из состояния поддержки GCC поддержка выравнивания не полностью поддерживается в gcc 4.7, но это gcc 4.8. alignas также новая функция от 4.8 версия страницы.

С предложение поддержки выравнивания (3.11):

фундаментальное выравнивание представлено выравниванием, меньшим или равным наибольшему выравниванию, поддерживаемому реализация во всех контекстах, которая равна alignof (std::max_align_t) (18.1).

расширенный выравнивания представлен расклад больше alignof (std::max_align_t). Его реализация-определено ли продлен трассы поддерживаются и контексты, в которых они поддерживаются (7.1.6). Тип наличие расширенного требования выравнивания является чрезмерно выровненным типом.

и из того же документа (7.1.6):

если выражение константы вычисляет расширенное выравнивание и реализацию не поддерживает это выравнивание в контексте объявления, программа плохо сформирована

это тоже может быть частью ответа. На данный момент у меня нет доступа к полному стандарту, кто-то должен это подтвердить.

Что касается разницы между __attribute__(aligned) и alignas, Я не думаю, что они семантически разные, но один из них просто компилятор расширение пока другое полно определено стандартом.

чтобы ответить на ваш последний вопрос,alignas определена только для:

alignas ( constant-expression ) 
alignas ( type-id )