返回在函数中创建的对象
return object created in function. mingw and cl difference
我有下一个代码:
#include <iostream>
class Example
{
public:
Example()
{
std::cout
<< "constructor: "
<< std::hex
<< this
<< std::endl;
}
~Example()
{
std::cout
<< "destructor: "
<< std::hex
<< this
<< std::endl;
}
static Example foo()
{
Example ex;
std::cout
<< "foo: "
<< std::hex
<< &ex
<< std::endl;
return ex;
}
};
int
main()
{
Example ex = Example::foo();
}
明武编译程序 说:
constructor: 0x22fe4f
foo: 0x22fe4f
destructor: 0x22fe4f
这是我只用wingw
和g++
编程的预期结果 但是当我尝试使用Microsoft cl
时,我得到了这个:
constructor: 00000000001BF750
foo: 00000000001BF750
destructor: 00000000001BF750
destructor: 00000000001BF790
两个析构函数调用?只有一个构造函数调用?好的,foo
创建自己的对象并在return
上调用copy
构造函数。但是,当编译器可以将对象放入像 mingw 这样的函数堆栈中main
并将out
指针作为函数本身foo
参数时,为什么我需要复制它? 喜欢这个:
// no return but `out` reference
static void foo(Example &ex)
{
std::cout
<< "foo: "
<< std::hex
<< &ex
<< std::endl;
}
};
int
main()
{
Example ex; // allocate memory in stack
Example::foo(ex); // process/fill it
}
我做错了什么,或者有什么方法可以不调用copy
构造函数并且不使用out
引用编写代码?
构造函数不是创建对象的唯一方法。Copy Constructor
和Move Constructor
(C++11 起(也可以这样做。
在您的情况下,执行return ex
时,将删除在函数中创建的实例,并使用Copy Constructor
创建新实例。 如果您编写以下代码,您将获得打印
Example(const Example &) {
std::cout << "Copy Constructor" << std::hex << this << std::endl;
}
复制发生在原始对象销毁之前,因此您将在析构函数之前看到此打印。
为什么它在某些编译器中没有发生?
由于一种称为 RVO(返回值优化(的机制,编译器可以智能地理解您将使用相同的实例,因此它被移动而不是被复制。
希望它澄清。
相关文章:
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有包含其他对象的类的对象创建顺序
- 为什么我们再次从结构对象创建结构变量?
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 如何为自定义模板对象创建专门的函数模板
- 对象创建错误的C++矢量
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 此类模板的对象创建如何工作?
- C++ 中的对象创建类型有什么区别?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 如何仅通过父类对象限制对象创建
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 无法将类对象创建为另一个类的成员
- 如何从现有基类对象创建派生类对象
- 在 DTor 之前删除的静态对象创建的线程?
- C++:定义多个构造函数时的对象创建/销毁序列
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 是否可以为CPP中的对象创建一组指针