В C++ 11 введено значение alignas
specifier для указания выравнивания переменной и alignof
operator для запроса выравнивания по умолчанию для типа. Тем не менее, я не вижу никакого способа получить выравнивание определенной переменной. Давайте рассмотрим следующий тривиальный пример:Запросить выравнивание определенной переменной
alignas(16) float* array;
Вот что мы можем сделать по этому поводу:
alignof(float*)
возвращает 8, который, очевидно, не то, что мы хотим.alignof(array)
возвращает 16, что является именно тем, что мы хотим, но это расширение компилятора;alignof
, как указано в стандарте, не может использоваться для определенной переменной.alignof(decltype(array))
возвращает 8, что ожидалось, но не то, что мы хотим.std::alignment_of
реализован в терминахalignof
, поэтому это не очень помогает.
Мне нужен механизм, подтверждающий, что конкретная переменная array
выровнена по границе 16 байт. Есть ли что-нибудь в стандарте для выполнения такого запроса?
* alignof * не нужно указывать, что - он возвращает минимальный контракт в * время компиляции * - вы хотите значение * во время выполнения *. Конкретная переменная может очень хорошо быть выровнена с границей страницы *, мегабайтными границами или что-то еще во время выполнения (т. Е. Намного «лучше», чем обещали или просили). Возьмите адрес переменной и убедитесь, что она делится на нужное значение выравнивания равномерно. – tofro
@tofro Правильно, я забыл указать его, но я вроде как ожидал, что 'alignof' превратится в runtime thingy при использовании в имени переменной (я думаю, это то, что делает расширение компилятора). Я не ожидал, что все будет известно во время компиляции. – Morwenn
Я не могу понять, что-то вроде * # define ALIGNED8 (x) ((& (x) && 0x7) == 0) * не соответствует вашей цели или почему стандарт должен иметь что-то, что дублирует эту простую конструкцию. – tofro