Solidity

高效的結構排序以減少氣體

  • April 12, 2022

與以特定順序初始化狀態變數以節省氣體不同,這是否也適用於您聲明結構屬性的方式,其中您將較低uint的 s 並排放置?

// State arranged to save gas
contract Foobar {
   uint8 foo;
   uint8 bar;
   uint16 baz;
   uint num;
}

// Does the same concept apply to a struct as well?
struct Item {
   uint8 foo;
   uint8 bar;
   uint16 baz;
   uint num;
}

或者你可以在結構中瘋狂並以任何順序輸入它嗎?

如果您指的是儲存在其中的結構,那麼是的,適用的規則與文件storage中描述的規則完全相同:

  • 儲存槽中的第一項儲存低位對齊。
  • 值類型只使用儲存它們所需的字節數。
  • 如果值類型不適合儲存槽的剩餘部分,則將其儲存在下一個儲存槽中。
  • 結構體和數組數據總是開始一個新的槽,並且它們的項目根據這些規則被緊緊地打包。
  • 結構或數組數據之後的項目總是開始一個新的儲存槽。

然而,在記憶體中,每個元素都儲存在 32 個字節上,除了bytesstring你可以在這裡看到。

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