Evm

uint f = 0, f *= 計算重函式(),EVM 是否執行計算重函式()?

  • November 26, 2019
uint f = 0;
f *= computationallyHeavyFunction();

EVM 是執行computationallyHeavyFunction(),還是評估 f = 0 然後省略進一步的計算?

它執行它。

第一行轉換fuint. =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 似乎並非如此。

引用自:https://ethereum.stackexchange.com/questions/77808