作者dryman (dryman)
看板Programming
标题Re: [请益] C 变数型态 可携
时间Wed Feb 6 10:40:25 2013
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 59.125.239.46
: ※ 编辑: descent 来自: 59.125.239.46 (02/05 11:27)
: → dryman:是descent大大(拜) 68.181.4.88 02/06 10:00
: 推 dryman:不过,integer promotion在C99中有规范 68.181.4.88 02/06 10:07
: → dryman:并不是implementation defined 68.181.4.88 02/06 10:08
: → dryman:我还要再查查C89有没有定义,因为之前我只 68.181.4.88 02/06 10:08
: → dryman:有读C99.... 68.181.4.88 02/06 10:08
: 推 dryman:C89也有integer promotion 68.181.4.88 02/06 10:11
: → dryman:C89是3.2.1.1,C99是6.3.1.1 68.181.4.88 02/06 10:13
C的规范其实还蛮有意思的,想要把C当成专长的人都最好读过一遍
毕竟用C就是希望能榨出硬体的效能
了解一个语法最後对应到机器是怎麽运作,会对自己的程式能力很有帮助
C的规范很特别,有时候它会故意设计出宽松的标准
让编译器自己决定那部份的程式行为该怎麽定义
而这样的设计可以促使编译器开发者写出能生出更快的程式的编译器
缺点是,这样的C程式,在不同编译器及不同平台上,就不一定相容
Clang blog上面有三篇在讲Clang如何利用undefined behavior来优化他们的编译器
http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
例如signed integer overflow
INT_MAX+1究竟是什麽值呢?这在C99中是没有规范的
所以Clang可以定义int的X+1 > X 永远为真
这有什麽好处呢?
例如
for (i = 0; i <= N; ++i) { ... }
可以被优化为
for (i = 0; i < N+1; ++i) { ... }
因为<的运算其实比<=还要快(这是组合语言上的差异)
在一些小且重要的回圈中,这可能就能让整体效能获得不少的提升
如果你实际上去看编译器编出的组合语言
你会发现这样的程式
for (i = 0; i <= INT_MAX; ++i) { ... }
会被改成
while (1) { ... }
很有意思吧!
虽然说都是C语言,但不仅各个不同编译器、不同环境表现出来的行为不同
同一个编译器,同一个环境下设定不同的参数,所得结果也可能大相迳庭
想要调出自己想要的最终结果,其实要花的功夫还蛮大的...
对了,对於C为什麽跨平台的type要订得那麽模糊,小弟有另外撰文说明之
http://www.idryman.org/blog/2012/12/03/the-design-of-c-integer-types/
请大家多多捧场XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 68.181.4.88
1F:推 suhorng:推 118.166.45.233 02/06 10:45
2F:推 bigbite:推推 123.195.61.74 02/06 10:48
3F:推 descent:推推推 59.125.239.51 02/06 10:55
4F:推 zhouer: 推推推推220.134.184.126 02/06 11:07
5F:推 youngglasses:感谢分享 36.231.51.191 02/06 11:17
6F:推 Mije: 推推推推推 118.165.207.45 02/06 12:33