Читать книгу Ссылки и указатели в 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 для буферов.