使用std :: array <T,N>会导致代码膨胀吗?

fra*_*gio 34 c++ templates overhead c++11 stdarray

我在一些地方看到std::array了在C++中使用C风格数组的建议,声称它是一种更好,更安全的替代方案,没有开销.看到:

标准容器数组[...]没有超出其容纳元素所需的空间开销,[...].换句话说,它非常像没有问题的内置阵列.(C++ 11 FAQ)

但是,据我所知,作为一个模板容器,程序大小来说会有一个开销,因为它会为每个不同的N生成代码.

假设我的程序std::array在N的各个地方使用了几个不同的整数,这会导致代码膨胀吗?它可以忽略不计吗?

我是否应该为非类型模板参数担心这一点?

Tem*_*Rex 46

我不担心.如果你看一下std::array<T, N>它的界面,它非常小,而且大多数成员函数(基本上都是为指针操作提供包装)都是单行的,它们将在发布模式优化级别上由任何体面的编译器完全优化/内联.

此外,您不需要为不使用的内容付费,因为保证不会实例化类模板的未使用的非虚拟成员函数(std::array<T, N>没有virtual成员函数).小标准报价:

14.7.1隐式实例化[temp.inst]

11实现不应隐式实例化函数模板,变量模板,成员模板,非虚拟成员函数,成员类或不需要实例化的类模板的静态数据成员.[...]

还有一些重载的关系运算符==,<它们在语义上等同于std::equalstd::lexicographical_compare.在实践中,这些运算符也应该根据这些算法实现(如果不是,请向您的供应商投诉).

唯一非常小的担心是额外的编译时开销,但应该没有代码大小和运行时开销.

相关但不完全相同:关于C++性能技术报告对内置类型(int,double)的瘦类包装器做了很多细致的基准测试,发现2006编译器技术的开销几乎为零.你可以重复他们的测试,以验证本作std::array<T,N>对比T[N]

  • @MSalters tnx,原则上同意,但没有替代测量(从引用的报告中设置测试非常有启发性,只是为了了解如何进行适当的基准测试):-) (3认同)
  • 很好的答案!对于`std :: array`,我总是和OP一样怀疑.还要感谢这个链接. (2认同)