Предположим, у меня есть шаблонная функция, которая работает с указателями на еще неизвестный тип T
, Теперь, если тип T
бывает void*
на 64-битной платформе он должен быть выровнен на 8 байтов, но если T
бывает char
он должен быть выровнен на 1 байт, и если T
Если это класс, то его требования к выравниванию будут зависеть от переменных-членов.
Все это может быть вычислено на бумаге, но как заставить компилятор выдавать требования выравнивания для данного типа T
?
Есть ли способ найти во время компиляции требования выравнивания для данного типа?
В C ++ 11 вы можете использовать alignof а также alignas сделать заявления и предоставить требования для выравнивания. Также посмотрите на станд :: Align контролировать выравнивание во время выполнения.
В отсутствие C ++ 11 проще всего использовать следующую степень двойки, большую или равную sizeof(T)
, Вы могли бы также хотеть ограничить это выравниванием самого большого примитива. 8 — довольно безопасная ставка на 64-битную архитектуру (хотя вам может потребоваться следить за такими вещами, как типы данных SSE).