Действительно в каком смысле? Это C++, используя методы C-like, которые imho прекрасны, пока требования к проекту не оставляют другого выбора. Если вы спрашиваете, будет ли он работать, то до тех пор, пока проблемы с выравниванием данных не приведут к краху кода (т. Е. Не x86, например, SPARC и т. Д.). C++ ведет себя так же, как C при обращении к памяти.
Я проверил его, используя следующие модификации под GCC и VS, и она работает:
struct Elem
{
Elem() : x(0), t(0) { memset(c, 0, sizeof(c));}
Elem(int v) : x(v), t(0) { memset(c, 0, sizeof(c));}
Elem(const Elem &e) { *this = e; }
Elem &operator=(const Elem &e)
{
if (this != &e)
{
memcpy(c, e.c, sizeof(c));
x = e.x;
t = e.t;
}
return *this;
}
char c[21];
int x;
char t;
};
struct Str
{
Str(int c) : count(c) {}
size_t count;
Elem* data() { return (Elem*)(this + 1); }
};
int count = 11;
Str *str = (Str*)new char[sizeof(Str) + sizeof(Elem) * count];
new (str) Str(count);
for (int i = 0; i < count; ++i)
{
new (str->data() + i) Elem();
str->data()[i] = Elem(i+1);
}
for (int i=0; i<str->count; i++)
cout << "[" << i << "]: " << str->data()[i].x << endl;
Кроме того, я добавил различные различные элементы размера, чтобы Str и Elem, чтобы заставить другую прокладку и играл с выравниваниями (VS/некоторое GCC: #pragma pack (...), GCC: __ attribute__ ((aligned (...))) и, __ атрибут __ (упакован)).
Пожалуйста, обратите внимание, что игра с выравниваниями не является безопасным на все архитектуры - Relevant question
Я думаю, что это не будет работать, если 'Elem' имеет различное выравнивание, чем' Str'. – Henrik
Это легко исправлено: 'union {size_t count, Elem dummy; } ' – MSalters
Если вы хотите быть действительно фантастическим, используйте метапрограммирование шаблонов, чтобы сделать' dummy' меньшим из 'Elem' и' std :: max_align_t'. – MSalters