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

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

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

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

2

Решение

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

4

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

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

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector