Ant*_*ton 0 c++ constructor class move
我有这样的课程,我在其中创建了一个move constructor
class Test
{
private:
int m_a;
public:
Test(int val) { m_a = val; }
Test (const Test &) {}
// move constructor
Test (Test && d)
{
std::cout << &m_a << std::endl; // Line X
std::cout << &d.m_a << std::endl;
}
void print()
{
std::cout << m_a << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
我还创建了一个函数来测试move constructor
void fun(Test a)
{ return ; }
Run Code Online (Sandbox Code Playgroud)
比在main函数中我创建上面类的 2 个对象并调用函数来测试move constructor
int main()
{
Test a {50};
Test b {100};
fun(a);
fun(std::move(a));
fun(b);
fun(std::move(b));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我查看输出时,我很惊讶,因为 om_a变量的地址line X对于两个对象具有相同的地址。
0x7ffc40d37bb4 // look at this
0x7ffc40d37bac
0x7ffc40d37bb4 // look at this
0x7ffc40d37bb0
Run Code Online (Sandbox Code Playgroud)
这怎么可能 ?它不是静态成员,这是怎么回事?编译器优化还是什么?
每次fun(Test a)调用时,Test都会在堆栈上创建一个实例。每次fun()返回时,栈帧都会被释放。
因此,当连续调用两次时,您很有可能Test在堆栈上完全相同的位置获得一个 create 的实例。
如果你想Test参考的话,应该是void fun(Test&& a)。
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |