fra*_*gio 34 c++ templates overhead c++11 stdarray
我在一些地方看到std::array了在C++中使用C风格数组的建议,声称它是一种更好,更安全的替代方案,没有开销.看到:
标准容器数组[...]没有超出其容纳元素所需的空间开销,[...].换句话说,它非常像没有问题的内置阵列.(C++ 11 FAQ)
但是,据我所知,作为一个模板容器,就程序大小来说会有一个开销,因为它会为每个不同的N生成代码.
假设我的程序std::array在N的各个地方使用了几个不同的整数,这会导致代码膨胀吗?它可以忽略不计吗?
我是否应该为非类型模板参数担心这一点?
Tem*_*Rex 46
我不担心.如果你看一下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>对比T[N]