Читать книгу Ссылки и указатели в 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;


}

Ссылки и указатели в C++: от основ к безопасности и современному коду

Подняться наверх