🍿 std::start_lifetime_as vs std::launder: в чём разница?



Оба связаны с pointer provenance и strict aliasing, но решают разные проблемы.


🍴 std::launder — обход оптимизаций

Когда компилятор «знает» значение через const member или reference, он может закешировать его:

struct S { const int x; };
S* p = new (addr) S{42};
p->x; // Компилятор: "всегда 42"

new (p) S{100}; // Переиспользуем память
p->x; // Всё ещё 42? Нет, но компилятор так думает!

auto q = std::launder(p);
q->x; // Правильно: 100

launder заставляет компилятор перечитать значение из памяти, игнорируя предыдущие предположения.


🍬 start_lifetime_as — создание lifetime

Он нужен когда объекта физически нет, но память готова:

alignas(int) char buffer[sizeof(int)];
*reinterpret_cast<int*>(buffer) = 42; // UB: нет объекта

int* p = std::start_lifetime_as<int>(buffer);
*p = 42; // OK: объект создан


🏝 Вывод

launder — для существующих объектов с переписанной памятью. start_lifetime_as — для памяти, которая станет объектом.
Просмотры: 326
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти