Pregunta Es el tamaño de std :: array definido por estándar


En C ++ 11 std::array se define para tener un almacenamiento y un rendimiento contiguos que no es peor que una matriz, pero no puedo decidir si los diversos requisitos del estándar implican que std :: array tiene el mismo tamaño y el mismo diseño de memoria que una matriz normal. Con eso puedes contar sizeof(std::array<int,N>) == sizeof(int)*N o es esa implementación específica?

En particular, ¿está garantizado que funcione de la manera en que lo esperaría?

std::vector< std::array<int, N> > x(M);
typedef (*ArrayPointer)[N];
ArrayPointer y = (ArrayPointer) &x[0][0];
// use y like normal multidimensional array

Funciona en los dos compiladores que probé (GNU e Intel). Además, toda la documentación de terceros que pude encontrar (Me gusta esto), indica que std :: array es igual de eficiente en cuanto a la memoria que una matriz simple, lo que combinado con el requisito contiguo implicaría que debe tener un diseño de memoria idéntico. Sin embargo, no puedo encontrar este requisito en el estándar.


32
2017-09-30 20:29


origen


Respuestas:


Sus casi necesario. Específicamente, §23.3.2.1 / 2 dice:

Una matriz es un agregado (8.5.1) que se puede inicializar con la sintaxis

array<T, N> a = { initializer-list };

dónde initializer-list es una lista separada por comas de hasta N elementos cuyos tipos son convertibles a T.

Como es un agregado, no puede usar ningún tipo de constructor para convertir los datos en la lista de inicializadores al formato correcto. Eso realmente solo deja una posibilidad: lo único que puede almacenar son los valores mismos.

Supongo que haría ser posible para un std::array para almacenar algún tipo de datos auxiliares después de los datos especificados, como la memoria extra establecida en un valor predefinido, por lo que si escribe más allá del final de la matriz, es probable que cambie esos datos. El compilador / tiempo de ejecución verificaría esos valores al apagar, y si había cambiado los valores, informe el comportamiento indefinido de su código.

También es posible que un compilador podría hacer relleno / alineación de manera diferente para un std::array que para una matriz incorporada. Un ejemplo obvio para el cual esto podría ser deseable sería apoyar los requisitos de super alineación, como los datos para usar con las instrucciones de SSE de Intel. Una matriz incorporada hipocresía soporte super-alineación, pero yo pensar la especificación de std::array puede ser apenas lo suficientemente suelto como para permitirlo.

En pocas palabras: sin entrar en preguntas sobre cuántas posibilidades podrían existir, está bastante claro que std::array no necesariamente tiene que seguir la regla sobre la que está preguntando.


25
2017-09-30 20:50