Evm
uint f = 0, f *= 計算重函式(),EVM 是否執行計算重函式()?
uint f = 0; f *= computationallyHeavyFunction();
EVM 是執行
computationallyHeavyFunction()
,還是評估 f = 0 然後省略進一步的計算?
它執行它。
第一行轉換
f
為uint
.=0
是 pointess 因為它預設為0
.第二行呼叫一個函式並將響應分配給
f
.也可以:
uint f = 0 * computationallyHeavyFunction();
當然,無論如何
f
都是。0
希望能幫助到你。
確實它執行它。不過,第一點是,這是 Solidity 編譯器的屬性,而不是 EVM 本身 - 如果它認為它是正確的,它可以不生成 EVM 字節碼,因此它不會執行。
但是,有一個副作用的問題。的結果
computationallyHeavyFunction()
可能無關緊要,但該函式可能會修改儲存或生成異常。考慮這段程式碼:contract optimisationTest{ bool public flag; uint public foo; function setFlag() internal returns (uint256) { flag = true; return 1; } function complexCode() internal pure returns (uint256) { uint256 j; for (uint256 i = 0; i < 100; i ++) { j += i; } return j; } function test() public { foo = 0 * setFlag(); foo = 0 * complexCode(); } }
除非在語言定義中特別提到在這種情況下不呼叫右側函式,否則由優化器使用靜態分析或類似方法來解決。
我對此進行了優化編譯。兩者都在 Solidity 5.11 中被呼叫——我用調試器檢查了後者
setFlag()
。complexCode()
第二個確實可以在優化器中被淘汰,但今天的 Solidity 似乎並非如此。