В C ++ 11 у нас теперь есть alignas
ключевое слово, которое можно использовать для определения нового типа, который является просто существующим типом, но с более строгим выравниванием, например, typedef:
typedef char Maximally_Aligned_Char alignas( max_align_t );
Есть ли способ программно, учитывая typename T
определить исходное, «естественное» выравнивание типа? Что-то вроде следующего концептуального natural_alignment_of
type_trait, который будет компилироваться:
size_t natural_char_alignment = natural_alignment_of< Maximally_Aligned_Char >::value;
static_assert( natural_char_alignment == alignof( char ) );
Фон:
Я пишу шаблонный код для работы со всеми скалярными типами. Как правило, с целыми числами, ( sizeof( T ) == alignof( T ) )
верно, но с официальным alignas
поддержка, я не думаю, что могу сделать это предположение больше.
спекуляция:
Возможно что-то вроде std::decay
должно сработать? Тестируя код, я вижу, что G ++ 4.8 предупреждает о «игнорировании атрибутов в аргументе шаблона», что звучит красиво и опасно.
Я, честно говоря, не понимаю, что вы могли бы сделать со своим natural_alignment
черта характера.
Если я определите тип с выравниванием 16, тогда я ожидаю, что все экземпляры этого типа будут иметь выравнивание 16. Вы не можете нарушать этот контракт.
Поскольку вы уже знаете о alignof
тогда почему бы тебе просто не использовать это? Несмотря на то, что теоретически можно предположительно использовать не-силу двух выравниваний, на практике это будет чрезвычайно хрупким, поэтому все, что вам нужно сделать, это взять std::max(sizeof(T), alignof(T))
в качестве основы для ваших расчетов и готово.
Примечание: это может означать, что данные упакованы менее плотно, и вводится заполнение, но почему это должно вас волновать? Вы сделали все возможное в рамках ограничений пользователя.
Других решений пока нет …