LINUX.ORG.RU

История изменений

Исправление KennyMinigun, (текущая версия) :

Не конкретно здесь, а вообще(описание на cppreference глянул, но въехать не получилось)

Как я понял, там скорее всего как с std::atomic — больше указание компилятору нежели реальные действия.

Вот например:

struct X {
  const int n; // note: X has a const member
  int m;
};

  X *p = new X{3, 4};
  const int a = p->n;
  X* np = new (p) X{5, 6};
  const int b = p->n; // undefined behavior 

Вот тут компилтор может загрузить значение p->n до того, как будет прозиведено placement-new. В результате b может быть 3 вместо ожидаемого 4.

std::launder(p) — ставит «барьер» и заставляет компилятор реально посмореть что же находится под p.

Т.е. с каждым поколением С++ оптимализатор становится все злее и агрессивнее.

Исходная версия KennyMinigun, :

Не конкретно здесь, а вообще(описание на cppreference глянул, но въехать не получилось)

Как я понял, там скорее всего как с std::atomic — больше указание компилятору нежели реальные действия.

Вот например:

struct X {
  const int n; // note: X has a const member
  int m;
};

  X *p = new X{3, 4};
  const int a = p->n;
  X* np = new (p) X{5, 6};
  const int b = p->n; // undefined behavior 

Вот тут компилтор может загрузить значение p->n до того, как будет прозиведено placement-new. В результате b может быть 3 вместо ожидаемого 4.

std::launder(p) — ставит «барьер» и заставляет компилятор реально посмореть что же находится под p.