我希望自定义std::vector行为,而不是默认构造元素类型(例如,int),因为对于大型向量来说这样做成本很高。
看看这个,我能看到的唯一方法就是专门化std::allocator_traits<MyAllocator>::construct。但是,这似乎是不可能的,因为专门化必须在与原始声明相同的名称空间中。
在namespace std中进行专业化似乎是不对的。实际上更糟糕的是,因为我使用的STL实现实际上将std::allocator_traits放在namespace std::__u中(而且这种情况在不同的STL实现中肯定不同),所以这样做似乎是非常错误的。
这是令人困惑的,因为std::allocator_traits似乎是为了允许专门化而设计的,但我不知道如何真正做到这一点。这仅仅是个坏主意吗?如果是这样的话,是否有其他方法来解决这个问题(避免STL容器中元素的默认构造)?
发布于 2019-11-22 00:21:11
专门化标准库特性类不仅是允许的,它也是提供此类功能的主要方式。然而,在这种情况下,这是不必要的。
默认的std::allocator_traits<T>::construct实现(其中T是您的分配器类型,而不是与其一起使用的容器的值类型)将调用T的construct成员函数(如果T有这样的函数),如果T没有合适的成员,则调用Place-new。因此,只要给分配器一个construct成员,就可以了。
发布于 2019-11-22 00:27:26
你应该打电话给reserve,而不是resize。只有在已知值时才添加元素。创建一个充满垃圾的vector是没有意义的。
std::vector<int> v;
r.reserve(500);
v.push_back(3); // Only 1 constructor is called如果您真的不想初始化数据,但仍然要填充数据,那么应该使用带有不初始化其成员的构造函数的struct;
struct unintialized_int
{
unintialized_int() { /* no initialization */ }
int uninitialized;
};
std::vector<unintialized_int> v;
v.resize(500);
v[22].uninitialized = 33;但是,
不建议使用,因为它会导致很难找到bug!
最好按预期使用矢量。
顺便说一句,要想对像int这样的简单类型的性能产生影响,您必须有数千个条目,或者创建上千个向量。
有些问题要问你自己:
memset.的初始化,您确定初始化对performance?有任何可测量的影响吗?
https://stackoverflow.com/questions/58985619
复制相似问题