首页
社区
课程
招聘
[讨论][讨论]C++编译器会改变栈上变量顺序么
发表于: 2011-1-6 14:40 5983

[讨论][讨论]C++编译器会改变栈上变量顺序么

2011-1-6 14:40
5983
在一个函数里面顺序声明了 4个变量
A,B,C,D
B为CComObject<>* 类型, 其他都是基本类型的,

后来打印出4个变量的地址发现B的地址值是最大的, 不管在A前还是A后都是&B == &A+4

其他正常按我的理解应该
&A = &B+4 = &C+8 = &D+0xC 才对啊
莫非编译器会修改变量生明的顺序?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
有可能是使存在溢出时容易检测吧,复杂的结构或者数组放在后面,这样就不会在只覆盖后面一两个变量时候摸不着头脑。
2011-1-6 15:31
0
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
DEBUG方式编译?
2011-1-6 17:39
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
和debug/release无关,
不知道是何用意
2011-1-10 09:02
0
雪    币: 315
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
A如果不超过4字节
很有可能不在堆栈中
而是在ECX中
2011-1-10 09:29
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
没有优化,应该还是放在栈上的啊
2011-1-10 14:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个应该是实现相关的, 局部变量在栈中的地址顺序和声明顺序可能不一样。而且局部变量也有可能优化到寄存器中。如果需要变量之间的存放顺序,可以考虑用结构,结构中成员变量的声明顺序貌似是有保证的,但是我也不确定。。
2011-1-10 16:42
0
雪    币: 315
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
编译器应该不能改变顺序的,因为入栈顺序是C或C++语言的标准,编译器不应该改变它。
调用方式有stdcall,cdecl,fastcall,thiscall等
一般采用的__stdcall约定时,函数参数按照从右到左的顺序入栈。

我测试了下非优化模式下的汇编代码,自己写的函数的参数是不会用寄存器传递的,地址也就是递增的。
2011-1-10 19:32
0
雪    币: 466
活跃值: (175)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
9
编译器确实有时会改变局部变量的顺序。我曾经在 AIX机器上测试过,AIX的编译器 xlc 会把 char[] 变量放在 int 变量之后。我想是为了防止溢出吧。
另外,c 的标准是不允许改变结构体中变量的顺序,而不是不允许改变局部变量的顺序。
2011-1-10 19:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这些约定都不是语言标准规定的,而是为了二进制兼容,所以也是实现相关的。
2011-1-11 10:11
0
游客
登录 | 注册 方可回帖
返回
//