Выровненный new
Когда-то я писал на тему аллокации выровненных блоков памяти. Недавно я натолкнулся на небольшое нововведение C++17 в этой области: выровненный new. В заголовке <new> определён тип align_val_t, который позволяет передать оператору new желаемое значение выравнивания.
Например, я могу запросить 4кб страницу:
auto x = new(align_val_t{4096}) char[4096];
Разные версии оператора new можно посмотреть на cppreference.
Более того, в C++17 (наконец-то!) обычный new должен выделять корректно выровненную память, если тип использует alignas. Например, следующий код должен выводить два нуля:
struct alignas(64) Avx_block { union { float s[16]; double d[8]; }; }; int main() { Avx_block block; cout << reinterpret_cast(&block) % alignof(Avx_block); auto p = new Avx_block; cout << reinterpret_cast(p) % alignof(Avx_block); }