cstr是一个CString对象.要求cstr的长度.后面要多次用到这个长度,请问,是直接用cstr.GetLengh()呢,还是定义一个整型变量,int len = cstr.GetLength();我是想知道,用len和直接用cstr.GetLength(),哪个占用的系统资源少?最好解释下原因,我水平很低.谢谢大家!

解决方案 »

  1.   

    我在想,cstr.GetLength每次用的时候它都重新算一遍长度呢,还是早就计算好了,在哪计算的?
    如果每次都算一遍,那是不是不如每次从len里读,这样CPU的计算次数能少点?
      

  2.   


    可以定义个成员变量或者全局的变量,int len = cstr.GetLength,每次cstr.GetLength()都费时间,定义个变量,以后引用这变量,不要再GetLength(),
      

  3.   

    肯定是int len = cstr.GetLength,高效了。要不每次都要计算,你disassemble 下就很直观了。
      

  4.   

    cstr.GetLength() 只是返回了 cstring对象里的一个类成员变量 和你的定义一个变量保存一样
    并没有复杂的计算之类的   但是记住给cstring赋值的时候不能对成员指针赋值 那样的话 它存储的长度
    变量并没有更新 也就是说 这时候你cstr.GetLength() 还是原来的长度  具体的你查MSDN就知道了
      

  5.   

    当然应该用一个整数len来储存。道理很简单,你每次都要采用cstr.GetLength(),这是一个类中的一个函数,经过层层封装,其速度远比直接用整数len储存慢。主要慢在以下三个方面:
    1、直接读取整数len远比运行函数的速度快;
    2、只要你将代码封装到函数中,而不是直接写在需要的地方,速度就下降了一些,也就是说哪怕你把GetLength()的原型代码直接写出来放到你程序中使用的地方,也比调用GetLength()来地快。
    3、然后当你把这个函数封装到类CString中后,速度又下降了一些。也就是说如果你用一个函数GetLength(),也比cstr.GetLength()要来得快些。
    总之:C++和所有的面向对象编程为的是提高编程效率,方便编程人员,付出的代价就是性能有所下降。因此,如果你的性能很重要,就尽可能采用C等面向过程的方式。
      

  6.   

    调用不用CALL???好吧,我就把这个东西测全了,楼主看的也清楚。
    写一段代码 CString test = "Hello World!";
    int n = test.GetLength();
    int m = n;
             
    利用这段代码来测试在内部到底执行了什么。在第一行下断点,断下后查看反汇编窗口查看内容如下。
    CString test = "Hello World!";
    004F2172  push        offset string "Hello World!" (6A84ECh) 
    004F2177  lea         ecx,[ebp-20h] 
    004F217A  call        ATL::CStringT<char,StrTraitMFC<char,ATL::ChTraitsCRT<char> > >::CStringT<char,StrTraitMFC<char,ATL::ChTraitsCRT<char> > > (4E2F2Fh) 
    004F217F  mov         dword ptr [ebp-4],0 
    int n = test.GetLength();
    004F2186  lea         ecx,[ebp-20h] 
    004F2189  call        ATL::CSimpleStringT<char,0>::GetLength (4E2DF4h) 
    004F218E  mov         dword ptr [ebp-2Ch],eax 
        
    int m = n;
    004F2191  mov         eax,dword ptr [ebp-2Ch] 
    004F2194  mov         dword ptr [ebp-38h],eax 
    当然,看到这里就已经可以明显的看出使用哪种方法更高效了。在这里我再跟踪004F2189  call  来找到代码,然后对比到底都执行了什么。int n = test.GetLength();所执行的代码如下:
    --------------------------------------------------------------------------------
    004F2186  lea         ecx,[ebp-20h] 
    004F2189  call        ATL::CSimpleStringT<char,0>::GetLength (4E2DF4h)
      ----004E2DF4  jmp         ATL::CSimpleStringT<char,0>::GetLength (4F2560h) 
      ----004F2560  push        ebp  
          004F2561  mov         ebp,esp 
          004F2563  sub         esp,0CCh 
          004F2569  push        ebx  
          004F256A  push        esi  
          004F256B  push        edi  
          004F256C  push        ecx  
          004F256D  lea         edi,[ebp-0CCh] 
          004F2573  mov         ecx,33h 
          return( GetData()->nDataLength );
          004F2583  mov         ecx,dword ptr [this] 
          004F2586  call        ATL::CSimpleStringT<char,0>::GetData (4DAC9Eh) 
          004F258B  mov         eax,dword ptr [eax+4] 
          004F2578  mov         eax,0CCCCCCCCh 
          004F257D  rep stos    dword ptr es:[edi] 
          004F257F  pop         ecx  
          004F2580  mov         dword ptr [ebp-8],ecx 
          004F258E  pop         edi  
    004F258F  pop         esi  
    004F2590  pop         ebx  
    004F2591  add         esp,0CCh 
    004F2597  cmp         ebp,esp 
    004F2599  call        @ILT+36295(__RTC_CheckEsp) (4E2DCCh) 
    004F259E  mov         esp,ebp 
    004F25A0  pop         ebp  
    004F25A1  ret      

    004F218E  mov         dword ptr [ebp-2Ch],eax --------------------------------------------------------------------------------
    其中的004F2599  call        @ILT+36295(__RTC_CheckEsp) (4E2DCCh) 我没有再跟踪,里面还有更多的代码。而使用int m = n; 的代码如下:
    --------------------------------------------------------------------------------004F2191  mov         eax,dword ptr [ebp-2Ch] 
    004F2194  mov         dword ptr [ebp-38h],eax --------------------------------------------------------------------------------好了,楼主,你说哪个高效?
      

  7.   

    这要看你的cstr的长度变不变了
    如果不再变化可以找个变量来存储长度,是会节省一些
      

  8.   

    bilaopao,请问如何disassemble,用什么工具?
      

  9.   

    新定义变量应该是比直接GetLength()快,但是要占用更多的内存空间。
    使用GetLength()要慢多少,可能和内部的实现方式有关。楼上的汇编,我看不懂啊
      

  10.   

    回bilaopao,谢谢,刚看到你的回复,我先研究研究,谢谢啊,我水平很低的. 大概还是明白了,用len效率高.
      

  11.   

    cstr.GetLength() 需要调用函数统计cstr字符串中字符的数目,如果是int len = cstr.GetLength(); 我们直接读取len中的数值,相当于直接读取内存中的值,当然直接从内存中读取快了,这样不用再统计字符串数目了,但是如果你的cstr对象在使用过程中会变化的话,最好就用cstr.GetLength()。
      

  12.   


    如果这个字符串不是经常更改的,那么还是将其长度保存下来为好,读取速度会快;如果经常变更,建议GetLength刷新长度变量或直接GetLength。这要看你的具体应用流程。其实直接GetLength效率也不是特别低,因为他只是将CStringData中保存的nDataLength减去终结符返回回来而已,但毕竟多了几次函数调用。
      

  13.   


    用VC    调试----窗口----反汇编    或者快捷键alt+f8
      

  14.   

    回bilaopao(铅笔头[兔子党整风小队长]), 再次表达一下感谢,受教了,今天真是学到东西了,呵呵! 以后类似的问题,都可以disassembly了.
      

  15.   

    送分结帖
    bilaopao  80分
    lllyyy2403 20分拜谢两位高手!其他高手也辛苦了,多谢!