Kann auf Speicher verwiesen werden, ohne kopiert zu werden?

Mit zum Beispiel

struct Foo {
    mapping(address => uint) b;
}

Foo[] foo;

Wenn eine Funktion nur foo[4] behandelt, kann sie sie aus dem Speicher referenzieren, ohne sie zu kopieren? ist das was

function c() {
    Foo memory p = foo[4];
}

tut?

Antworten (1)

Um eine Referenz von einer Variablen im Vertragsstatus zu erhalten, müssen Sie storageeinen Qualifizierer verwenden

function c() {
    Foo storage p = foo[4];
}

Innerhalb der cFunktion werden auch alle Änderungen an paktualisiert foo.

es kopiert nichts, richtig? Wenn ich verwende memory, kopiert es irgendetwas oder ist es eine Referenz, außer dass es nicht aktualisiert werden kann?
@cotld Wenn Sie den Speicherqualifizierer verwenden, wird eine Kopie der Struktur im Speicher erstellt.
Also ist es weniger Arbeit für die EVM zu verwenden storage? ist storageBenzin auch billiger?
@cotld Der Zugriff auf den Speicher ist teurer, das Lesen eines Uint aus dem Speicher kostet 200 Gas, aus dem Speicher 3 Gas, das Aktualisieren eines Uint aus dem Speicher kostet 5000 oder 20000 Gas. Aber der Speicher ist sehr begrenzt, wenn Sie zu viel verwenden, wachsen die Kosten schnell. In der Praxis müssen Sie verschiedene Ansätze ausprobieren, um den Gasverbrauch zu reduzieren, dh nur Speicher, nur Speicher verwenden oder Speicher und Speicher mischen.