Wie werden Speicherzeiger in der EVM-Schicht implementiert?

Ich versuche zu verstehen, wie Speicherzeiger funktionieren. Wenn man sich die ethereumjs-vm-Implementierung ansieht, scheint es, dass der tatsächliche Wert von SLOAD zurückgegeben wird. Behandelt der Compiler die "Zeiger"-Funktionalität? (d. h. ruft SSTORE auf, wenn es geändert wurde).

Antworten (1)

Ja, der Compiler übernimmt die Pointer-Funktionalität. Sie müssen einen Speicherzeiger nicht explizit dereferenzieren, wenn Sie in den Speicherort schreiben oder lesen möchten, auf den er zeigt.

Ich denke, die Tatsache, dass sie Pointer genannt werden, ist sehr verwirrend. Es erinnert mich an C-Zeiger, aber Speicherzeiger in Solidity ähneln viel mehr C++- oder PHP-Referenzen als C-Zeigern.

Soliditätshinweise:

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++-Referenzen (ähnlich Solidity-Zeigern):

int a = 1;
int& b = a;
b = 7;
// a is now 7

PHP-Referenzen (auch ähnlich wie Solidity-Zeiger):

$a = 1;
$b = &$a;
$b = 7;
// a is now 7

C-Zeiger ( sehr verschieden von Solidity-Zeigern):

int a = 1;
int* b = &a;
b = 7;
// a is now still 1
"Die Tatsache, dass sie Pointer genannt werden, ist sehr verwirrend" <-- Wo sehen Sie, dass sie Pointer genannt werden? Ich dachte, die Solidity-Dokumentation nennt sie Referenzen.
@smarx Zwei Auszüge aus der Solidity-Dokumentation: "Dies ist natürlich nicht der Fall, wenn Speicherzeiger als Funktionsargumente übergeben werden, wie dies bei den High-Level-Bibliotheken der Fall ist." "Mehrdimensionale Speicherarrays sind Zeiger auf Speicherarrays."
Pfui. Ich stimme zu, dass "Referenzen" ein viel besserer Begriff ist. Vielleicht ist ein Bug oder Pull Request angebracht.