2012-03-18 4 views
8

¿Están garantizados los datos en std::array<std::array<T,N>, M> contiguos? Por ejemplo:¿Se garantiza que los datos en std :: matrices anidados son contiguos?

#include <array> 
#include <cassert> 

int main() 
{ 
    enum {M=4, N=7}; 
    typedef std::array<char,N> Row; 
    typedef std::array<Row, M> Matrix; 
    Matrix a; 
    a[1][0] = 42; 
    const char* data = a[0].data(); 

    /* 8th element of 1D data array should be the same as 
     1st element of second row. */ 
    assert(data[7] == 42); 
} 

¿Se garantiza que la afirmación tendrá éxito? O, para decirlo de otra manera, ¿puedo confiar en que no haya relleno al final de un ?

EDIT: Para que quede claro, para este ejemplo, quiero que los datos de la matriz de toda a ser contiguas.

+0

Incluso si el almacenamiento es contiguo, creo que no cumpliría las reglas de aliasing. Vea esta pregunta que hice hace muchas lunas (sobre C, ciertamente): http://stackoverflow.com/questions/6290956/one-dimensional-access-to-a-multidimensional-array-well-defined-c. –

+0

posible duplicado de [¿Es la memoria en std :: array contiguo?] (Http://stackoverflow.com/questions/6632915/is-the-memory-in-stdarray-contiguous) por recursión –

+2

@LightnessRacesinOrbit: No, I no creo que sea un duplicado Si bien los datos en un único 'std :: array' son contiguos, eso no implica que todo el conjunto de datos en' std :: array's anidados sea contiguo. O al menos no es obvio para un abogado que no sea de idiomas como yo. –

Respuesta

10

No, la contigüidad no está garantizada en este caso.

std::array se garantiza que es un agregado, y se especifica de tal manera que la matriz subyacente utilizada para el almacenamiento debe ser el primer miembro de datos del tipo.

Sin embargo, no hay ningún requisito de que sizeof(array<T, N>) == sizeof(T) * N, ni ningún requisito de que no haya bytes de relleno sin nombre al final del objeto o que std::array no tenga más miembros de datos que el almacenamiento de matriz subyacente. (Sin embargo, una implementación que incluyera miembros de datos adicionales sería, en el mejor de los casos, inusual).

5

Es muy probable que sean contiguos. Si no lo son, el compilador está luchando activamente contigo allí. No hay garantía de que no va a insertar relleno, pero apenas hay una razón para ello.

¿Está garantizado el éxito?

data[7] es un acceso fuera de límites (comportamiento indefinido). El objeto de la matriz interna solo tiene siete elementos, por lo que el índice 7 no es válido.

+0

Hmm, tu respuesta parece un poco contradictoria (o soy demasiado densa). Si los datos son contiguos, ¿los datos [7] 'no apuntan al primer elemento de la segunda fila? –

+0

@Emile la falla al pensar que "el 8 ° elemento de la matriz de datos 1D debería ser el mismo que el 1er elemento de la segunda fila". está ignorando que ninguna matriz en ese código tiene un 8º elemento. No hay garantía de qué 'data [7]' hará por eso.En la práctica, sí, sospecho que señalará el primer elemento de la segunda fila, pero como siempre sucede con UB, * no se puede confiar en ello con seguridad *. –

+0

Ok, entonces tomo "* muy probablemente contiguo *" para indicar que los datos en ** cada matriz interna ** son contiguos. ¿Es esto lo que querías decir? –

Cuestiones relacionadas