免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4580 | 回复: 10
打印 上一主题 下一主题

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

论坛徽章:
6
数据库技术版块每日发帖之星
日期: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:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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
2 [报告]
发表于 2017-08-18 09:24 |只看该作者
你认为为什么会出现4?

论坛徽章:
6
数据库技术版块每日发帖之星
日期: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:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
3 [报告]
发表于 2017-08-18 09:49 |只看该作者
回复 2# xujunxp

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

&a[0] - &A

论坛徽章:
6
数据库技术版块每日发帖之星
日期: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:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
4 [报告]
发表于 2017-08-18 09:52 |只看该作者
回复 2# xujunxp

你认为为什么会出现 40

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

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
6 [报告]
发表于 2017-08-18 13:52 |只看该作者
系统是多少位的,感觉写这种代码的人是研究底层编译器的,,,


业务代码没必要。所以请具体说出具体的运行环境很重要

论坛徽章:
6
数据库技术版块每日发帖之星
日期: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:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
7 [报告]
发表于 2017-08-18 19:29 |只看该作者
回复 5# xujunxp

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

论坛徽章:
6
数据库技术版块每日发帖之星
日期: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:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
8 [报告]
发表于 2017-08-18 19:30 |只看该作者
回复 6# shang2010

系统是32位的

论坛徽章:
6
数据库技术版块每日发帖之星
日期: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:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
9 [报告]
发表于 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
10 [报告]
发表于 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挤到更上面的地方,而不同的编译器,不同的编译参数,这些自动生成的代码所需的空间也有所不同,所以有差异也是正常现象




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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP