2011-10-28 9 views
5

boost::array (o la tr1 o std versión) ofrecen algunas características adicionales agradables sobre una matriz incorporada.¿Es siempre seguro reemplazar una matriz incorporada con una matriz std/tr1/boost ::?

Hasta ahora, nuestra base de código sólo contiene matrices incorporadas, por ejemplo (confeccionadas, pero coincide con el estilo):

WORD m_lastReadFlags[FLAGS_MAX]; 
... 
WORD flagBuffer[FLAGS_MAX]; 
if (getFlags(flagBuffer)) { 
    memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags)); 
    ... 

creo one'll consigue la idea.

Ahora, mi pregunta es, para aquellos lugares en el código, donde cayendo en boost::array tendría sentido (debido a otros cambios realizados), ¿es array un 100% semántico preservando el complemento para el conjunto integrado? (Posibles errores de compilación están bien - cambios de comportamiento sólo se silenciosas son lo que me molesta.)

Es decir, podría ser reescrita por encima de código (por ejemplo) a utilizar:

boost::array<WORD, FLAGS_MAX> m_lastReadFlags; 

y la memcpy (posiblemente adaptado para usar c_array() o data()) y otro acceso similar a un array seguirían siendo los mismos? Sí, por supuesto, también podría reemplazar el búfer local por una matriz y eliminar el memcpy o utilizar std::copy o algo así, pero el objetivo de esta pregunta es sobre la compatibilidad de las matrices integradas y la clase de matriz.


Actualización: Una cosa que me molesta es específicamente los lugares (como en el caso memcpy) donde se utilizan las matrices incorporadas como punteros. ¿Todas las ocurrencias serán detectadas por el compilador /manejado correctamente?

¿Qué pasa con la tarea?

T arr1[N]; // or array<T, N> 
T arr2[N]; // or array<T, N> 
T* p1; 
... 
// Note, not all combinations will compile: 
arr1 = arr2; 
p1 = arr1; 
arr2 = p1; 
... 

Respuesta

5

Sí, eso debe estar bien, ya que la clase array es precisamente un envoltorio para un conjunto automática. Tiene la misma sintaxis de acceso con corchetes, y si necesita acceder al puntero, sabe cómo hacerlo. Incluso puede usar std::copy en todas partes y usar iteradores; es probable que eso se implemente por memcpy de todos modos.

La clase array es de tipo agregado (sin constructores no triviales/destructor/asignación), por lo que puede inicializar con el inicializador agregado tradicional (refuerzo), al igual que un array plano.

Cuestiones relacionadas