Рассмотрим следующий фрагмент кода, создающий экземпляр структуры POD (простые старые данные):
#include <new>
#include <cassert>
#include <cstddef>
struct Test
{
int a;
char b;
double c;
};
int main()
{
const std::size_t minimumNumberOfBytes = sizeof( Test ) * 4;
// Get a block of memory that can accommodate a Test instance and then some!
void* const ptrToMemBlock = new char[ minimumNumberOfBytes ];
assert( ptrToMemBlock );
// Construct a Test instance in-place.
const Test* const testInstance( ::new ( ptrToMemBlock ) Test() );
// Is this assumption guaranteed to be true?
assert( testInstance == ptrToMemBlock );
}
Является ли предположение, представленное окончательным утверждением() гарантированным, всегда правильным? Или можно предположить, что компилятор может решить создать экземпляр Test, скажем, несколько байтов после начала блока памяти, который я указал в новом вызове размещения?
Обратите внимание, что я спрашиваю конкретно о типах POD здесь. Я знаю, что все может получиться, если будет задействовано множественное наследование и прочее.