cstr是一个CString对象.要求cstr的长度.后面要多次用到这个长度,请问,是直接用cstr.GetLengh()呢,还是定义一个整型变量,int len = cstr.GetLength();我是想知道,用len和直接用cstr.GetLength(),哪个占用的系统资源少?最好解释下原因,我水平很低.谢谢大家!
解决方案 »
- 一个OCX发布到网页上的问题,求指导啊!
- 多文档中CfromView中控件随着窗口放大缩小的问题!大家帮我看看!!
- 真诚咨询
- 求教VC高人,VC ADO 如何多表查询?而且我的程序中为什么用不了insert,update,delete呢?只能用select,真是很郁闷呀!
- 如何把数据库里的一张表的内容显示在list box里?
- 界面经典问题!高手帮忙
- 请教如何用ADO创建数据库以及怎么创建表
- dll中定义的类函数,使用CString作为传值参数,竟然有意想不到的错误,请高手分析一下原因
- 请高手赐教:如何用socket api(tcp/ip协议)实现文件和消息的发送与接收。急!!!!
- 请问如何实现自己定义的IP头部
- 500分:不懂VC,帮忙写个API HOOK代码
- C++给正在运行的程序传递参数或者数据?
如果每次都算一遍,那是不是不如每次从len里读,这样CPU的计算次数能少点?
可以定义个成员变量或者全局的变量,int len = cstr.GetLength,每次cstr.GetLength()都费时间,定义个变量,以后引用这变量,不要再GetLength(),
并没有复杂的计算之类的 但是记住给cstring赋值的时候不能对成员指针赋值 那样的话 它存储的长度
变量并没有更新 也就是说 这时候你cstr.GetLength() 还是原来的长度 具体的你查MSDN就知道了
1、直接读取整数len远比运行函数的速度快;
2、只要你将代码封装到函数中,而不是直接写在需要的地方,速度就下降了一些,也就是说哪怕你把GetLength()的原型代码直接写出来放到你程序中使用的地方,也比调用GetLength()来地快。
3、然后当你把这个函数封装到类CString中后,速度又下降了一些。也就是说如果你用一个函数GetLength(),也比cstr.GetLength()要来得快些。
总之:C++和所有的面向对象编程为的是提高编程效率,方便编程人员,付出的代价就是性能有所下降。因此,如果你的性能很重要,就尽可能采用C等面向过程的方式。
写一段代码 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 --------------------------------------------------------------------------------好了,楼主,你说哪个高效?
如果不再变化可以找个变量来存储长度,是会节省一些
使用GetLength()要慢多少,可能和内部的实现方式有关。楼上的汇编,我看不懂啊
如果这个字符串不是经常更改的,那么还是将其长度保存下来为好,读取速度会快;如果经常变更,建议GetLength刷新长度变量或直接GetLength。这要看你的具体应用流程。其实直接GetLength效率也不是特别低,因为他只是将CStringData中保存的nDataLength减去终结符返回回来而已,但毕竟多了几次函数调用。
用VC 调试----窗口----反汇编 或者快捷键alt+f8
bilaopao 80分
lllyyy2403 20分拜谢两位高手!其他高手也辛苦了,多谢!