#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
Есть ли раздел в стандарте C++ 14, который требует «нового» для создания определенного макета? Есть ли гарантия, что макет, созданный новым, помещается в буфер размера sizeof (B) и со смещением нуля?Как новое место размещения определяет, какой макет следует создавать?
Редактировать: Не могли бы вы использовать grep-friendly терминологию или предоставить ссылки? Я добавил ссылку на стандарт на вопрос.
Примите во внимание образец, показанный выше: Что означает номер 24? Каков размер буфера?
В стандарте может быть утверждение, что наиболее производный объект всегда является прямой, непрерывной копией представления объекта, , но я не нашел этого.
Вещь, которую мы знаем о новой, заключается в том, что она должна использоваться с полным типом объекта. [expr.new]
Существует пример для нового выражения с опцией размещения в [class.dtor] §12.4 (14). Однако пример может работать просто потому, что класс в нем является стандартным макетом.
Не должно быть 'k! = 0'? –
@AlexisWilke Если 'k' является' signed int' и отрицательным, что происходит, когда он добавляется в 'size_t'? :) – Kaz
Я не уверен ... Вы говорите мне. Но я думаю, что, наверное, поэтому я говорю, что это должно быть 'k! = 0', а не' k> 0'. Вы написали ответ ... –