Tag Archives: new

Выровненный 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);
}