In realtà non sono d'accordo con "dipende". Non utilizzare mai l'opzione 2. Se si desidera utilizzare una costante di traduzione, utilizzare sempre l'opzione 1 o std :: array. L'unico vantaggio che hai elencato, che gli array dinamici non pesano nulla fino a quando sono assegnati, è in realtà un orribile, enorme svantaggio, e uno che deve essere sottolineato con grande enfasi.
Non disporre mai di oggetti con più di una fase di costruzione. Mai e poi mai. Questa dovrebbe essere una regola dedicata alla memoria attraverso qualche grande tatuaggio. Non farlo mai.
Quando si hanno oggetti zombi che non sono ancora abbastanza vivi, anche se non del tutto morti, la complessità nella gestione della loro vita cresce esponenzialmente. Devi controllare in ogni metodo se è completamente vivo, o solo fingere di essere vivo. La sicurezza delle eccezioni richiede casi speciali nel distruttore. Invece di una semplice costruzione e distruzione automatica, ora hai aggiunto i requisiti che devono essere controllati in N posti diversi (# metodi + dtor). E al compilatore non interessa se controlli. E gli altri ingegneri non avranno questo requisito trasmesso, quindi possono regolare il codice in modi non sicuri, usando variabili senza controllo. E ora tutti questi metodi hanno comportamenti multipli a seconda dello stato dell'oggetto, quindi ogni utente dell'oggetto ha bisogno di sapere cosa aspettarsi. Gli zombi rovineranno la tua vita (codifica) .
Invece, se si hanno due diverse durate naturali nel programma, utilizzare due oggetti diversi. Ma ciò significa che hai due stati diversi nel tuo programma, quindi dovresti avere una macchina a stati, con uno stato che ha un solo oggetto e un altro stato con entrambi, separati da un evento asincrono. Se non vi è alcun evento asincrono tra i due punti, se tutti rientrano in un ambito di funzione, allora la separazione è artificiale e si dovrebbe fare la costruzione monofase.
L'unico caso in cui una dimensione del tempo di traduzione deve essere convertita in un'allocazione dinamica è quando la dimensione è troppo grande per lo stack. Questo arriva all'ottimizzazione della memoria, e dovrebbe sempre essere valutato usando strumenti di memoria e di profilazione per vedere cosa è meglio. L'opzione 2 non sarà mai la migliore (usa un puntatore nudo - quindi di nuovo perdiamo RAII e qualsiasi pulizia e gestione automatica, aggiungendo invarianti e rendendo il codice più complesso e facilmente infrangibile da altri). Vector (come suggerito da bitmask) sarebbe il primo pensiero appropriato, anche se potrebbe non piacervi i costi di allocazione dell'heap nel tempo. Altre opzioni potrebbero essere spazio statico nell'immagine dell'applicazione. Ma ancora una volta, questi dovrebbero essere considerati solo dopo aver determinato che si dispone di un vincolo di memoria e cosa fare da lì dovrebbe essere determinato da reali esigenze misurabili.
Le tue due soluzioni dovrebbero essere: il tuo primo modello, o un vettore e nessun modello size_t.Evitare l'uso di puntatori grezzi in cui un contenitore STL può essere utilizzato senza problemi. – mfontanini
@fontanini: Se si dovesse modificare per C++ 11, le due soluzioni dovrebbero essere 'std :: array' o 'std :: vector '. –
@ DavidRodríguez-dribeas si signore! – mfontanini