我在几个地方看过使用的建议 std::array 超过C++中的C风格数组,声称它是一个更好,更安全的替代方案,没有开销。见:

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

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

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

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

有帮助吗?

解决方案

我不会担心的。如果你看一下 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> vs. T[N]

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top