gcc(最新版本:4.8,4.9)是否具有類似於由icc支持的__assume()
內置的「假定」子句? 例如,__assume(n % 8 == 0);
gcc中的「假設」子句
7
A
回答
9
從gcc 4.8.2開始,在gcc中沒有__assume()的等價物。我不知道爲什麼 - 這將是非常有用的。 mafso建議:
#define __assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0)
這是一個古老的把戲,至少早在2010年就已知,可能更長。編譯器通常優化'cond'的評估,因爲任何對cond爲false的評估都是不確定的。然而,如果它包含對不透明(非內聯)函數的調用,它似乎並沒有優化'cond'。編譯器必須假定不透明的調用可能有副作用(例如,改變全局),並且不能優化掉呼叫,儘管它可以優化結果上的任何計算和分支。出於這個原因,宏觀方法充其量只是一個部分解決方案。
+1
在gcc 5.2和6.1中也遇到了這個問題。當基礎表達式不透明時,cond沒有被優化。即使cond被包裝在純函數中,你會認爲編譯器可以自由優化。 另外我還沒有找到一種方法來檢測編譯器是否優化了cond。這意味着使用這個宏可能會讓編譯器無聲地添加不必要的代碼,從而損害性能。 雖然透明的表達,但宏工作得很好。 – user377178 2016-08-03 20:25:00
相關問題
- 1. gcc,編譯,NO_GLIBC爲假
- 2. 假設()不適用於初始語句
- 3. z3py:假設來自(check-sat ...)語句
- 4. 在MYSQL查詢中使用WHERE子句中的假名
- 5. 使用忽略虛假值子句的IF語句
- 6. 使用gcc/ubuntu的if子句中的分段錯誤
- 7. 設置編輯=只是假的子類
- 8. 在C#中將日語句子轉換爲假名的庫?
- 9. 使用假設去除匹配語句中的個案
- 10. 個別關鍵句中的分離假設
- 11. 如果WHERE子句中的條件爲假,只需要HAVING子句中的約束條件
- 12. 假設中的處理
- 13. R中的假設因素
- 14. 句子建設者的Java
- 15. 添加假設不在當前假設
- 16. 因子子句中的子句
- 17. 假設在if語句中沒有發生簽名溢出
- 18. 匹配完整的句子跳過虛假的點
- 19. sql語句中的if子句中設置的語句不工作
- 20. Where子句返回所有行的假值?
- 21. 簡化假設
- 22. C#MSTest假設
- 23. COUNT(DISTINCT)子句中的WHERE子句
- 24. 宏停止if語句假
- 25. 假文件句柄創建
- 26. 使用中,如果「假」語句KSH
- 27. GroceryCrud設定where子句
- 28. 建設有Where子句C#
- 29. 在if語句中設置子類
- 30. gcc中彙編語句問題
請參閱:'__builtin_expect'? https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html – 2014-09-04 14:29:55
看起來像是分支預測,我需要提示向量化程序,循環計數是一個很好的數字。 – user2052436 2014-09-04 14:36:56
我無法訪問icc,它是否與Visual C __assume()相同? (http://msdn.microsoft.com/en-us/library/1b3fsfxw.aspx) – 2014-09-04 15:06:01