再论this指针
以下是,笔记5在其他bbs上讨论的结论,现re出,也作为笔记8的内容吧。
这几天没看书了。呵呵:)
首先,在32位操作系统中,指针占4b,(呵呵我想大家都知道,废话而已),所以p1在
t
his+4的位置。
其次,笔记5中this指针的确是指向b的隐含父类A,这个父类可以说是b中
的父类
再次,再vc编译器和win操作系统中,b与他的这个隐含父类是同址的,也就是说,这个
指针也是指向b本身的。
然后,之所以this指针调用aaa时是b的,而不是他隐含父类的,是因为在vftable中只有
一个虚函数,那就是b中的那个,而且vftable跟上述两者也是同址的,至于vftable是什
么,相信那些不是玩雕虫小技的大侠知道了,我也步赘述了!
最后,就是这个虚函数的位置,他到底在堆中呢,还是栈中呢?答案是在代码段中,至于如何寻址,不得而知!
再论变量(对象)存在方式
在vc和win下,存在的四种情况的对象方式,即:stack、 heap、 global、 local static
其中,有理由相信global、 local static被组织在一起(一家之言),即是说他们被分配在同一内存区,或者说他们的地址相连续。
而,stack和heap是各自独立的内存区。姑且将他们分别记为A、B、C内存区(按上述的顺序)。
那么变量到底被分配在那个内存区呢?
1)全局变量、静态变量(除去new生成的)在A区;
2)全局new的变量和 在main()内部或函数内部的用new生成的变量在C区;
3)函数内、main()内部、类成员变量位于B区;
4)函数、类成员函数(与虚实无关)位于代码段中,至于他们是怎么被寻址的,我还没告明白!
(一家之言!)
呵呵,没了!
结论变量(对象)的存在方式
终于清楚了9中所谓寻址问题,所以在此赘述了。
要谈这个问题,其实是在说所谓的win32 PE文件格式,这其实也设计到dumpbin的事,所以上面连re了n次!:)
在debug版下,可以发现,其实exe中(只谈exe,没有dll的事,呵呵)的.data块中存了全局变量和局部静态变量,还有所谓的字符串,
局部变量载入到一个线程的堆栈中,9中说了。.bss块中是为初始化的全局变量和静态局部变量。
但是,我debug了一下,发现如下:
1)上述的所谓的初始化和未初始化的问题,好像在vc下不明显了,就是说,他们(初和未初的)好像是彼此交错的存在玉ram中,而且有跳跃。不是why?
2)所谓的寻址问题(9中),据说(之所以用据说,是因为我没有实际去dumpbin看,而且很费劲的说!:),有空大家自己研究一下,然后告诉我们好了,呵呵! )是在.idata块中的call[XXXX]来寻址的,xxxx为函数地址,所以好像debug时没发现这个地址存在什么地方。
3)至于关于win32 PE的文件格式介绍,我copy了一篇,但是没属别人名字,就当自己的下篇了,毕竟是精华截取,没有完全copy嘛!况且我的题目也是笔记的说,呵呵,节省大家时间嘛。看了有发现告诉大家一声,呵呵,希望你们有兴趣。!
最后,其实这个结论篇也没什么结论,但是这个话题太伤脑筋了,而且时费力不讨好啊!:)
善其事,利其器
(都是废话!:))
vc包括两个版本:Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。