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

Does using std::array<T, N> lead to code bloat?

本文关键字:代码 膨胀 array std lt 使用 gt      更新时间:2023-10-16

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

标准容器数组[…没有额外的空间开销它需要保存它的元素,[…]。换句话说,它是非常就像没有问题的内置数组。(c++ 11 FAQ)

然而,据我所知,作为模板容器,作为程序大小的开销,因为它将为每个实例化数组的不同N生成代码。

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

对于一般的非类型模板参数,我应该担心这个问题吗?

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

此外,您不必为不使用付出代价,因为类模板的未使用的非虚成员函数(std::array<T, N>没有virtual成员函数)保证不会被实例化。标准报价:

14.7.1隐式实例化[temp.inst]

实现不应该隐式地实例化函数模板、变量模板、成员模板、非虚成员函数、成员类或类模板的静态数据成员这并不需要实例化。[…]

还有一些重载关系操作符==<,它们在语义上等同于std::equalstd::lexicographical_compare。在实践中,这些操作符也应该按照这些算法来实现(如果他们不这样做,请向供应商投诉)。

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

相关但不完全相同: c++性能技术报告对内置类型(int, double)周围的瘦类包装器进行了大量仔细的基准测试,发现2006编译器技术的开销接近于零。您可以重复他们的测试来验证std::array<T,N>T[N]