Questo non è strettamente correlato al C ++, ma il suo tipo di sistema serve a illustrare bene il problema.
Si supponga:
-
Abbiamo un modello generico
Container<T>
(comestd::vector<T>
) che memorizza un numero non specificato di elementi dello stesso tipoT
sull'heap. Ogni elemento è allocato e deallocato tramite il costruttore e il distruttore diT
. -
Un tipo
M
che memorizzam
elementi sull'heap (quindiM
stesso è un tipo di contenitore). Tuttavia, il valore dim
non è noto al momento della compilazione, quindi non può essere utilizzato come parametro del modello suM
.
Problema:
- Se proviamo a usare un tipo
Container<M>
, l'accesso agli elementi diM
all'interno di questo contenitore richiederebbe due riferimenti ai puntatori, che in generale hanno prestazioni peggiori rispetto a quando tutti gli elementi diM
sono disposti in modo contiguo. / li>
Soluzione non ideale:
- Crea una classe separata
ContainerFixed<T>
che gestisca direttamente la memoria diT
, se si assume cheT
abbia la stessa dimensione in tutto il contenitore.T
dovrebbe anche scambiare informazioni sulla sua memoria con la classe contenente. Tuttavia, se implementiamo un altro tipo di contenitore, dobbiamo ripetere nuovamente questo processo.
Il problema sorge perché la classe contenitore non è consapevole dei requisiti di archiviazione di T
, quindi rimanda l'allocazione a T
stesso; se il contenitore avesse saputo che T
richiede solo un numero di elementi fisso (sebbene non noto in fase di compilazione), allora questo problema avrebbe potuto essere evitato.
Ora mi sembra che se ci fosse un modo per comunicare al contenitore che M
ha una dimensione definita m
(come in M<m>
, che non è legale in C ++), quindi dalla firma del tipo di Container<M<m> >
si può potenzialmente dedurre che uno schema di allocazione più veloce è possibile. (In un certo senso è un po 'come i tipi dipendenti). Cioè, qualsiasi Container1<Container2<m> >
può essere allocata in modo più efficiente come contenitore "appiattito".
Quale sarebbe una soluzione più generale a questo problema? Non penso che questo sia qualcosa che può essere facilmente risolto in C ++ (sentitevi liberi di dimostrare che ho torto), quindi mi piacerebbe sicuramente sentire se questo è qualcosa che gli altri linguaggi possono risolvere in un modo molto più semplice (forse con più sofisticati type systems).