忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 1153 | 回复: 10

[C] 为什么有这差异? [复制链接]

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:44
发表于 2017-08-17 17:54 |显示全部楼层
  1. #include <stdio.h>
  2. void why(int *A) {
  3.   printf("%d\n", (char *)A - (char *)&A);
  4.   return;
  5. }

  6. int main() {
  7.   int a[3] = {0};
  8.   why(a);
  9. }


复制代码
clang
-O0 40
-O3 4

gcc
-O0 16
-O2 4

但说实话,40, 16令人头疼。
因此,在讨论问题时我们不可避免地要讨论40, 16
为什么有这差异?



论坛徽章:
0
发表于 2017-08-18 09:24 |显示全部楼层
你认为为什么会出现4?

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:44
发表于 2017-08-18 09:49 |显示全部楼层
回复 2# xujunxp

A
a[0]
a[1]
a[2]

&a[0] - &A

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:44
发表于 2017-08-18 09:52 |显示全部楼层
回复 2# xujunxp

你认为为什么会出现 40

论坛徽章:
0
发表于 2017-08-18 10:12 |显示全部楼层
这个涉及函数调用栈空间的使用,不同优化等级或者不同体系的处理器都可能不同,所以我认为这个问题没有必要纠结,一定要要知道为什么,反汇编一下就清楚了。要么有除参数外的其他东西入栈,要么子函数保留了更多的用于局部计算的临时变量空间,一般优化等级低的时候会表现的更明显。

论坛徽章:
129
操作系统版块每日发帖之星
日期:2016-05-11 17:06:57操作系统版块每日发帖之星
日期:2016-05-11 17:06:57数据库技术版块每日发帖之星
日期:2016-05-11 17:07:05操作系统版块每日发帖之星
日期:2016-05-11 17:06:57操作系统版块每日发帖之星
日期:2016-05-11 17:06:57综合交流区版块每日发帖之星
日期:2016-05-11 17:07:052022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:57IT运维版块每日发帖之星
日期:2016-05-11 17:06:49操作系统版块每日发帖之星
日期:2016-05-11 17:06:57综合交流区版块每日发帖之星
日期:2016-05-11 17:07:05操作系统版块每日发帖之星
日期:2016-05-11 17:06:57程序设计版块每日发帖之星
日期:2016-05-11 17:06:57
发表于 2017-08-18 13:52 |显示全部楼层
系统是多少位的,感觉写这种代码的人是研究底层编译器的,,,


业务代码没必要。所以请具体说出具体的运行环境很重要
来自安卓客户端来自客户端

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:44
发表于 2017-08-18 19:29 |显示全部楼层
回复 5# xujunxp

我认为这个问题没有必要纠结
我一定要要知道为什么

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:44
发表于 2017-08-18 19:30 |显示全部楼层
回复 6# shang2010

系统是32位的

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:44
发表于 2017-08-22 13:23 |显示全部楼层
How a bout u ? Big cat?

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2017-08-24 11:23 |显示全部楼层
本帖最后由 w_anthony 于 2017-08-24 11:32 编辑

函数里面除了手工定义的临时变量占用空间以外,还有一些例如防止栈溢出,或者检测堆栈平衡的,编译器自动生成的代码也会占用一些栈空间,所以实际的内存排列,并不是简单的A
a[0]
a[1]
a[2]
也可能是
A
检测堆栈平衡所需的变量
防止栈溢出的缓冲区
a[0]
a[1]
a[2]

这样就会把A挤到更上面的地方,而不同的编译器,不同的编译参数,这些自动生成的代码所需的空间也有所不同,所以有差异也是正常现象




您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票8.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月2日前

活动链接>>
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP