c++ 当我取消引用一个指针来通过引用传递它时,在编译器级别会发生什么?[关闭]

x33g5p2x  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(139)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

3天前关闭。
Improve this question
我感兴趣的是,当我显式地解引用一个指针以通过引用传递它时,编译器会做什么:

void foo(A& arg)
{
   arg.member = 7;
}

void goo()
{
   A* ob = new A();
   foo(*ob);
   printf(ob->member); // should show 7
}

我感兴趣的原因是因为我相信在函数调用中引入解引用会产生非常不同的行为:

void foo(A& arg)
{
   arg.member = 7;
}

void goo()
{
   A* ob = new A();
   A ob_dereferenced = *ob;
   foo(ob_dereferenced);
   printf(ob->member); // should show whatever A initialises member to
}
bq9c1y66

bq9c1y661#

你的比较是不公平的,因为在这里的第二个版本:

void goo()
{
   A* ob = new A();
   A ob_dereferenced = *ob;   // <---- here !!!
   foo(ob_dereferenced);
   printf(ob->member); // should show whatever A initialises member to
}

您正在创建A示例的副本。根据A是什么,创建第二个示例可能会产生明显的副作用。
然而,让我们把这些可观察到的副作用放在一边,并使用

struct A { int member = 0; };

则在以下之间没有可观察到的差异:

void moo(A* a) { 
      foo(*a);    
 }

以及使用本地参考:

void moo(A* a) { 
      A& b = *a;  
      foo(b);
 }

这两个moo做同样的事情。打开优化时,没有理由期望编译器的输出不同。
PS:你的两个版本都有内存泄漏。如果你需要一个指针作为例子,你不需要new。例如,A a; A* aptr = &a;弥补了一个指向A的完全良好的指针,您不需要担心泄漏。上面我通过简单地假设指针来自 * 某处 * 来避免这个问题。

相关问题