Результат размещения нового всегда кажется таким же, как указатель памяти, который я предоставляю для размещения нового.С GCC это, кажется, справедливо даже для классов с виртуальными функциями, например ...
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
int a;
virtual ~A() {}
};
int main()
{
void *mem = malloc(sizeof(A));
A* ptr = new(mem) A();
cout << "sizeof(T) = " << sizeof(A) << endl;
cout << "mem = " << mem << endl;
cout << "ptr = " << ptr << endl;
cout << "addr a = " << &(ptr->a) << endl;
ptr->~A();
free(mem);
return 0;
}
Вывод этой программы (примечание: 64-разрядная версия Linux) ...
sizeof(T) = 16
mem = 0x1a41010
ptr = 0x1a41010
addr a = 0x1a41018
Гарантирует ли C ++, что mem и ptr идентичны или это просто совпадение GCC?В более крупной портативной программе мне придется сохранять как mem, так и ptr, или я могу просто сохранить один из них и привести его при необходимости?
Чтобы немного прояснить вопрос, я знаю, что распределители памяти иногда помещаютразмер выделенного блока в слове перед указанным блоком памяти.Разрешено ли компиляторам C ++ использовать такие приемы и, скажем, поместить указатель VMT в слове перед блоком памяти, на который указывает указатель объекта?В этом случае mem и ptr будут другими.