Как стать автором
Обновить

Комментарии 7

можно добавить, что упаковка структур скажется на производительности

Причем может сказаться в любую сторону.

Запись в файл и передача по медленному каналу упакованной структуры будет быстрее. Обращение к упакованным данным в памяти будет замедляться, если они не будут выровнены на границу, соответствующую параметрам железа.

Вроде так. Если не прав, поправьте.

Тут главная мысль в том, чтобы структура лучше лезла в cache line. Если они будут в линейном массиве, одной операцией можно будет больше данных за раз тянуть, а это сильный буст к производительности на длинной прямой.

Но в рамках одной конкретной структуры да, можно очень даже легко потерять в производительности

Стандарт C++ требует, чтобы каждый элемент структуры был выровнен в памяти согласно своим требованиям

вроде Стандарт С/C++ требует чтобы программист не делал предположений о способе размещения полей структуры в памяти компилятором. Как ни странно следующее предложение как раз согласуется с этим требованием:

Это значит, что компилятор может вставлять неявные байты между полями.

memcpy безопасен только если вы уверены, что ... выравнивание не нарушено

Неверно. memcpy, а также std::bitcast будет все равно на выравнивание. Если точно известно что выравнивание подходит, то можно использова assume_aligned, чтобы убрать возможный оверхед на невыровненное чтение

Проблема кросс-платформенного layout’а

С таким ручным layout вы легко можете нарваться на операцию чтения/записи по невыровненному адресу. А если вы ешё руками начнёте делать reinterpret_cast, то проблемы type punning, strict aliasing, ...

Хорошо что вы про std::bitcast упомянули, но статья была бы намного интереснее, если рассказали про std::launder, std::start_lifetime_as, etc. Иначе тема не раскрыта.

На большинстве платформ x86_64 размер этой структуры будет:

static_assert(sizeof(Naive) == 32);

Неа, на большинстве платформ размер этой структуры будет 20 байт. С чего ему быть равным 32 байтам? Уж не знаю, как вы писали/генерировали эту статью, но лучше бы проверять написанное. Ну и естественно размер следующей структуры (с переупорядоченными полями) не будет равен 24

Зарегистрируйтесь на Хабре, чтобы оставить комментарий