- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经阅读了一些关于 move 函数的帖子(例如 http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html),并且我想观察 move 运算符的运行情况。所以我尝试了以下代码:
#include <vector>
#include <cassert>
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std;
vector<double> operator+(const vector<double>& a, const vector<double>& b){
assert(a.size()==b.size());
vector<double> result(a.size(),0);
transform (a.begin(), a.end(), b.begin(), result.begin(), std::plus<double>());
cout<<&result<<endl;
return result;
}
int main(int argc, char const *argv[]) {
vector<double> a,b;
for (int i=0;i<10;i++){
a.push_back(i);
b.push_back(1);
}
std::vector<double> c=a+b;
cout<<&c<<endl;
return 0;
}
我期望为局部变量 result
和 c
获取相同的地址,因为 move 运算符是为 vector
实现的。我得到的正是这个,但有和没有标志 -std=c++11
。那是我了解 NRVO ( c++11 Return value optimization or move? ) 的时候,所以我用标志 -fno-elide-constructors
禁用了它,现在地址不同了,即使有标志 -std= C++11
。我的代码有问题还是我对 move 运算符的理解有误?
据我了解,按值返回应该足以让 move 运算符启动 ( C++11 rvalues and move semantics confusion (return statement) )。
PS:我尝试使用 GCC 6.3.0_1 和 Apple LLVM 版本 8.1.0。
编辑
如前所述,我应该检查 result.data()
而不是 &result
(见下文)。但在那种情况下,我总是找到相同的地址,即使没有 std=c++11
和 -fno-elide-constructors
。请参阅已接受的答案及其评论部分。
最佳答案
move 构造函数通过窃取旧对象的资源来构造一个新对象。它根本不合并临时对象:如果没有省略构造,您仍然有两个对象。
关于c++ - NRVO 和 move ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44385691/
我看到了这个问题 When is an object "out of scope"? 我看了sparc_spread 的回答,发现其中有一个问题。在他的回答的这一部分: Circle myFunc (
在程序中如下 #include struct A { A() { std::cout << "0"; } A( const A & ) { std::cout << "1"; }
在以下示例中,根据 this article 应用 NRVO(命名返回值优化): std::string f1() { std::string str; return str; //
#include using namespace std; int gc = 0; struct A { int id; A():id(gc++) { cout 1)。并且符合规范
class Date { private: int day,month,year; public: Date (int d,int m,int y) { day=d; month=m; year=y;
我们有一个广泛使用 out 参数的代码库,因为每个函数都可能因某些错误枚举而失败。这变得非常困惑,代码有时不可读。 我想消除这种模式并引入更现代的方法。 目标是转变: error_t fn(param
当我在 VS2010 中运行此代码时,不应用 NRVO。 #include class A { public: A() { printf( "I am in constructor\
我认为应该这样做,因为它对正确性很重要。但是,我很惊讶地看到 Clang 的输出。考虑以下代码: #include struct S { int i; S(int i) : i(i)
我希望了解 C++ 中 NRVO 的局限性。具有初始命名声明和单个返回的函数是否会针对 NRVO 进行优化并省略 T val,即使函数 myFunc() 具有抛出的可能性? T myFunc(bool
我有以下代码。 #include struct Box { Box() { std::cout << "constructed at " << this << '\n'; }
返回值优化机制的简短(可能过时且过于简单)总结如下 this : an implementation may create a hidden object in the caller's stack
我已经阅读了一些关于 move 函数的帖子(例如 http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c
我需要调用一个函数为我返回一个对象。问题是对象有一个析构函数,它可以在函数输出被分配给另一个对象之前破坏数据。在我的程序中,我有一个 operator+,它将两个矩阵相加并返回两个矩阵的和: C=A+
我刚刚了解了 RVO(返回值优化)和 NRVO(命名返回值优化)。下面是两个例子 //Example of RVO Bar Foo() { return Bar(); } //Example
如果我编写一个在本地实例化对象然后按值返回的工厂方法,打算利用 NRVO(根据此处的一些答案:c++11 Return value optimization or move?),将指向本地对象的指针/
假设我有这样一个函数: using std::vector; vector build_vector(int n) { if (some_condition(n)) return {};
假设我们有以下代码: std::vector f() { std::vector y; ... return y; } std::vector x = ... x = f(); 似乎编译器
想象一下: S f(S a) { return a; } 为什么不允许别名a和返回值槽? S s = f(t); S s = t; // can't generally transform it
我一直在研究 NRVO 及其对不同编译器的支持,并遇到了奇怪的行为,这相当令人困惑。 示例代码: #include using namespace std; class X
自 1992 年以来我一直在使用 C++(并阅读了大量有关该语言的资料),因此我对这门语言有相当多的了解,但远非全部。我的问题是关于 C++11 命名返回值优化——有什么保证会执行?我倾向于发送非常量
我是一名优秀的程序员,十分优秀!