Nisy 发表于 2010-1-16 22:07:14

关于引用和指针的区别

35:       FuuCk(&tf,10);
004010AC 6A 0A                push      0Ah
004010AE 8D 45 EC             lea         eax,
004010B1 50                   push      eax
004010B2 E8 76 FF FF FF       call      @ILT+40(FuuCk) (0040102d)
004010B7 83 C4 08             add         esp,8

35:       FuuCk(tf,10);
004010AC 6A 0A                push      0Ah
004010AE 8D 45 EC             lea         eax,
004010B1 50                   push      eax
004010B2 E8 7B FF FF FF       call      @ILT+45(FuuCk) (00401032)
004010B7 83 C4 08             add         esp,8


27:   void FuuCk(TheFuuCk * pFuuCk,int m)
28:   {
00401040 55                   push      ebp
00401041 8B EC                mov         ebp,esp
00401043 83 EC 40             sub         esp,40h
00401046 53                   push      ebx
00401047 56                   push      esi
00401048 57                   push      edi
00401049 8D 7D C0             lea         edi,
0040104C B9 10 00 00 00       mov         ecx,10h
00401051 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401056 F3 AB                rep stos    dword ptr
29:       pFuuCk->m_a = m;
00401058 8B 45 08             mov         eax,dword ptr
0040105B 8B 4D 0C             mov         ecx,dword ptr
0040105E 89 48 04             mov         dword ptr ,ecx
30:   }
00401061 5F                   pop         edi
00401062 5E                   pop         esi
00401063 5B                   pop         ebx
00401064 8B E5                mov         esp,ebp
00401066 5D                   pop         ebp
00401067 C3                   ret


27:   void FuuCk(TheFuuCk& pFuuCk,int m)
28:   {
00401040 55                   push      ebp
00401041 8B EC                mov         ebp,esp
00401043 83 EC 40             sub         esp,40h
00401046 53                   push      ebx
00401047 56                   push      esi
00401048 57                   push      edi
00401049 8D 7D C0             lea         edi,
0040104C B9 10 00 00 00       mov         ecx,10h
00401051 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401056 F3 AB                rep stos    dword ptr
29:       pFuuCk.m_a = m;
00401058 8B 45 08             mov         eax,dword ptr
0040105B 8B 4D 0C             mov         ecx,dword ptr
0040105E 89 48 04             mov         dword ptr ,ecx
30:   }
00401061 5F                   pop         edi
00401062 5E                   pop         esi
00401063 5B                   pop         ebx
00401064 8B E5                mov         esp,ebp
00401066 5D                   pop         ebp
00401067 C3                   ret



==> 一摸一样 只是书写不一样而已 作为参数 都要入栈 且压入的都是对象的地址 即this指针


另外 构造和析构还都干了一件非常猥琐的事情 就是给虚标赋值 而虚表的在全局变量区 可见 编译时 虚表就已产生

evilknight 发表于 2010-1-17 02:56:47

平时写程序要用release版的,dubug版问题很大,而且release版的,把优化关掉,选上生成调试信息,一样可以调的!而且最接近真实的平台!

Nisy 发表于 2010-1-17 04:17:50

Debug和Release编译方式的本质区别   
    Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。   
    Debug和Release的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd/Fo,但区别并不重要,通常他们也不会引起Release版错误,在此不讨论)
   
Debug版本:   
/MDd/MLd或/MTd使用Debugruntimelibrary(调试版本的运行时刻函数库)   
/Od关闭优化开关   
/D"_DEBUG"相当于#define_DEBUG,打开编译调试代码开关(主要针对   assert函数)   
/ZI创建Editandcontinue(编辑继续)数据库,这样在调试过   程中如果修改了源代码不需重新编译   
/GZ可以帮助捕获内存错误   
/Gm打开最小化重链接开关,减少链接时间   
Release版本:   
/MD/ML或/MT使用发布版本的运行时刻函数库   
/O1或/O2优化开关,使程序最小或最快   
/D"NDEBUG"关闭条件编译调试代码开关(即不编译assert函数)   
/GF合并重复的字符串,并将字符串常量放到只读内存,防止   被修改   实际上,Debug和Release并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。


Debug:
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D
"_MBCS" /Fp"Debug/test3.pch"   /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/"   /FD /GZ /c

Release:
/nologo /ML /W3 /GX          /Od /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D
"_MBCS" /Fp"Release/test3.pch" /Yu"stdafx.h" /Fo"Release/" /Fd"Release/" /FD /c

区别:
/MLd /Gm /ZI /GZ


修改 Debug info 中的
None 为 Programe DataBase for Editandcontinue

以为优化选项没有打开 所以最好建立一个自己的MyRelease方案 开启该选项后 可能最大的区别就是堆栈数据的初始化没有赋值全CC的操作了 从而省去了五六行代码

evilknight 发表于 2010-1-18 17:06:50

还有很多差异,比如函数调用,在debug会有一个叫做跳表的东西!
c++的内联函数,在debug中是不会真正内联过去的!
还有函数调用等等,区别都很大的!

boy 发表于 2010-1-18 20:01:16

/:07 /:07 /:07

boy 发表于 2010-1-18 20:01:47

nisy哥哥好强大啊

besterChen 发表于 2010-1-19 21:23:53

原帖由 evilknight 于 2010-1-17 02:56 发表 https://www.chinapyg.com/images/common/back.gif
平时写程序要用release版的,dubug版问题很大,而且release版的,把优化关掉,选上生成调试信息,一样可以调的!而且最接近真实的平台!

能给解释下,debug有什么问题么?

Nisy 发表于 2010-1-19 22:41:29

原帖由 besterChen 于 2010-1-19 21:23 发表 https://www.chinapyg.com/images/common/back.gif


能给解释下,debug有什么问题么?


多一些垃圾码 还有就是斗没有指令优化 都差不多习惯了都一样 

MeowCat 发表于 2010-1-26 22:20:03

菜鸟飘过抄袭笔记...

感谢各位牛的分析 /:017
页: [1]
查看完整版本: 关于引用和指针的区别