我想看看by-reference与C++中的by-pointer的区别.
但是,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
Run Code Online (Sandbox Code Playgroud)
这里没有区别..是否有一种简单的方法来触发语义重用?
真的,没有太多要理解的了.
参考的指针,并引用不是指针.
更准确地说,引用当然不是指针,它们是别名.这意味着在语义上,它们是相同的变量,只是在不同的名称下.这意味着编译器通常可以使用巧妙的重命名技巧来完全优化传递引用.
有时,它仍然必须以某种方式传递引用,然后通常通过指针发生(这不是一个要求,但碰巧是一种适合的技术).引导下唯一可观察到的指针差异在于引用不能为空,并且编译器知道(但是,如果您足够恶意,则可以创建空引用).