首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定制std::allocator_traits::construct

定制std::allocator_traits::construct
EN

Stack Overflow用户
提问于 2019-11-22 00:09:22
回答 2查看 492关注 0票数 2

我希望自定义std::vector行为,而不是默认构造元素类型(例如,int),因为对于大型向量来说这样做成本很高。

看看这个,我能看到的唯一方法就是专门化std::allocator_traits<MyAllocator>::construct。但是,这似乎是不可能的,因为专门化必须在与原始声明相同的名称空间中。

namespace std中进行专业化似乎是不对的。实际上更糟糕的是,因为我使用的STL实现实际上将std::allocator_traits放在namespace std::__u中(而且这种情况在不同的STL实现中肯定不同),所以这样做似乎是非常错误的。

这是令人困惑的,因为std::allocator_traits似乎是为了允许专门化而设计的,但我不知道如何真正做到这一点。这仅仅是个坏主意吗?如果是这样的话,是否有其他方法来解决这个问题(避免STL容器中元素的默认构造)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-22 00:21:11

专门化标准库特性类不仅是允许的,它也是提供此类功能的主要方式。然而,在这种情况下,这是不必要的。

默认的std::allocator_traits<T>::construct实现(其中T是您的分配器类型,而不是与其一起使用的容器的值类型)将调用Tconstruct成员函数(如果T有这样的函数),如果T没有合适的成员,则调用Place-new。因此,只要给分配器一个construct成员,就可以了。

票数 3
EN

Stack Overflow用户

发布于 2019-11-22 00:27:26

你应该打电话给reserve,而不是resize。只有在已知值时才添加元素。创建一个充满垃圾的vector是没有意义的。

代码语言:javascript
复制
std::vector<int> v;
r.reserve(500);
v.push_back(3); // Only 1 constructor is called

如果您真的不想初始化数据,但仍然要填充数据,那么应该使用带有不初始化其成员的构造函数的struct

代码语言:javascript
复制
struct unintialized_int
{
    unintialized_int() { /* no initialization */ }
    int uninitialized;
};

std::vector<unintialized_int> v;
v.resize(500);
v[22].uninitialized = 33;

但是,

不建议使用,因为它会导致很难找到bug!

最好按预期使用矢量。

顺便说一句,要想对像int这样的简单类型的性能产生影响,您必须有数千个条目,或者创建上千个向量。

有些问题要问你自己:

  • 您是在度量发布版本上的性能吗?调试构建可能要慢得多。
  • 是否对您的应用程序进行了分析,以确定是构造函数导致了缓慢?事实上,对于像memset.
  • And这样的普通类型,编译器可能能够优化对performance?

的初始化,您确定初始化对performance?有任何可测量的影响吗?

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58985619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档