Alignas specifier vs __attribute __ (aligned), С++ 11

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

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

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

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

Ответ 1

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

Кроме того, из предложения поддержки выравнивания (3.11):

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

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

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

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

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

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

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

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