Читать книгу Ссылки и указатели в C++: от основ к безопасности и современному коду - - Страница 91
Проверка sizeof, оптимизация и расчёт "реального" размера
ОглавлениеВсегда используйте sizeof для выделения/копирования: malloc(sizeof(T)). Для "реального" суммируйте поля вручную или используйте offsetof для offsets. Оптимизируйте: сортируйте поля по убыванию sizeof минимизирует padding. Для packed: #pragma pack или attribute((packed)) но только когда нужно (сети, файлы), и читайте с memcpy. В modern C++: bit-fields для флагов, std::byte для raw-буферов.
Пример оптимизации и проверки:
#include <iostream>
#include <cstddef> // Для offsetof
struct NonPacked {
char a; int b; char c; // sizeof=12, real=6
};
struct Packed {
int b; char a; char c; // sizeof=8, real=6 (padding 2 в конце)
};
#pragma pack(push, 1) // Tight packing
struct TightPacked {
char a; int b; char c; // sizeof=6, но медленный доступ!
};
#pragma pack(pop)
int main() {
static_assert(sizeof(TightPacked) == 6, "Проверка packed");
std::cout << "sizeof(NonPacked): " << sizeof(NonPacked) << std::endl;
std::cout << "sizeof(Packed): " << sizeof(Packed) << std::endl;
std::cout << "sizeof(TightPacked): " << sizeof(TightPacked) << std::endl;
// Для сериализации: memcpy(buffer, &obj, sizeof(obj)) но с packed!
return 0;
}