Как определить выравнивание объекта - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть ранее выделенный кусок памяти, который я хочу интерпретировать на месте как struct.Как я могу определить адрес памяти в блоке, который имеет самое дружелюбное выравнивание для struct?

Просто нужно знать механизм для определения того, какая граница байта для данного struct будет работать лучше всего, в основном.

// psuedo-code

struct Object{
    int    theseMembersCould;
    double beAnything;
    char   itsJustData[69];
}

// a chunk of previously allocated memory that I want to use
std::vector<uint8> block;
block.resize(1024);

uint32 byteBoundary = ????;  // <-- this is what I want to discover

// math to get the nearest addr on the boundary (assumes byteBoundary will be POW2)
uint32 alignmentOffset= (byteBoundary - (block.data() & byteBoundary-1u)) & byteBoundary-1u;

Object * obj = new (block.data() + alignmentOffset) Object;
obj->itsJustData = "used as if it were a normal object beyond this point";

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Оператор alignof сообщит вам выравнивание, требуемое для типа.Например, const auto byteBoundary = alignof(Object);.

Попробуйте использовать std::aligned_storage, если вам нужно создать выровненную необработанную память.Вам также нужно будет использовать размещение new, чтобы правильно быть временем жизни Object, который вы пытаетесь использовать block как.

0 голосов
/ 28 декабря 2018

Во-первых, вы попытались использовать reinterpret_cast неверно, так как это ведет к неопределенному поведению из-за строгого нарушения правил наложения имен.Вместо этого вы должны использовать размещение new.

Чтобы правильно выровнять свою структуру, вы можете использовать std::align вместе с std::alignof.

...