飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 1925|回复: 8

[C/C++] 关于引用和指针的区别

[复制链接]

该用户从未签到

发表于 2010-1-16 22:07:14 | 显示全部楼层 |阅读模式
35:       FuuCk(&tf,10);
004010AC 6A 0A                push        0Ah
004010AE 8D 45 EC             lea         eax,[ebp-14h]
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,[ebp-14h]
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,[ebp-40h]
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 [edi]
29:       pFuuCk->m_a = m;
00401058 8B 45 08             mov         eax,dword ptr [ebp+8]
0040105B 8B 4D 0C             mov         ecx,dword ptr [ebp+0Ch]
0040105E 89 48 04             mov         dword ptr [eax+4],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,[ebp-40h]
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 [edi]
29:       pFuuCk.m_a = m;
00401058 8B 45 08             mov         eax,dword ptr [ebp+8]
0040105B 8B 4D 0C             mov         ecx,dword ptr [ebp+0Ch]
0040105E 89 48 04             mov         dword ptr [eax+4],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指针


另外 构造和析构还都干了一件非常猥琐的事情 就是给虚标赋值 而虚表的在全局变量区 可见 编译时 虚表就已产生
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-11-16 14:28
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2010-1-17 02:56:47 | 显示全部楼层
    平时写程序要用release版的,dubug版问题很大,而且release版的,把优化关掉,选上生成调试信息,一样可以调的!而且最接近真实的平台!
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2010-1-17 04:17:50 | 显示全部楼层
    Debug  和  Release  编译方式的本质区别     
        Debug  通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release  称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。   
        Debug  和  Release  的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd  /Fo,但区别并不重要,通常他们也不会引起  Release  版错误,在此不讨论)  
       
    Debug  版本:   
    /MDd  /MLd  或  /MTd  使用  Debug  runtime  library(调试版本的运行时刻函数库)   
    /Od  关闭优化开关   
    /D  "_DEBUG"  相当于  #define  _DEBUG,打开编译调试代码开关(主要针对   assert函数)   
    /ZI  创建  Edit  and  continue(编辑继续)数据库,这样在调试过   程中如果修改了源代码不需重新编译   
    /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 Edit  and  continue

    以为优化选项没有打开 所以最好建立一个自己的MyRelease方案 开启该选项后 可能最大的区别就是堆栈数据的初始化没有赋值全CC的操作了 从而省去了五六行代码
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-11-16 14:28
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2010-1-18 17:06:50 | 显示全部楼层
    还有很多差异,比如函数调用,在debug会有一个叫做跳表的东西!
    c++的内联函数,在debug中是不会真正内联过去的!
    还有函数调用等等,区别都很大的!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-1-18 20:01:16 | 显示全部楼层
    /:07 /:07 /:07
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-1-18 20:01:47 | 显示全部楼层
    nisy哥哥好强大啊
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-4-18 16:56
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2010-1-19 21:23:53 | 显示全部楼层
    原帖由 evilknight 于 2010-1-17 02:56 发表
    平时写程序要用release版的,dubug版问题很大,而且release版的,把优化关掉,选上生成调试信息,一样可以调的!而且最接近真实的平台!


    能给解释下,debug有什么问题么?
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2010-1-19 22:41:29 | 显示全部楼层
    原帖由 besterChen 于 2010-1-19 21:23 发表


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



    多一些垃圾码 还有就是斗没有指令优化 都差不多习惯了都一样 
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-8-23 14:44
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2010-1-26 22:20:03 | 显示全部楼层
    菜鸟飘过  抄袭笔记...  

    感谢各位牛的分析 /:017
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表