Как проверить правильность выравнивания типизированного указателя для этого типа?

Предположим, у меня есть шаблонная функция, которая работает с указателями на еще неизвестный тип T. Теперь, если тип T оказывается void* на 64-битной платформе, то он должен быть выровнен по 8 байтам, но если T оказывается char, он должен быть выровнен по 1 байту, и если T оказывается классом, то его требования к выравниванию будут зависеть на его переменных-членах.

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

Есть ли способ найти во время компиляции требования к выравниванию для данного типа?


person sharptooth    schedule 06.11.2012    source источник
comment
компилятор автоматически делает это! чего вы пытаетесь добиться этим?   -  person BigBoss    schedule 06.11.2012
comment
В C++11 есть ключевое слово alignof.   -  person avakar    schedule 06.11.2012
comment
@BigBoss: я использую собственный распределитель и хочу быть уверенным, что он всегда возвращает правильно выровненные указатели.   -  person sharptooth    schedule 06.11.2012
comment
Хорошо, тогда вы можете использовать alignof из C++11 или вы можете выровнять размер по double, это не стандартно, но работает для всех известных мне компиляторов!   -  person BigBoss    schedule 06.11.2012


Ответы (2)


В C++11 вы можете использовать alignof и alignas для утверждения и предоставления требований для выравнивания. Также просмотрите std::align, чтобы контролировать выравнивание во время выполнения.

person Eugene Mamin    schedule 06.11.2012

В отсутствие C++11 проще всего использовать следующую степень двойки, большую или равную sizeof(T). Вы также можете захотеть ограничить его выравниванием самого большого примитива. 8 — довольно безопасная ставка на 64-битную архитектуру (хотя вам, возможно, придется следить за такими вещами, как типы данных SSE).

person Marcelo Cantos    schedule 06.11.2012