Solidity

為什麼類型字節為每個元素浪費 31 個字節的空間?

  • December 17, 2021

Solidity文件 (v0.8.4)指出:

類型字節

$$ $$是一個字節數組,但由於填充規則,它為每個元素浪費了 31 個字節的空間(儲存中除外)。最好使用 bytes 類型。

我在網上找不到太多關於此的資訊。我有3個問題:

  1. 在這種情況下,填充規則是什麼?
  2. 什麼被視為“元素”?
  3. 有這樣的例子嗎?

最小的可定址儲存塊是一個 32 字節的字。數組將元素放置在離散位置的單獨單詞中,因此每個單字節元素將位於其自己的插槽中。

即使打包了許多變數,最小的讀/寫操作也可以處理一個完整的單詞。

如果它們“適合”,編譯器會將它們打包。這struct可以在一個 SREAD 中讀取兩個變數:

struct TwentyOne {
 address a;
 bool b;
}

TwentyOne[] ;

“字節數組”有一個字來儲存數組的長度,一個字代表數組中的每個元素。這是因為它需要能夠“跳”到一行。考慮到記憶體的組織方式大致如下:

  • 長度 => EVM“插槽”:3(uint256 字)
  • row1 => EVM“槽”:1字節,31浪費
  • row2 => EVM“槽”:1字節,31浪費
  • row3 => EVM“槽”:1字節,31浪費

“槽”始終是一個 32 字節的字,是可以訪問的最小狀態儲存單元。

希望能幫助到你。

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