在C++ 11 std::array中定义的连续存储和性能并不比数组差,但我不能确定标准的各种要求是否意味着std :: array具有与普通数据相同的大小和内存布局阵列.那是你可以指望的sizeof(std::array<int,N>) == sizeof(int)*N还是具体的实施?
特别是,这保证按照您期望的方式工作:
std::vector< std::array<int, N> > x(M);
typedef (*ArrayPointer)[N];
ArrayPointer y = (ArrayPointer) &x[0][0];
// use y like normal multidimensional array
Run Code Online (Sandbox Code Playgroud)
它适用于我尝试过的两个编译器(GNU和Intel).此外,我能找到的所有第三方文档(如下所示)都表明std :: array与普通数组一样具有内存效率,它与连续需求相结合意味着它必须具有相同的内存布局.但是我在标准中找不到这个要求.
我的嵌入式系统有一个支持C++ 11的g ++版本,所以我一直在清理代码
for( uint16_t* p = array; p < (&array)[1]; ++p ) {
*p = fill_value;
}
Run Code Online (Sandbox Code Playgroud)
至
for( uint16_t& r : array ) {
r = fill_value;
}
Run Code Online (Sandbox Code Playgroud)
这是多更具有可读性.
是否存在基于范围的for循环,它可以在所有元素上运行array2[m][n]?
旧版本是
for( int16_t* p = array2[0]; p < (&array2)[1][0]; ++p ) {
*p = fill_value;
}
Run Code Online (Sandbox Code Playgroud)
我不希望嵌套循环,除非保证编译器将它们展平.
(FWIW,编译器是TI Code Composer Studio 6.0.0附带的GNU 4.7.4 Linaro g ++ ARM交叉编译器)