Читать книгу Ссылки и указатели в C++: от основ к безопасности и современному коду - - Страница 75

Оптимизация с alignof, alignas и умным дизайном

Оглавление

Используйте alignof для проверок: в static_assert или runtime. Оптимизируйте структуры: размещайте поля по убыванию размера/выравнивания минимизирует padding. Для принудительного выравнивания alignas(N) (C++11+): alignas(16) int x; x кратен 16 (для SIMD). Для структур: alignas на поля или всю struct.

Пример оптимизации:

#include <iostream>


struct NonOptimized {


char c; // 1 + 3 pad


int i; // 4


// sizeof=8


};


struct Optimized {


int i; // 4


char c; // 1 + 3 pad (но в конце, не влияет на следующие)


// sizeof=8, но в массиве/кэше эффективнее


};


struct OverAligned {


alignas(32) double data[4]; // Для AVX-512


};


int main() {


static_assert(alignof(Optimized) == 4, "Проверка выравнивания");


std::cout << "sizeof(NonOptimized): " << sizeof(NonOptimized) << std::endl;


std::cout << "sizeof(Optimized): " << sizeof(Optimized) << std::endl;


std::cout << "alignof(OverAligned): " << alignof(OverAligned) << std::endl; // 32


return 0;


}


Для динамической памяти: std::aligned_alloc (C++17) или custom allocators. В шаблонах: std::aligned_storage для буферов.

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

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