Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为向量生成临时变量?_C++ - Fatal编程技术网

C++ 为向量生成临时变量?

C++ 为向量生成临时变量?,c++,C++,以下哪一项更好顶点是一个向量 或 我认为第一个更好,因为它不做任何额外的复制,但第二个更可读,所以我不确定。选项一将在堆上分配顶点,而选项二将在堆栈上本地分配顶点 这实际上取决于您的用例,我们需要更多的上下文。两者并不完全可比。在(1)中,您在堆上创建一个对象,而另一个在堆栈上创建并复制到向量(因此,是的,您创建了两个副本)。这取决于您的需求和上下文 (1) 由于堆分配,肯定会花费稍多的时间,但它是一个更持久的对象。两个坏(和.push_back(新顶点))都特别坏(它不能与std::vecto

以下哪一项更好<代码>顶点是一个
向量


我认为第一个更好,因为它不做任何额外的复制,但第二个更可读,所以我不确定。

选项一将在堆上分配顶点,而选项二将在堆栈上本地分配顶点


这实际上取决于您的用例,我们需要更多的上下文。

两者并不完全可比。在(1)中,您在堆上创建一个对象,而另一个在堆栈上创建并复制到向量(因此,是的,您创建了两个副本)。这取决于您的需求和上下文

(1) 由于堆分配,肯定会花费稍多的时间,但它是一个更持久的对象。

两个坏(和
.push_back(新顶点)
)都特别坏(它不能与
std::vector一起工作,因为它返回指针)

这是你得到的:

vertices.push_back(vertex());             // construct temporary object
                                          // copy it to vector
                                          // destroy temporary object
vertices[vertices.size()-1].name = name;
vs

假设复制字符串不便宜,第二个选项更糟糕。但是,如果编译器决定对第一种情况应用优化(因为
vertex()
是一个无名的临时对象,所以它有资格这样做),那么就不会引入临时对象

C++11提供了更干净的解决方案,它允许直接在vector的内存中构造对象,而无需使用临时对象

vectices.emplace_back(/* vertex ctor parameters */);  // no temp objects here
vertices.last().name = name;

使用vector::emplace_back(Args…)方法,避免任何不必要的拷贝。 如果存在一个顶点的构造函数,该构造函数接受某种类型的字符串参数作为名称,那将是理想的。如果它不存在,我强烈建议为此添加一个顶点,因为添加具有特定名称的新顶点似乎是一个常见操作

vector.emplace_back(...,"My Name",...);

如果不存在这样的构造函数,我将使用您列出的第二种方法。当像这样使用new
MyVector.push_back(新元素)
时,您必须记住删除它。最重要的是,如果在构造对象时引发异常,则可能会发生内存泄漏。如果您真的需要使用“新”方法,请考虑使用适当的智能指针。
顶点
是否持有
std::vector
std::vector
,问题不清楚?首先,您使用的是向量,它是
顶点[vertices.size()-1]->名称
。使用指针要好得多。@PierreManuellalleMant不使用指针要好得多。@user2079303:当然,每次获取/放置项目时调用复制构造函数是一种优化??有一点结构就可以了,但是如果你必须重写复制构造函数,不使用指针只会浪费时间、代码和性能。来吧。2016年。在第一个例子中,没有一个理智的编译器会真正创建一个临时文件并将其销毁。@SergeyA,谢谢你的提醒,我已经忘记了复制省略。不管怎么说,由于是2016年,没有地方可供
push_back
:)但是“however”有点让人困惑,因为复制省略正是第一个选项更好的原因。第二个选项几乎可以通过std::move实现。
vertex v;                                 // construct temporary
v.name = name;                               
vertices.push_back(v);                    // copy temporary object with a string
vectices.emplace_back(/* vertex ctor parameters */);  // no temp objects here
vertices.last().name = name;
vector.emplace_back(...,"My Name",...);