【发布时间】:2013-03-31 18:46:46
【问题描述】:
这个问题是关于 new[] int 和 new [] int() 在语义和性能上的差异,以及在向 allocator_traits::construct 添加 ctor 参数的完美转发时可能无意中创建的从第一个措辞到第二个措辞的变化()。这个问题不涉及一个非常明显的问题,即默认 ctor 在由向量的 resize() 构造的所有新元素上运行。
对我来说,在调整大小时清除内置类型向量的元素似乎是一种浪费。但是 VS2012 的实现使得 resize(n) 以及因此带有 count 参数的构造函数实际上将分配的值数组设置为 0。
我还在标准中找到了对此的支持,(http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf) 但我认为它到达那里可能是一个错误,因为它依赖于最近涉及完美转发的条款:
第 507 页:
template <class T, class... Args>
static void construct(Alloc& a, T* p, Args&&... args);
5 效果:调用
::new (static_cast<void*>(p)) T(std::forward<Args>(args)...).
并且由于 new int() 必须根据同一文档第 191 页上的第 11 条将值设置为 0,因此向量中的浪费实现是正确的。
问题是标准提交是否真的希望构造调用的空参数包导致行为从默认构造更改为基本类型的值构造。
【问题讨论】:
-
有一种方法可以在 C++11 中创建
int的vector而无需将其初始化为 0。我会在答案中展示如何,但我不能因为这个问题已经被关了。我会把答案放在重复的问题中,但我的答案没有解决这个问题,因为它确实不是这个问题的重复。我会将代码放在此评论中,但它会不可读。如果您提出一个新问题,并且我可以在它作为副本关闭之前解决它,我将展示如何在 C++11 中创建这样的向量。 -
我想知道这一点,但请注意,使用分配器不会削减它,因为我必须将向量传递给采用“香草”向量的(非模板化)函数
。 -
好的,分配器就是我要给你看的。在 C++03 中你不能使用分配器来做到这一点,但在 C++11 中你可以。
标签: c++ performance vector c++11