已关闭,此问题需要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
}
1条答案
按热度按时间bq9c1y661#
你的比较是不公平的,因为在这里的第二个版本:
您正在创建
A
示例的副本。根据A
是什么,创建第二个示例可能会产生明显的副作用。然而,让我们把这些可观察到的副作用放在一边,并使用
则在以下之间没有可观察到的差异:
以及使用本地参考:
这两个
moo
做同样的事情。打开优化时,没有理由期望编译器的输出不同。PS:你的两个版本都有内存泄漏。如果你需要一个指针作为例子,你不需要
new
。例如,A a; A* aptr = &a;
弥补了一个指向A
的完全良好的指针,您不需要担心泄漏。上面我通过简单地假设指针来自 * 某处 * 来避免这个问题。