文章泛型<Programming>类型化缓冲区在 C++ 11 中是否完全过时?
Is the article Generic<Programming> Typed Buffers completely obsolete with C++ 11?
我在读《Generic
我想知道它是否仍然有意义。Alexandrescu在他的文章中指出了std::vector
在性能至关重要时的一些问题:
- 分配矢量时不必要的数据初始化,我认为可以使用
std::vector::reserve
解决 - 昂贵的移动操作,由c++ 11和移动语义解决
- 大多数编译器不使用
std::memcpy
和std::memmove
来优化std::vector
类型,例如char
。这对于主流编译器来说是不正确的(从我所看到的)。 - 指数增长。您不能通过简单的方法调用来缩小
std::vector
的容量以适应大小。这也是不真实的,因为c++ 11与std::vector::shrink_to_fit()
我的问题是,这篇文章是完全过时的,我现在可以依靠向量(包括自定义分配器,如果必要的话)有一个快速的连续缓冲区吗?
c++ 11很大程度上缩小了std::vector
和原始数组之间的差距(移动语义和shrink_to_fit
解决了Alexandrescu的一些问题),但在某种程度上仍然存在;std::vector
继续对元素进行值初始化;reserve
没有帮助,因为您无法访问保留的内存。您可以使用自定义分配器来解决这个问题,但它远远不能令人满意。
从另一端来看,unique_ptr<T[]>
使得在容器类中保存缓冲区更加直接,因为它在很大程度上解决了异常安全问题。TS dynarray
在构造时提供了固定大小的分配和默认初始化,看起来很可能填补了剩余的差距。
Alexandrescu的泛型缓冲区占用的剩余空间是为默认初始化的元素提供O(n)的收缩和增长操作;它们通常不能作为容器类的组件使用,如果需要,可以写成非成员函数。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 移动构造函数是否C++过时?
- decltype(auto) 是否使尾随返回类型过时?
- 检查动态链接库是否已过时
- 自lambdas进入C++以来,“回调”接口是否已过时
- 我是否仍然需要多线程或它已经过时了
- TBB 链接器错误 如何判断我是否缺少包含或代码是否已过时
- 参数是否过时
- 文章泛型<Programming>类型化缓冲区在 C++ 11 中是否完全过时?
- 易失性但不受限制的读取是否会无限期地产生过时的值?(在真正的硬件上)
- 新的C++11模板方法是否会使以前的C++98/03 push_back/insert方法过时