使用std :: array <t,n =“”>会导致代码膨胀吗?</t,>

时间:2014-07-29 06:01:42

标签: c++ templates c++11 overhead stdarray

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

  

标准容器数组[...]没有空间开销   它需要保持其元素,[...]。换句话说,它非常多   像没有问题的内置数组。 (C++11 FAQ

但是,正如我所理解的那样,作为一个模板容器,作为程序大小的开销,因为它将为每个不同的N生成代码,一个数组被实例化。

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

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

1 个答案:

答案 0 :(得分:46)

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

此外, you don't pay for what you don't use ,因为类模板的未使用的非虚拟成员函数(std::array<T, N>没有virtual成员函数)保证不会被实例化。小标准报价:

14.7.1隐式实例化[temp.inst]

  

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

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

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

相关但不完全相同:Technical Report on C++ Performance对内置类型(intdouble)的瘦类包装器做了很多仔细的基准测试,发现2006编译器技术的开销几乎为零。您可以重复测试,以便对std::array<T,N>T[N]

进行验证