Скажем, я объявляю сопоставление, которое использует числа uint256 в качестве ключей и сопоставляет их с одним 8-битным символом. Я добавляю 5 участников в это сопоставление.
Очевидно, что затем я могу получить доступ к любому из этих 5 символов, используя соответствующие индексы.
Итак, что я хочу знать, потребляет ли это отображение 5 * 8 = 40 бит памяти или 5 * 8 + 5 * 256 = 1320 бит?
Отображение — это динамический тип, работающий как хранилище (а не память) базы данных ключ-значение.
возьмем следующий пример
contract C {
mapping(uint256 => uint256) items;
function C() {
items[0xC0FEFE] = 0x42;
}
}
Ассемблерный код для функции C будет содержать:
// Storing 0x42 to the address 0x798...187c
0x42
0x79826054ee948a209ff4a6c9064d7398508d2c1909a392f899d301c6d232187c
sstore
что означает, что мы сохраняем значение 0x42
в значении, соответствующем ключу 0x79826054ee948a209ff4a6c9064d7398508d2c1909a392f899d301c6d232187c
, который является хэшем ключа сопоставления0xC0FEFE
вот интересное обсуждение того, почему сопоставление не может быть разработано для использования памяти. Почему (концептуально) сопоставления не могут быть локальными переменными?
Sc4R
Бадр Беллай
Исмаэль
Бадр Беллай