+2
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
struct A {
virtual int transmogrify();
};
struct B : A {
int transmogrify() override { new(this) A; return 2; }
};
int A::transmogrify() { new(this) B; return 1; }
static_assert(sizeof(B) == sizeof(A));
int main() {
A i;
int n = i.transmogrify();
// int m = i.transmogrify(); // undefined behavior
int m = std::launder(&i)->transmogrify(); // OK
assert(m + n == 3);
}
Yo dawg, we heard you like kostyli, so we put our kostyli into your kostyli, so that you can use kostyli to support our kostyli!
https://en.cppreference.com/w/cpp/utility/launder
А если серьезно, мне еще не удалось соорудить пример, чтоб код с std::launder и без него работали по разному.
Запостил: Elvenfighter,
24 Сентября 2018
Elvenfighter 24.09.2018 12:02 # +2
http://govnokod.ru/11417
roman-kashitsyn 24.09.2018 12:11 # +3
Чисти указатель, животное
gost 24.09.2018 12:29 # +1
Elvenfighter 24.09.2018 12:30 # +2
roman-kashitsyn 24.09.2018 12:42 # +2
Elvenfighter 24.09.2018 13:50 # +3
guest8 24.09.2018 13:54 # −999
Elvenfighter 24.09.2018 14:08 # +3
Внутри std::launder находится компиляторо-специфический костыль, который можно назвать "optimization barrier", который сигнализирует компилятору "смотри, жывотное, что под указателем, а не в свои сраные кеши". Где-то читал, что в GCC std::launder был реализован просто:
Но потом хлопцы из LLVM/Clang подсуетились и показали who is who, продемонстрировав пример, когда гнутая реализация делала ересь.
guest8 24.09.2018 14:19 # −999
Elvenfighter 24.09.2018 14:33 # +2
Во втором случае комитет вероятно пошел еще дальше, и сказал "А что если компилятор закеширует целую структуру под указателем? Ведь мы итак знаем, что итак X::n у нас const и читать его после замены без std::launder -- UB." И дальше все так же как и в предыдущем пункте.
guest8 24.09.2018 14:44 # −999
Elvenfighter 24.09.2018 15:35 # +2
guest8 24.09.2018 13:59 # −999
Elvenfighter 24.09.2018 14:11 # +2
OBEH 24.09.2018 21:48 # +1
Elvenfighter 24.09.2018 22:39 # +1
gost 25.09.2018 01:57 # +1
http://sandbox.onlinephpfunctions.com/code/b7e8dd12f4d3914031e4784fd6768b1f452f3c41
Elvenfighter 25.09.2018 16:11 # +2
gost 25.09.2018 16:41 # +1