2015-11-21 22 views

risposta

25

Senza la memoria parola chiave , Solidità cerca di dichiarare le variabili in stoccaggio.

Lead Solidity dev chriseth: "Si può pensare allo storage come a un array di grandi dimensioni che ha una struttura virtuale ... una struttura che non è possibile modificare in fase di esecuzione, è determinata dalle variabili di stato nel contratto".

In altre parole, la struttura della memoria viene impostata su pietra al momento della creazione del contratto in base alle dichiarazioni delle variabili a livello di contratto e non può essere modificata da future chiamate di metodo. MA - il contenuto di tale archivio può essere modificato con le chiamate sendTransaction. Tali chiamate cambiano "stato", motivo per cui le variabili a livello di contratto sono chiamate "variabili di stato". Quindi una variabile uint8 storagevar; dichiarato a livello di contratto può essere cambiato in qualsiasi valore valido di uint8 (0-255) ma quello "slot" per un valore di tipo uint8 sarà sempre lì.

Se si dichiarano variabili in funzioni senza la parola chiave memoria, la solidità proverà a utilizzare la struttura di archiviazione, che attualmente compila, ma può produrre risultati imprevisti. memoria dice solidity per creare un blocco di spazio per la variabile al runtime del metodo, garantendo le sue dimensioni e la struttura per l'utilizzo futuro in tale metodo.

memoria non può essere utilizzato a livello di contratto. Solo nei metodi.

Vedere lo the entry "What is the memory keyword? What does it do?" nelle Domande frequenti. Lo cito qui:

La macchina virtuale di Ethereum ha tre aree in cui è possibile memorizzare gli articoli.

Il primo è "archiviazione", dove risiedono tutte le variabili di stato del contratto. Ogni contratto ha una propria memoria ed è persistente tra le chiamate di funzione e piuttosto costoso da usare.

Il secondo è "memoria", utilizzato per contenere valori temporanei. Viene cancellato tra chiamate di funzione (esterne) ed è più economico da usare.

Il terzo è lo stack, utilizzato per contenere piccole variabili locali. È quasi gratis da usare, ma può contenere solo una quantità limitata di valori.

Per quasi tutti i tipi, non è possibile specificare dove devono essere memorizzati, poiché vengono copiati ogni volta che vengono utilizzati.

I tipi in cui la cosiddetta posizione di memoria è importante sono le strutture e gli array. Se ad es. passare tali variabili nelle chiamate di funzione, i loro dati non vengono copiati se possono rimanere in memoria o rimanere in memoria. Ciò significa che è possibile modificare il loro contenuto nella funzione chiamata e queste modifiche saranno comunque visibili nel chiamante.

Ci sono predefiniti per la posizione di memoria a seconda del tipo di variabile riguarda:

  • variabili di stato sono sempre in deposito
  • argomenti della funzione sono sempre in memoria
  • variabili locali di struct, matrice o l'archiviazione di riferimento del tipo di riferimento per impostazione predefinita
  • le variabili locali di tipo valore (ovvero né matrice, né struct né mapping) vengono memorizzate nello stack
+0

Hai qualche link ai documenti che lo spiegano? Mi piacerebbe leggere un po 'di più su come funziona lo storage. – Acapulco

+0

@Acapuclo È nelle domande frequenti "Qual è la parola chiave della memoria? Che cosa fa?" – bortzmeyer

Problemi correlati