Re: [請益] C 變數型態 可攜
: ※ 發信站: 批踢踢實業坊(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
推
02/06 10:45, , 1F
02/06 10:45, 1F
推
02/06 10:48, , 2F
02/06 10:48, 2F
推
02/06 10:55, , 3F
02/06 10:55, 3F
推
02/06 11:07, , 4F
02/06 11:07, 4F
推
02/06 11:17, , 5F
02/06 11:17, 5F
推
02/06 12:33, , 6F
02/06 12:33, 6F
討論串 (同標題文章)