使用移动构造函数
Using Move Constructor
我在下面写了 class,我对此有疑问。函数 sayHello()
returns 一个将在该行之后被销毁的对象。但是,它不使用移动构造函数。不是右值引用吗?为什么它不使用移动构造函数?
class FString {
private:
char *ptr;
public:
FString() : ptr(nullptr) {}
FString(const char *str) {
cout << "Called: FString(const char *str)\n";
//...
}
~FString() {
cout << "Called: ~FString()\n";
//...
}
FString(FString &&s) {
cout << "Called: FString(FString &&s)\n";
//...
}
};
FString sayHello() {
FString s("Hello World!");
return s;
}
int main() {
FString s("Hello World!");
FString s2(sayHello());
return 0;
}
输出:
Called: FString(const char *str)
Called: FString(const char *str)
Called: ~FString()
Called: ~FString()
谢谢。
编译器优化了对移动构造函数的需求。您是否尝试过禁用优化并检查结果是否相同?
棋步被省略;这是在各种情况下允许的优化,即使(如此处)移动构造函数有副作用,因此省略调用会改变程序的行为。
具体来说,当程序使用临时变量(或局部变量,当return从函数中调用时)直接初始化相同类型的对象时,使用相同的存储可以省略该移动对于这两个对象。这发生在这里,无论是在 sayHello
中使用 s
初始化 return 值,还是使用该值初始化 s2
时,都不需要移动或复制构造函数.
我在下面写了 class,我对此有疑问。函数 sayHello()
returns 一个将在该行之后被销毁的对象。但是,它不使用移动构造函数。不是右值引用吗?为什么它不使用移动构造函数?
class FString {
private:
char *ptr;
public:
FString() : ptr(nullptr) {}
FString(const char *str) {
cout << "Called: FString(const char *str)\n";
//...
}
~FString() {
cout << "Called: ~FString()\n";
//...
}
FString(FString &&s) {
cout << "Called: FString(FString &&s)\n";
//...
}
};
FString sayHello() {
FString s("Hello World!");
return s;
}
int main() {
FString s("Hello World!");
FString s2(sayHello());
return 0;
}
输出:
Called: FString(const char *str)
Called: FString(const char *str)
Called: ~FString()
Called: ~FString()
谢谢。
编译器优化了对移动构造函数的需求。您是否尝试过禁用优化并检查结果是否相同?
棋步被省略;这是在各种情况下允许的优化,即使(如此处)移动构造函数有副作用,因此省略调用会改变程序的行为。
具体来说,当程序使用临时变量(或局部变量,当return从函数中调用时)直接初始化相同类型的对象时,使用相同的存储可以省略该移动对于这两个对象。这发生在这里,无论是在 sayHello
中使用 s
初始化 return 值,还是使用该值初始化 s2
时,都不需要移动或复制构造函数.