[ 2007/10/10 07:30 | by turbozv ]
|
还是一个栈变量的问题,请问以下赋值有什么不同?
{0}的方式是我们常用的初始化数组,结构的方法。
我第一次见到这个是从别人的代码里,于是之后我也没有多想就直接使用了,后来看了汇编,我才发现,原来{0}和{}是不同的。
编译器生成的代码也不同。
Release模式,关闭优化
Release模式,完全优化
结论:
看到了吧,其实{}比{0}生成的代码更优化,所以下次记得要写{}了,不要加0~
其实不要说其他公司,M$里也很多{0}的代码,呵呵~~
补充:
发现Microsoft Embeded Visual C++ 3.0不支持 {},只能用{0}.....
引用
#define LEN 0xff
unsigned char a[LEN] = {0};
unsigned char b[LEN] = {};
unsigned char c[LEN] = {1};
unsigned char a[LEN] = {0};
unsigned char b[LEN] = {};
unsigned char c[LEN] = {1};
{0}的方式是我们常用的初始化数组,结构的方法。
我第一次见到这个是从别人的代码里,于是之后我也没有多想就直接使用了,后来看了汇编,我才发现,原来{0}和{}是不同的。
编译器生成的代码也不同。
Release模式,关闭优化
引用
unsigned char a[LEN] = {0};
004017E9 mov byte ptr [a],0 -- 第一个元素单独赋值0
004017F0 push 0FEh -- 所以只剩下0xff - 1 = 0xfe个元素需要调用memset了
004017F5 push 0
004017F7 lea eax,[ebp-0FFh]
004017FD push eax
004017FE call memset (401840h)
00401803 add esp,0Ch
unsigned char b[LEN] = {};
00401806 push 0FFh
0040180B push 0
0040180D lea ecx,[ b]
00401813 push ecx
00401814 call memset (401840h)
00401819 add esp,0Ch
unsigned char c[LEN] = {1};
0040181C mov byte ptr [c],1
00401823 push 0FEh
00401828 push 0
0040182A lea edx,[ebp-2FFh]
00401830 push edx
00401831 call memset (401840h)
00401836 add esp,0Ch
004017E9 mov byte ptr [a],0 -- 第一个元素单独赋值0
004017F0 push 0FEh -- 所以只剩下0xff - 1 = 0xfe个元素需要调用memset了
004017F5 push 0
004017F7 lea eax,[ebp-0FFh]
004017FD push eax
004017FE call memset (401840h)
00401803 add esp,0Ch
unsigned char b[LEN] = {};
00401806 push 0FFh
0040180B push 0
0040180D lea ecx,[ b]
00401813 push ecx
00401814 call memset (401840h)
00401819 add esp,0Ch
unsigned char c[LEN] = {1};
0040181C mov byte ptr [c],1
00401823 push 0FEh
00401828 push 0
0040182A lea edx,[ebp-2FFh]
00401830 push edx
00401831 call memset (401840h)
00401836 add esp,0Ch
Release模式,完全优化
引用
unsigned char a[LEN] = {0};
004017E6 push 0FEh -- 去掉第一个元素,只剩下0xff - 1 = 0xfe个元素需要调用memset了
004017EB lea eax,[esp+5]
004017EF push 0
004017F1 push eax
004017F2 mov byte ptr [esp+0Ch],0 -- 第一个元素单独赋值0
004017F7 call memset (401876h)
unsigned char b[LEN] = {};
004017FC push 0FFh
00401801 lea ecx,[esp+210h]
00401808 push 0
0040180A push ecx
0040180B call memset (401876h)
unsigned char c[LEN] = {1};
00401810 push 0FEh
00401815 lea edx,[esp+11Dh]
0040181C push 0
0040181E push edx
0040181F mov byte ptr [esp+124h],1
00401827 call memset (401876h)
004017E6 push 0FEh -- 去掉第一个元素,只剩下0xff - 1 = 0xfe个元素需要调用memset了
004017EB lea eax,[esp+5]
004017EF push 0
004017F1 push eax
004017F2 mov byte ptr [esp+0Ch],0 -- 第一个元素单独赋值0
004017F7 call memset (401876h)
unsigned char b[LEN] = {};
004017FC push 0FFh
00401801 lea ecx,[esp+210h]
00401808 push 0
0040180A push ecx
0040180B call memset (401876h)
unsigned char c[LEN] = {1};
00401810 push 0FEh
00401815 lea edx,[esp+11Dh]
0040181C push 0
0040181E push edx
0040181F mov byte ptr [esp+124h],1
00401827 call memset (401876h)
结论:
看到了吧,其实{}比{0}生成的代码更优化,所以下次记得要写{}了,不要加0~
其实不要说其他公司,M$里也很多{0}的代码,呵呵~~
补充:
发现Microsoft Embeded Visual C++ 3.0不支持 {},只能用{0}.....
偶也该开始潜心MSIL了……