2015-11-11 2 views
8

В C есть ли способ переустановить (т. Е. Больше выравнивания, чем можно вывести из системы типов) в стеке?Эквивалент std :: aligned_storage <> в C?

Для переменных в динамически распределенной памяти мы всегда можем выровнять вручную, если все остальное не удается, но что можно сделать для переменных в автоматически распределенной памяти?

Я предполагаю, что можно использовать char[size + alignment - 1], а затем всегда использовать манипуляции с битами для доступа к переменной, но это кажется «бит» более темным, чем необходимо (har har har;)).

+0

Вы попробовали спецификатор _Alignas? – this

+0

@that oops, я должен был упомянуть, нет C11, спасибо – Praxeolitic

+0

Почему вы приняли другой ответ, если C11 не был вариантом? :-( – this

ответ

5

В C2011, есть _Alignas и _Alignof ключевые слова, заголовок <stdalign.h>, что делает их использование немного менее некрасиво, и тип max_align_t (который находится в <stddef.h>). Можно, например, написать

double _Alignas(4*_Alignof(double)) dvector[16]; 

запросить массив из 16 double величин, выровненных в 4 раз обычного выравнивания для double, которые могут потребоваться для использования с CPU конкретных инструкций векторными. Это не гарантируется для работы во всех реализациях, но если он не работает, гарантированно будет ошибка времени компиляции.

До C2011 не было стандарта , но многие компиляторы имели расширения с аналогичной функциональностью, например. Конструкция GCC __attribute__ (aligned).

5

Хорошо союзы приходят на ум.

union This 
{ 
    int integer; 
    align_type alignment; 
} ; 

В профсоюзах нет прокладок. Поэтому, если вы объявляете автоматическую переменную union This, то она и все ее элементы должны быть выровнены так же, как выравнивание элемента с самым высоким выравниванием.

Смежные вопросы