On 27/07/2018 12:45 AM, Johan Engelen wrote:
On Wednesday, 25 July 2018 at 08:11:59 UTC, rikki cattermole wrote:
Standard solution[0].
[0] https://dlang.org/phobos/std_conv.html#.emplace.4
Thanks for pointing to D's placement new. This is bad news for my
devirtualization work; before, I thought D is in a better situation than
C++, but now it seems we may be worse off.
Before I continue the work, I'll have to look closer at this (perhaps
write an article about the situation in D, so more ppl can help and see
what is going on). In short:
C++'s placement new can change the dynamic type of an object, which is
problematic for devirtualization. However, in C++ the pointer passed to
placement new may not be used afterwards (it'd be UB). This means that
the code `A* a = new A(); a->foo(); a->foo();` is guaranteed to call the
same function `A::foo` twice, because if the first call to `foo` would
do a placement new on `a` (e.g. through `this`), the second call would
be UB.
In D, we don't have placement new, great! And now, I learn that the
_standard library_ _does_ have something that looks like placement new,
but without extra guarantees of the spec that C++ has.
For some more info:
https://stackoverflow.com/a/49569305
https://stackoverflow.com/a/48164192
- Johan
Both of those links is related to structs not classes (and original post
is about classes).
Given the content (I could be wrong) but I don't think its related to
our situation in D.
Classes in D are very "heavy" with their explicit vtable. Given that
classes in C++ can act as a value and a reference type, you have to be
pretty careful when comparing them.