va_list,va_start,va_arg,va_end的效率
来源:互联网 发布:苹果电脑翻墙 软件 编辑:程序博客网 时间:2024/06/10 03:09
va_list,va_start,va_arg,va_end
宏不知道为什么复杂化,怀疑效率。
写了直接实现和使用va_list,va_start,va_arg,va_end来实现。
编译器尽然优化得和直接使用几乎一样。
看来C++的编译器功夫是做到家的。
#define va_start _crt_va_start
#define va_arg _crt_va_arg
#define va_end _crt_va_end
#define _ADDRESSOF(v) ( &reinterpret_cast<const char &>(v) )
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap) ( ap = (va_list)0 )
附汇编对照代码。
void testfun(int len,...)
{
00401030 push ebx
int * p=&len;
for (int i=0;i<len;i++)
00401031 mov ebx,dword ptr [esp+8]
00401035 push esi
00401036 xor esi,esi
00401038 test ebx,ebx
0040103A push edi
0040103B lea edi,[esp+10h]
0040103F jle testfun+2Dh (40105Dh)
{
printf("INDEX:%d,%d/n",i,*(++p));
00401041 mov eax,dword ptr [edi+4]
00401044 add edi,4
00401047 push eax
00401048 push esi
00401049 push offset string "INDEX:%d,%d/n" (424C20h)
0040104E call printf (40118Ah)
00401053 add esi,1
00401056 add esp,0Ch
00401059 cmp esi,ebx
0040105B jl testfun+11h (401041h)
0040105D pop edi
0040105E pop esi
0040105F pop ebx
}
}
00401060 ret
void testfun3(int len,...)
{
004010C0 push ebx
va_list p;
va_start(p,len);
for (int i=0;i<len;i++)
//#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
//
004010C1 mov ebx,dword ptr [esp+8]
004010C5 push esi
004010C6 xor esi,esi
004010C8 test ebx,ebx
004010CA jle testfun3+2Eh (4010EEh)
004010CC push edi
004010CD lea edi,[esp+10h]
{
printf("INDEX:%d,%d/n",i,va_arg(p,int ));
//#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
//编译器优化后
004010D1 mov eax,dword ptr [edi+4]
004010D4 add edi,4
004010D7 push eax
004010D8 push esi
004010D9 push offset string "INDEX:%d,%d/n" (424C20h)
004010DE call printf (40118Ah)
004010E3 add esi,1
004010E6 add esp,0Ch
004010E9 cmp esi,ebx
004010EB jl testfun3+11h (4010D1h)
004010ED pop edi
004010EE pop esi
004010EF pop ebx
}
va_end(p);
}
004010F0 ret
- va_list,va_start,va_arg,va_end的效率
- VA_LIST VA_START VA_ARG VA_END
- va_list、va_start、va_arg、va_end
- va_list va_start va_arg va_end
- va_list、va_start、va_arg、va_end
- va_list, va_start, va_end, va_arg
- va_list、va_start、va_arg、va_end
- va_list & va_start & va_arg & va_end
- va_list、va_start、va_arg、va_end
- va_list/va_start/va_arg/va_end
- va_start/va_arg/va_end/va_list
- 宏:va_list、va_start、va_arg、va_end的使用
- 宏:va_list、va_start、va_arg、va_end的使用
- va_list、va_start、va_arg、va_end宏的学习
- va_list、va_start、va_arg、va_end宏的使用方法
- va_start、va_end、va_list、va_arg的使用整理
- va_list、va_start、va_arg、va_end宏的使用
- va_list、va_start、va_arg、va_end的使用
- Microsoft2010与WPS2010大比拼
- Struts2+Extjs进行jbpm的流程部署
- Effective C++(5-12)
- 10g 回收站(RECYCLE BIN)导致查询表空间的利用率时很慢
- HF Desktop RFID Reader way lead
- va_list,va_start,va_arg,va_end的效率
- C#动态调用webservice
- SDL源码阅读笔记(1) 基本模块
- 迅雷5.9 手动 去广告
- 读《The.Web.Application.Hackers.Handbook》
- Poj 1094-Sorting It All Out [拓扑排序]
- poj 2504 Bounding box
- Flex 显示图片的常用方式
- dateField dateChoose 用法