Wie weiß Placement New, welches Layout erstellt werden soll?

#include <iostream>
#include <typeinfo>
struct A { int a; };
struct B : virtual A { int b; };
struct C : virtual A  { int c; };
struct D : B,C { int d; };
int main()
{
  D complete;
  B contiguous;
  B & separate = complete;
  B * p[2] = {&separate, &contiguous};
  // two possible layouts for B: 
  std::cout<< (int)((char*)(void*) &p[0]->a -(char*)(void*)&p[0]->b)<<" "<< sizeof(*p[0])<< "\n";
  std::cout<< (int)((char*)(void*) &p[1]->a -(char*)(void*)&p[1]->b)<<" "<< sizeof(*p[1])<< "\n";

  alignas(B) char buff[sizeof(B)];
  void * storage = static_cast<void*>(buff);
  // new expression skips allocation function:
  auto pointer= new (storage) B;        // Which layout to create?
  std::cout << typeid(pointer).name()<<"\n"; 
  pointer->~B();    // Destructor knows layout through typed pointer.
}
// sample output (Debian 8, amd64):
// 24 16
// 4 16
// P1B

Ist da ein Abschnitt im C ++ 14 Standard das 'neu' sein muss, um ein bestimmtes Layout zu erstellen? Gibt es eine Garantie dafür, dass das von new erstellte Layout in einen Puffer der Größe sizeof (B) und mit dem Offset Null passt?

edit: Könnten Sie bitte eine grep-freundliche Terminologie verwenden oder Referenzen angeben? Ich habe der Frage einen Verweis auf die Norm hinzugefügt.

Berücksichtigen Sie die obige Beispielausgabe: Was sagt Ihnen die Zahl 24? Wie groß ist der Puffer?

Es gibt möglicherweise eine Aussage im Standard, dass ein am häufigsten abgeleitetes Objekt immer eine einfache, zusammenhängende Kopie der Objektdarstellung ist, aber ich habe diese nicht gefunden.

Das, was wir über neu wissen, ist, dass es mit einem vollständigen Objekttyp verwendet werden soll. [expr.new]

Es gibt ein Beispiel für einen neuen Ausdruck mit der Platzierungsoption in [class.dtor] §12.4 (14). Das Beispiel könnte jedoch einfach funktionieren, da die Klasse darin ein Standardlayout ist.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage