我想看看按引用调用与 C++ 中的按指针调用有何不同。
但是,g++ 编译器(使用 -O0 -S)生成相同的代码。
我尝试使用各种人为构造来“欺骗”编译器以产生某种差异,但它似乎比我聪明。
有没有办法关闭 gcc 中的所有智能,以便我可以理解汇编中引用的实现?
[编辑]
/* Testing assembly representation of ref/pointer/by-value parameters */
int byRef(int &value, int value2) {
value = value2;
return value;
}
int byPtr(int * value, int value2) {
*value = value2;
return *value;
}
int main(int argc, char * argv[]) {
int value = 5;
byRef(value, value);
byPtr(&value, value);
}
call ___main
movl $5, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%ebp), %eax
movl %eax, (%esp)
call __Z5byRefRii
movl -4(%ebp), %eax
movl %eax, 4(%esp)
leal -4(%ebp), %eax
movl %eax, (%esp)
call __Z5byPtrPii
movl $0, %eax
这里也没有区别..有没有简单的方法来触发语义重用?
最佳答案
真的,没有太多需要了解的了。
引用是指针,和引用不是指针。
更准确地说,引用当然根本不是指针,它们是别名。这意味着在语义上,它们是相同的变量,只是名称不同。这意味着编译器通常可以使用巧妙的重命名技巧来完全优化引用传递。
有时,它仍然必须以某种方式传递引用,然后这通常通过指针发生(这不是必需的,但恰好是一种适合的技术)。在幕后,与指针的唯一可观察到的区别是引用不能为 null,编译器知道这一点(但是,如果你足够恶意,你可以创建一个 null 引用).
关于c++ - 汇编代码中的引用/指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6954742/