免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: zx_wing
打印 上一主题 下一主题

大家来看看这个程序,解释出原因了就明白指针和数组的区别了(程序很短) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-12-18 13:22 |显示全部楼层
原帖由 r2007 于 2006-12-18 13:14 发表
下面这个是立即数
  1. (int*)0 + 10
  2. &x + 10  // x 是一个静态对象。
复制代码

如果没有猜错的话,上面的如果作为右值的话,编译器会运算出结果,而目标代码中只有这个结果。

[code]     int a = 1;
  ...


是的,上面其实都是常量操作,静态变量x的地址在编译时就确定了,所以是立即数操作。

它们本身就不是一个东西,我只是想说明单纯的讨论是否访存没有意义。所以不要脱离指针和数组的范围来讨论这个问题。

论坛徽章:
0
12 [报告]
发表于 2006-12-18 13:23 |显示全部楼层
原帖由 whyglinux 于 2006-12-18 13:16 发表
To zx_wing

>> 有兴趣的朋友可以自己看看反汇编,会发现没有访存操作,a是放在一个寄存器里的(在x86平台上,我推测是eax)。

真的没有访存操作操作吗?那寄存器中的初始值是从哪里来的?


编译过后,初始化操作会被转换成一个立即数操作,例如:
mov $1, %eax

[ 本帖最后由 zx_wing 于 2006-12-18 13:58 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2006-12-18 13:25 |显示全部楼层
原帖由 mik 于 2006-12-18 13:21 发表


zx_wing这位朋友还是推测出来的,即使是放在 eax 也不能说明什么问题,gcc 根据情况而定

想要深入了解清楚,看gcc实现代码


是的,不具备任何意义。
嘿嘿,我之所以这样推测是因为我也是用gcc,很多程序习惯上编译出来后是这样用的

论坛徽章:
0
14 [报告]
发表于 2006-12-18 14:15 |显示全部楼层
原帖由 whyglinux 于 2006-12-18 14:10 发表
>> 编译过后,初始化操作会被转换成一个立即数操作,例如:
>> mov 1, %eax

这是加了优化之后的情况吧?

优化是一种等价实现,强调的是结果的对等性,其具体的实现过程没有可比性,一般不能用 ...


我已经在前面注释强调不优化的情况可能访存,但也不是不优化都会访存。这里强调这种行为的存在,不强调这种行为一定会发生。上面代码也有误,1没加$。我不在x86上工作,对这个不太熟,这个地方纠正一下。

论坛徽章:
0
15 [报告]
发表于 2009-12-26 17:22 |显示全部楼层
哈哈哈,不得了不得了,这帖子都被挖坟出来了。
这还是当时我对C语言懵懂时发的,当时还有一系列和whyglinux争论的帖子。
后来事实证明了我那时候确实对很多概念搞不清楚,whyglinux对标准是真了解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP