这篇文章转自:http://cache.baiducontent.com/c?m=9d78d513d98206ff4fede57c4701d616185697634d8091576b93d3169c3e1d070571e2c83a3f554196d27c1000ab4b0ab7a1217240527de88699d5169becce6e328b2729721b85400fd319b2ca4327c326945cfea86de7b9f23891afd7d7db4353bd125f3cdfae&p=80759a40d6d817f40be296225307&newp=8d66c54ad3c300fc57ef8f3e554792695803ed633bd1db54&user=baidu&fm=sc&query=sub+0x30%2Cesp&qid=&p1=2原地址已经打不开,这是百度快照地址。 参考:http://blog.csdn.net/wanwenweifly4/article/details/6739687红色是我添加的,其他地方是原作者的。 主要是看了上面的这篇“从底层汇编理解 c++ 引用实现机制“的文章之后,觉得不错。就转了过来,同时,对文中的程序都在自己的机器上验证了一下。 使用的G++版本:g++ (GCC) 4.5.1 20100924 如果要查看汇编后代码与源码的关系,我用的方法是: 先用g++生成带有调试信息的目标文件:g++ -g -c ref.cc 然后再利用objdump命令查看目标文件ref.o:objdump -S ref.o 引用类型到底是什么?它和指针有什么关系?它本身占用内存空间吗? 带着这些疑问,我们来进行分析。 先看代码:
通过汇编查看代码如下:
可以知道x的地址为ebp-4,b的地址为ebp-8,因为栈内的变量内存是从高往低进行分配的。所以b的地址比x的低。 mov dword ptr [ebp-8],eax 这条语句将eax的值放入b的地址ebp-8中 上面两条汇编的作用即:将x的地址存入变量b中,这不和将某个变量的地址存入指针变量是一样的吗? 所以从汇编层次来看,的确引用是通过指针来实现的。 下面我们通过程序来验证,我们知道,在程序一层我们只要直接涉及到引用变量的操作,我们操作的总是被引用变量,即编译器帮我们做了些手脚,总是在引用前面加上*。所以我们要读取真正的“引用变量的值”,必须采取一定的策略,好吧,我们就按照变量在栈中分布的特点来绕过编译器的这个特点。
b的地址我们没法通过&b获得,因为编译器会将&b解释为:&(*b) =&x ,所以&b将得到&x。也验证了对所有的b的操作,和对x的操作等同。 但是我们可以间接通过&y-1来得到b的地址,从而得到b的值:*(&y-1) 从结果可以知道,b的值即x的地址,从而可以知道,从地层实现来看,引用变量的确存放的是被引用对象的地址,只不过,对于高级程序员来说是透明的,编译器 屏蔽了引用和指针的差别。 下面是程序的变量在内存栈中的分布,引用变量一样也占用内存空间,而且应该是4个字节的空间。 虽然从底层来说,引用的实质是指针,但是从高层语言级别来看,我们不能说引用就是指针,他们是两个完全不同的概念。有人说引用是受限的指针,这种说法我不赞同,因为从语言级别上,指针和引用没有关系,引用就是另一个变量的别名。对引用的任何操作等价于对被引用变量的操作。从语言级别上,我们就不要去考虑它的底层实现机制啦,因为这些对你是透明的。所以在面试的时候,如果面试的人问到这个问题,可以先从语言级别上谈谈引用,深入的话就从底层的实现机制进行分析。而不能什么条件没有就说:引用就是指针,没有差别,......之类的回答
对于下面的程序: #include <cstdio> int main() { int x=1; int y=2; int &b=x; printf("&x=%x,&y=%x,&b=%x,b=%x\n",&x,&y,&y-1,*(&y-1)); return 0; } 我的结果是&x=bfe1b308,&y=bfe1b304,&b=bfe1b300,b=8048460 与原作者的不同,然后我就将上面的程序进行编译得到下面的结果:
上面基本每一句中都进行解释。 从这儿可以看到我的机器上生成的汇编代码是将x的地址赋给了堆栈中地址所在处的下一个地址单元。 从printf所生成的汇编代码处我们也可以看到,是按照逆序来计算的(&*(&y-1), &y-1, &y, x)这也印证了C标准中提到的函数的参数是逆序入栈的。 为了验证上面的想法,将原程序中的*(&y-1)改为*(&x+1) 结果为: &x=bf9a74c8,&y=bf9a74c4,&b=bf9a74cc,b=bf9a74c8 这样就和作者的符合起来了。 |
从底层汇编理解 c++ 引用实现机制 (转+增加)
最新推荐文章于 2022-03-13 16:59:07 发布