【发布时间】:2014-08-12 07:56:31
【问题描述】:
我对以下代码有两个问题:1) faces 的元素是否连续?
2) std::vector 插入时是否复制或移动Face f?
#include <vector>
int main()
{
struct Face {};
std::vector<Face> faces;
for (int i=0; i<10; ++i)
{
Face f;
faces.push_back (f);
}
return 0;
}
【问题讨论】:
-
如果您担心它会复制或移动它(在这种特殊情况下是移动)- 为什么不使用
.emplace? -
@BenjaminGruenbaum:
push_back和emplace_back都将使用复制构造函数在std::vector中创建对象(在本例中)。 -
@nosid 我的意思是 - 与其在循环之外创建它,不如将它放置在循环中。我很想听听为什么它不能利用移动语义。我的印象是 gcc 和 clang 会很容易做到这一点(假设一个不是“空”的结构)
-
@BenjaminGruenbaum:我不明白你所说的在循环之外和在循环中是什么意思。不管怎样,
f是一个左值引用,编译器不能将移动构造函数用于左值引用——push_back和emplace_back都不能。此规则的唯一例外是return语句。 -
@chris 不是。它们本来应该是连续的,当发现 C++98 标准没有明确说明时,他们在 C++03 中添加了一段以确保它是连续的。我认为从来没有一个不连续的 std::vector 实现。
标签: c++ c++11 stdvector contiguous