В процессе копания темы передачи C++ объектов через разделяемую память возникли подозрения, что где-то мы с placement new работаем не корректно. Пришлось погрузиться в изучение std::launder.
Все, что связано с std::launder для меня какая-то мутная тема, с которой никогда толком не связывался. А тут пришлось. И выяснилось, что толковой информации не так, чтобы много.
Поэтому решил зафиксировать несколько полезных ссылок дабы их затем проще было найти. Может быть еще кому-то эта информация будет полезна. Итак, вот что толкового пока удалось нарыть:
- Objects, Their Lifetimes And Pointers (резервная ссылка на web.archive, если основная не открывается). В общем-то, это основной и наиболее исчерпывающий материал. Но, если после его изучения просветление не наступило, то тогда могут помочь остальные ссылки;
- ответ на Stackoverflow What is the purpose of std::launder?;
- еще один ответ на Stackoverflow std::launder use cases in C++20;
- небольшой блог-пост с прикольным примером внутри: std::launder: the most obscure new feature of C++17;
- пропозал от Джосаттиса: On launder() (статус этого пропозала мне не ведом, как и его влияние на то, что приняли в C++20 и примут в последующих стандартах).
Если нарою что-то еще, то дополню список.
Очень часто несведующие, а то и просто праздо шатающие по ОйТи люди, интересуются, а с чегой-то C++ такой сложный.
А с тогой-то, что C++ применяют люди, которых жизнь заставляет писать что-то подобное:
void *operator new(size_t, void *p) { return p; }
struct A {
virtual int f();
};
struct B : A {
virtual int f() { new (this) A; return 1; }
};
int A::f() { new (this) B; return 2; }
int h() {
A a;
int n = a.f();
int m = std::launder(&a)->f();
return n + m;
}
Не буду вдаваться в обсуждение того, хорошо ли это или же мы тут имеем дело с лютым говнокодом. Но раз кому-то потребовалось, то язык это должен поддержать, что и сказывается на сложности этого самого языка. Как говорится, не мы такие, жизнь такая...
Комментариев нет:
Отправить комментарий