提问人:Omroth 提问时间:6/26/2023 更新时间:6/26/2023 访问量:120
当我取消引用指针以通过引用传递指针时,在编译器级别会发生什么?[已结束]
What happens at the compiler level when I dereference a pointer to pass it by reference? [closed]
问:
我感兴趣的是,当我显式取消引用指针以通过引用传递指针时,编译器会做什么:
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赞
463035818_is_not_an_ai
6/26/2023
#1
您的比较不公平,因为在第二个版本中:
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
评论
A ob_dereferenced = *ob;
创建副本。这不是代码的第一个版本所做的ob
ob_dereferenced
ob_dereferenced