| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 577 人关注过本帖
标题:变量的分配顺序
只看楼主 加入收藏
chenwh_bccn
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2012-10-14
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:10 
变量的分配顺序
定义全局变量:int a;int b;int c;调试时地址是a在前,c在后,b在中间
定义局部变量:int a;int b;int c;调试时地址是c在前,a在后,b在中间

请问,变量的地址分配顺序和变量的定义顺序有关吗?
2012-10-14 20:08
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:1 
对于IA32-64体系 也就是我们现在用的电脑 变量的分配可以认为是【一下子】完成的 也就是说 你在一个函数里面定义多个变量 在调用这个函数的时候 这些变量同时就都创建了 所谓的{}包括的变量能释放云云一般的系统上都不实现的。。。

至于顺序 和你说的一样 对于局部变量是在堆栈上分配的 所以符合堆栈的特性 先定义的地址反而高 也就是靠后 不过这个也不一定 跟很多东西有关系

至于原因么 可能要学习一些其他知识才能知道 这里我就不乱说了

个人意见 仅供参考 觉得好记得结题

2012-10-14 20:16
小糊涂神c30
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:198
专家分:809
注 册:2012-4-25
收藏
得分:1 
内存的申请是在编译阶段 完成的,要是编译是按顺序编译的话,那么变量应该是按定义顺序申请的内存(个人理解,不知对不对)。
2012-10-14 20:39
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:1 
以下是引用小糊涂神c30在2012-10-14 20:39:52的发言:

内存的申请是在编译阶段 完成的,要是编译是按顺序编译的话,那么变量应该是按定义顺序申请的内存(个人理解,不知对不对)。

至于这个内存申请是在编译阶段的么 不好说对不对

allocation(分配) 是在运行阶段完成的 这个应该是无疑的 但这个分配大都是对dynamic memory(动态内存)也就是new/malloc()来说的 对于局部变量 全局变量 叫分配么 我也不知道。。


[ 本帖最后由 zklhp 于 2012-10-14 20:46 编辑 ]
2012-10-14 20:45
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:1 
我是搬砖的 这些概念上的东西不懂 而且楼主关心的这个东西属于语言的实现细节 要了解语言的实现细节 除了要对语言有一定的理解 还要懂很多其他的东西 比如这里要搞明白就得懂汇编 那样才能从机器的角度理解 所以肯定是有一定的难度的 如果楼主是初学建议不要在这方面花太多的时间 因为这是个高投入低产出的事 要先学语言本身 也就是 语法和算法或者程序的实现 而非语言的实现
2012-10-14 20:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
以下是引用chenwh_bccn在2012-10-14 20:08:50的发言:

定义全局变量:int a;int b;int c;调试时地址是a在前,c在后,b在中间
定义局部变量:int a;int b;int c;调试时地址是c在前,a在后,b在中间
 
请问,变量的地址分配顺序和变量的定义顺序有关吗?

这个顺序有没有关系,与你无关,不要幻想利用这种顺序。

授人以渔,不授人以鱼。
2012-10-14 20:55
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:2 
局部变量内存分配是从高地址向低地址分配的,那块空间是在栈上面的,局部变量的内存分配的原理就是栈顶指针的调整而已,也就是esp 减去sizeof(局部变量)。
内存结构这样:
func(int n)
{
int a;
int b;
int c[2];
…………
}
---------------  高地址
|    参数    |   
|------------|
|    返回值  |
|------------|
|    a       |
|------------|
|    b       |
|------------|
|    c[1]    |
|------------|
|    c[0]    |
|------------|
看下栈溢出原理 你就明白了

[ 本帖最后由 yuccn 于 2012-10-14 23:12 编辑 ]

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-10-14 20:59
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:2 
我觉得比较有价值的东西是一个规律或经验 从性能角度考虑 较多的局部变量和较少的局部变量在性能上差不不大 无用的变量即使定义了 使用了 在开优化的时候还是会被编译器优化掉的 当然 靠编译器优化会增加编译用时而且编译器优化可能不靠谱 但这个经验的意义在于 【尽量多的使用局部变量来提高程序的可读性等东西同时还不损失性能】比【费尽心思优化一个变量还出力不讨好】要好很多
2012-10-14 21:09
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:1 
楼上说得对,有时候一些变量被优化后,不一定会使用内存,直接用寄存器来保存了。不过楼主想了解的是内存分配的原理吧~~

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-10-14 23:12
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
zklhp 说的都很中肯。可惜楼主好像已经不在了。。。
2012-10-16 08:43
快速回复:变量的分配顺序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037840 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved