35

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

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

但是,据我了解,作为模板容器,就程序大小而言,会有开销,因为它将为每个不同的 N 生成代码,数组实例化。

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

我应该担心一般的非类型模板参数吗?

4

1 回答 1

46

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

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

14.7.1 隐式实例化 [temp.inst]

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

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

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

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

于 2014-07-29T06:07:32.273 回答