能力值:
( LV2,RANK:10 )
|
-
-
2 楼
有可能是使存在溢出时容易检测吧,复杂的结构或者数组放在后面,这样就不会在只覆盖后面一两个变量时候摸不着头脑。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
DEBUG方式编译?
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
和debug/release无关,
不知道是何用意
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
A如果不超过4字节
很有可能不在堆栈中
而是在ECX中
|
能力值:
( LV5,RANK:60 )
|
-
-
6 楼
没有优化,应该还是放在栈上的啊
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
这个应该是实现相关的, 局部变量在栈中的地址顺序和声明顺序可能不一样。而且局部变量也有可能优化到寄存器中。如果需要变量之间的存放顺序,可以考虑用结构,结构中成员变量的声明顺序貌似是有保证的,但是我也不确定。。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
编译器应该不能改变顺序的,因为入栈顺序是C或C++语言的标准,编译器不应该改变它。
调用方式有stdcall,cdecl,fastcall,thiscall等
一般采用的__stdcall约定时,函数参数按照从右到左的顺序入栈。
我测试了下非优化模式下的汇编代码,自己写的函数的参数是不会用寄存器传递的,地址也就是递增的。
|
能力值:
( LV9,RANK:190 )
|
-
-
9 楼
编译器确实有时会改变局部变量的顺序。我曾经在 AIX机器上测试过,AIX的编译器 xlc 会把 char[] 变量放在 int 变量之后。我想是为了防止溢出吧。
另外,c 的标准是不允许改变结构体中变量的顺序,而不是不允许改变局部变量的顺序。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
这些约定都不是语言标准规定的,而是为了二进制兼容,所以也是实现相关的。
|
|
|