En realidad no estoy de acuerdo con el "depende". Nunca use la opción 2. Si desea usar una constante de tiempo de traducción, siempre use la opción 1 o std :: array. La única ventaja que enumera, que las matrices dinámicas no pesan nada hasta que se las asigna, es en realidad una desventaja enorme y horrible, y una que debe señalarse con gran énfasis.
Nunca tenga objetos que tengan más de una fase de construcción. Nunca jamás. Esa debe ser una regla comprometida con la memoria a través de un gran tatuaje. Simplemente nunca lo hagas.
Cuando tienes objetos zombies que aún no están del todo vivos, aunque no del todo muertos, la complejidad en la gestión de su vida crece exponencialmente. Debes verificar en cada método si está completamente vivo o si solo pretende estar vivo. La seguridad de excepciones requiere casos especiales en su destructor. En lugar de una simple construcción y destrucción automática, ahora ha agregado requisitos que deben verificarse en N lugares diferentes (# methods + dtor). Y al compilador no le importa si lo comprueba. Y otros ingenieros no tendrán este requisito de transmisión, por lo que pueden ajustar su código de forma insegura, utilizando variables sin verificar. Y ahora todos estos métodos tienen múltiples comportamientos dependiendo del estado del objeto, por lo que cada usuario del objeto necesita saber qué esperar. Zombies arruinará su (codificación) vida.
En su lugar, si tiene dos duraciones naturales diferentes en su programa, use dos objetos diferentes. Pero eso significa que tiene dos estados diferentes en su programa, por lo que debe tener una máquina de estado, con un estado que tiene un solo objeto y otro estado con ambos, separados por un evento asincrónico. Si no hay un evento asíncrono entre los dos puntos, si todos encajan en un ámbito de función, entonces la separación es artificial y usted debería estar haciendo una construcción de fase única.
El único caso en que un tamaño de tiempo de traducción se debe traducir a una asignación dinámica es cuando el tamaño es demasiado grande para la pila. A continuación, se optimiza la memoria y siempre se debe evaluar utilizando herramientas de memoria y creación de perfiles para ver qué es lo mejor. La opción 2 nunca será la mejor (usa un puntero desnudo, así que de nuevo perdemos RAII y cualquier limpieza y administración automática, agregando invariantes y haciendo que el código sea más complejo y fácilmente divisible por otros). Vector (como lo sugiere la máscara de bits) sería la primera idea apropiada, aunque es posible que no le gusten los costos de asignación del montón a tiempo. Otras opciones pueden ser espacio estático en la imagen de su aplicación. Pero, una vez más, esto solo debe considerarse una vez que haya determinado que tiene una restricción de memoria y qué hacer desde allí debe estar determinado por las necesidades medibles reales.
Sus dos soluciones deben ser: su primera, o una plantilla de vector y ninguna size_t.Debe evitar el uso de punteros sin formato donde se pueda usar un contenedor STL sin ningún problema. – mfontanini
@fontanini: si tuviera que modificar para C++ 11, entonces las dos soluciones deberían ser 'std :: array' o 'std :: vector '. –
@ DavidRodríguez-dribeas sí señor! – mfontanini