[問題] 以下程式要如何作最佳化?

看板C_and_CPP作者 (問號)時間12年前 (2013/05/17 22:21), 編輯推噓4(4020)
留言24則, 11人參與, 最新討論串1/4 (看更多)
int a,b; if(a*b==1 || a*b==5) { .... } 上面的程式碼,a*b會執行兩次,但我確定兩次結果一樣 我希望它執行一次就好 我知道可以改成這樣: int a,b; int c=a*b; if(c==1 || c==5) { .... } 但是這樣我還得多宣告一個變數c,很麻煩 有類似這樣的寫法嗎: int a,b; if( a*b(==1 || ==5) ) //語法大概不對,不過大家應該了解我的意思 { .... } 還請各位幫忙解答 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.35.84.52

05/17 22:25, , 1F
第一種就好 現代 compiler 很聰明的
05/17 22:25, 1F

05/17 22:25, , 2F
gcc 開 -O1 基本上有沒有 c 來當暫存都會產生一樣的程式
05/17 22:25, 2F

05/17 22:25, , 3F
相信compiler不會讓他做兩次
05/17 22:25, 3F

05/17 22:30, , 4F
那如果是呼叫函式呢,比如說 STL vector的size() ?
05/17 22:30, 4F

05/17 22:48, , 5F
我以為會做兩次耶...所以我會用第二種
05/17 22:48, 5F

05/17 22:53, , 6F
-O1也沒有呼叫兩次
05/17 22:53, 6F

05/17 22:53, , 7F
這端看你的函式, 例如STL的size()可能編譯器知道它絕對沒
05/17 22:53, 7F

05/17 22:53, , 8F
有副作用, 所以優化掉了
05/17 22:53, 8F

05/17 22:57, , 9F
但如果是隨便什麼資訊都沒有的函式也不能優化掉..
05/17 22:57, 9F

05/17 23:01, , 10F
可以說明哪些函式會被視為"可最佳化"嗎
05/17 23:01, 10F

05/18 00:48, , 11F
與其去猜會不會最佳化 還不如就暫存到c
05/18 00:48, 11F

05/18 00:49, , 12F
而且有時候你要debug不能開最佳化 那時速度就有差了
05/18 00:49, 12F

05/18 01:01, , 13F
根據 80/20 法則除非你確定程式效能卡在這不然以好讀為主
05/18 01:01, 13F

05/18 02:49, , 14F
(a = a*b) == 1 || a == 5
05/18 02:49, 14F

05/18 02:55, , 15F
不差多宣告一個變數,善用immutable變數讓別人讀程式更輕鬆
05/18 02:55, 15F

05/18 03:19, , 16F
你可以考慮一下a和b的範圍 然後使用位元運算
05/18 03:19, 16F

05/18 03:21, , 17F
如果a和b為正數 那只有a和b都是1 或是一個是1一個是5
05/18 03:21, 17F

05/18 23:58, , 18F
會不會做兩次,答案是"不一定"...
05/18 23:58, 18F

05/19 00:48, , 19F
宣告c哪會麻煩,可以順便用變數名稱解釋這個運算的意義
05/19 00:48, 19F

05/19 22:25, , 20F
→ andrenvq57:(a = a*b) == 1 || a == 5
05/19 22:25, 20F

05/19 22:25, , 21F
可以請高手或這位網友說明一下原理嗎
05/19 22:25, 21F

05/19 22:28, , 22F
雖然不用多宣告c 但這樣會更動到a的值吧?
05/19 22:28, 22F

05/20 19:23, , 23F
if ( (a*b)&0xFFFFFFFB == 1 )
05/20 19:23, 23F

05/20 19:27, , 24F
前面a*b賦值給a後面就相當於判斷a*b==5
05/20 19:27, 24F
文章代碼(AID): #1HbZppl9 (C_and_CPP)
文章代碼(AID): #1HbZppl9 (C_and_CPP)