Я пытаюсь понять, как работают указатели хранения. Глядя на реализацию ethereumjs-vm, кажется, что фактическое значение возвращается из SLOAD. Обрабатывает ли компилятор функцию «указатель»? (т.е. вызывает SSTORE, если он изменен).
Да, компилятор обрабатывает функциональность указателя. Вам не нужно явно отменять ссылку на указатель хранилища, когда вы хотите записывать или читать из места хранения, на которое он указывает.
Я думаю, что тот факт, что они называются указателями, очень сбивает с толку. Это напоминает мне указатели C, но указатели хранения в Solidity гораздо больше похожи на ссылки C++ или PHP, чем на указатели C.
Указатели прочности:
uint256[] public a;
constructor() public
{
a.push(1);
test(a);
}
function test(uint256[] storage b) private
{
b[0] = 7;
// a[0] is now 7
}
Ссылки C++ (аналогично указателям Solidity):
int a = 1;
int& b = a;
b = 7;
// a is now 7
Ссылки PHP (также похожие на указатели Solidity):
$a = 1;
$b = &$a;
$b = 7;
// a is now 7
Указатели C ( очень отличаются от указателей Solidity):
int a = 1;
int* b = &a;
b = 7;
// a is now still 1
пользователь19510
Иесбус
пользователь19510