【问题标题】:Does using std::array<T, N> lead to code bloat? [duplicate]使用 std::array<T, N> 会导致代码膨胀吗? [复制]
【发布时间】:2014-09-20 10:56:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • std::array 中没有太多代码应该全部内联。我看不出它是如何增加可执行文件大小的。
  • 您能否发布一些代码,当您使用std::array 时会产生更大的可执行文件?
  • "It" 不会生成 anything 除了您请求的存储空间,除非您还请求使用它提供的算法/成员。这有点重要; it 提供它们,因此您不必这样做。您当然可以将它用作平面阵列(无论如何它就是这样),尽管我很想知道为什么您会选择重新组装它已经提供给您的所有轮子。随着基于模板的产品的发展,你不使用的东西不会膨胀,所以我迫不及待地想看看 down 端在哪里。
  • 测量,测量,测量。

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


【解决方案1】:

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

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

14.7.1 隐式实例化 [temp.inst]

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

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

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

相关但不完全相同:Technical Report on C++ Performance 对围绕内置类型(intdouble)的瘦类包装器进行了许多仔细的基准测试,发现 2006 年编译器技术的开销几乎为零。您可以重复他们的测试以验证 std::array&lt;T,N&gt;T[N] 的区别

【讨论】:

  • 不错的答案!对于std::array,我一直有同样的疑问。也感谢您的链接。
  • 回复:最后一句,别费心了。我在 1999 年尝试过,甚至 15 年前也没有明显的差异。
  • @MSalters tnx,原则上同意,但无法替代测量(从引用的报告中设置测试非常有指导意义,只是为了了解如何进行适当的基准测试) :-)
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多