спецификатор 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 )