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