是否使用std::array<T, N=""> 导致代码膨胀?[复制]
题
我在几个地方看过使用的建议 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::equal
和 std::lexicographical_compare
.在实践中,这些运营商也应该在这些算法方面实现(如果他们不这样做,请向您的供应商投诉)。
唯一非常小的担心是一点额外的编译时开销,但应该有零代码大小和运行时开销。
相关但不相同:该 C++性能技术报告 在围绕内建类型的瘦类包装上做了很多仔细的基准测试(int
, double
),发现2006年编译器技术的开销接近零。你可以重复他们的测试来验证这一点。 std::array<T,N>
vs. T[N]