É o tamanho de std :: array definido por padrão

Em C ++ 11 std::array é definido para ter armazenamento contíguo e desempenho que não é pior do que uma matriz, mas eu não posso decidir se os vários requisitos da norma implicam que std :: array tem o mesmo tamanho e memory layout como uma matriz normal. Isto é, você pode contar com sizeof(std::array) == sizeof(int)*N ou essa implementação é específica?

Em particular, isso é garantido para funcionar da maneira que você espera:

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

Ele funciona nos dois compiladores que eu tentei (GNU e Intel). Além disso, toda a documentação de terceiros que eu pude encontrar ( como este ), afirma que o std :: array é tão eficiente quanto uma memory como um array simples, que combinado com o requisito contíguo implicaria que ele deve ter layout de memory idêntico. No entanto, não consigo encontrar esse requisito no padrão.

É quase obrigatório. Especificamente, §23.3.2.1 / 2 diz:

Uma matriz é um agregado (8.5.1) que pode ser inicializado com a syntax

 array a = { initializer-list }; 

onde initializer-list é uma lista separada por vírgulas de até N elementos cujos tipos são conversíveis em T.

Como é um agregado, ele não pode usar nenhum tipo de construtor para converter os dados na lista de inicializadores para o formato correto. Isso realmente deixa apenas uma possibilidade: a única coisa que pode armazenar são os próprios valores.

Eu suponho que seria possível para um std::array armazenar algum tipo de dados auxiliares seguindo os dados especificados, como memory extra definida para algum valor predefinido, então se você escrever além do final do array, você provavelmente mudaria esses dados. O compilador / tempo de execução verificaria esses valores no encerramento e, se você alterasse os valores, relataria o comportamento indefinido do seu código.

Também é possível que um compilador possa fazer preenchimento / alinhamento diferentemente para um std::array que para um array interno. Um exemplo óbvio para o qual isso poderia ser desejável seria oferecer suporte a requisitos de superalinhamento, como dados para uso com instruções SSE da Intel. Um array embutido não suporta superalinhamento, mas acho que a especificação do std::array pode ser pouco solta o suficiente para permitir isso.

Resumindo: sem entrar em questões de quantas possibilidades podem existir, está bem claro que o std::array não necessariamente tem que seguir a regra que você está perguntando.