使用 std::array<T, N> 会导致代码膨胀吗?
Does using std::array<T, N> lead to code bloat?
我在一些地方看到了在c++中使用std::array
而不是C风格数组的建议,声称这是一种更好,更安全的替代方案,没有开销。看到:
标准容器数组[…没有额外的空间开销它需要保存它的元素,[…]。换句话说,它是非常就像没有问题的内置数组。(c++ 11 FAQ)
然而,据我所知,作为模板容器,将作为程序大小的开销,因为它将为每个实例化数组的不同N生成代码。
假设我的程序在不同的地方使用std::array
和几个不同的整数N,这会导致臃肿的代码吗?可以忽略不计吗?
我不担心。如果你看一下std::array<T, N>
的接口,它是非常小的,大多数成员函数(基本上为指针操作提供包装器)都是一行程序,将被任何体面的编译器在发布模式优化级别上完全优化/内联。
此外,您不必为不使用付出代价,因为类模板的未使用的非虚成员函数(std::array<T, N>
没有virtual
成员函数)保证不会被实例化。标准报价:
14.7.1隐式实例化[temp.inst]
实现不应该隐式地实例化函数模板、变量模板、成员模板、非虚成员函数、成员类或类模板的静态数据成员这并不需要实例化。[…]
还有一些重载关系操作符==
和<
,它们在语义上等同于std::equal
和std::lexicographical_compare
。在实践中,这些操作符也应该按照这些算法来实现(如果他们不这样做,请向供应商投诉)。
唯一非常小的担心是额外的编译时开销,但是代码大小和运行时开销应该为零。
相关但不完全相同: c++性能技术报告对内置类型(int
, double
)周围的瘦类包装器进行了大量仔细的基准测试,发现2006编译器技术的开销接近于零。您可以重复他们的测试来验证std::array<T,N>
和T[N]
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 添加虚拟析构函数会使代码大小膨胀
- 考虑到今天的处理器,代码膨胀是否不再重要?
- 模板代码因unordered_map而膨胀
- 不使用模板参数的函数使过多的代码膨胀?
- 了解模板代码膨胀
- 模板中的编译控制和代码膨胀
- 使用GCC/CLANG跟踪代码膨胀的工具
- 使用 std::array<T, N> 会导致代码膨胀吗?