2017-02-09 3 views
2

Как можно использовать malloc (или новый, поскольку в большинстве реализаций новый реализован с помощью malloc, не уверен, что стандарт говорит о выравнивании, а новый, кроме данных, должен быть выровнен с наивысшее скалярное выравнивание) с типом, который имеет требование выравнивания, установленное выше, чем максимальное требование к выравниванию в системе (alignof(std::max_align_t))? Так что-то вродеВыравнивание памяти выше максимального выравнивания alignas malloc

alignas(alignof(std::max_align_t) + alignof(int)) struct Something { 
    ... 
}; 
+0

Пусть 'n' обозначить требуемое выравнивание (слишком плохо, вы не упомянули о том, что в этом вопросе, сделал бы легче ответить) , Просто вызовите 'malloc' с' n + sizeof (struct Something) ', затем найдите выравниваемый адрес, начиная с значения, возвращаемого' malloc'. Вы гарантированно найдете такой действительный адрес между '[retVal, retVal + n-1]'. Затем используйте это как базовый адрес для вашей структуры. –

+0

@barakmanos Это умный взломанный лол, нет никакого библиотечного решения для этого? Я думаю, C не должен был беспокоиться об этом, поскольку требования к выравниванию не были выше, чем максимальное скалярное требование. – Curious

+0

Я считаю, что любой поставщик должен предоставить «malloc», который подходит для поддерживаемой платформы (компилятор + базовая архитектура HW). –

ответ

0

Отправка комментария в ответе.

Позвольте ALIGNMENT обозначить требуемое выравнивание.

Тогда можно смело выделить структуру следующим образом:

char* buffer = new char[ALIGNMENT+sizeof(Something)]; 
uintptr_t address = reinterpret_cast<uintptr_t>(buffer); 
uintptr_t aligned_address = address+ALIGNMENT-address%ALIGNMENT; 
Something* something = reinterpret_cast<Something*>(aligned_address); 
Смежные вопросы