我在一些地方看到了在C ++中使用std::array
而不是C风格数组的建议,声称它是一种更好,更安全的替代方案,没有开销。参见:
标准容器数组[...]没有空间开销 它需要保持其元素,[...]。换句话说,它非常多 像没有问题的内置数组。 (C++11 FAQ)
但是,正如我所理解的那样,作为一个模板容器,将作为程序大小的开销,因为它将为每个不同的N生成代码,一个数组被实例化。
假设我的程序在N的几个不同整数的不同位置使用std::array
,这会导致代码膨胀吗?它可以忽略不计吗?
我是否应该为非类型模板参数担心这一点?
答案 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::equal
和std::lexicographical_compare
。在实践中,这些运营商也应该根据这些算法实施(如果他们不这样做,请向您的供应商投诉)。
唯一非常小的担心是额外的编译时开销,但应该没有代码大小和运行时开销。
相关但不完全相同:Technical Report on C++ Performance对内置类型(int
,double
)的瘦类包装器做了很多仔细的基准测试,发现2006编译器技术的开销几乎为零。您可以重复测试,以便对std::array<T,N>
与T[N]