Solidity
為什麼類型字節為每個元素浪費 31 個字節的空間?
Solidity文件 (v0.8.4)指出:
類型字節
$$ $$是一個字節數組,但由於填充規則,它為每個元素浪費了 31 個字節的空間(儲存中除外)。最好使用 bytes 類型。
我在網上找不到太多關於此的資訊。我有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 字節的字,是可以訪問的最小狀態儲存單元。
希望能幫助到你。