& Quot; natural_alignment_of & Quot; type_trait?

В 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 предупреждает о «игнорировании атрибутов в аргументе шаблона», что звучит красиво и опасно.

-1

Решение

Я, честно говоря, не понимаю, что вы могли бы сделать со своим natural_alignment черта характера.

Если я определите тип с выравниванием 16, тогда я ожидаю, что все экземпляры этого типа будут иметь выравнивание 16. Вы не можете нарушать этот контракт.

Поскольку вы уже знаете о alignofтогда почему бы тебе просто не использовать это? Несмотря на то, что теоретически можно предположительно использовать не-силу двух выравниваний, на практике это будет чрезвычайно хрупким, поэтому все, что вам нужно сделать, это взять std::max(sizeof(T), alignof(T)) в качестве основы для ваших расчетов и готово.

Примечание: это может означать, что данные упакованы менее плотно, и вводится заполнение, но почему это должно вас волновать? Вы сделали все возможное в рамках ограничений пользователя.

1

Другие решения

Других решений пока нет …