valido in che senso? È C++ che usa tecniche simili a C che imho va bene finché i requisiti del progetto non lasciano altra scelta. Se stai chiedendo se funzionerà, funzionerà finché i problemi di allineamento dei dati non causeranno il crash del codice (ad esempio non x86 come SPARC, ecc.). C++ si comporta molto come C quando si indirizza la memoria.
ho testato utilizzando le seguenti modifiche sotto gcc e VS e funziona:
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;
Inoltre, ho aggiunto vari membri di dimensioni diverse per Str e Elem forzare imbottitura diversa e suonato con allineamenti (VS/some GCC: #pragma pack (...), GCC: __ attribute__ ((align (...))) e, __ attribute __ (packed)).
Si prega di notare che giocare con allineamenti non è sicuro su tutte le architetture - Relevant question
credo che questo non funzionerà se 'Elem' ha allineamento diverso da' Str'. – Henrik
Questo è facilmente risolto: 'union {size_t count, Elem dummy; } ' – MSalters
Se vuoi essere davvero fantasioso, usa la metaprogrammazione del modello per rendere' dummy' il più piccolo di 'Elem' e' std :: max_align_t'. – MSalters