Комментарии 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
16 байт вместо 32: управляем layout'ом в C++