Aunque en las últimas versiones del compilador de solidity, se ha dejado claro que para las variables de referencia locales a una función, ahora se debe mencionar explícitamente su modificador de ubicación (memoria, almacenamiento), eliminando así toda la confusión sobre su naturaleza predeterminada.
Pero aún no está claro dónde están almacenadas todas las variables locales definidas como uint, uint8, bool, address, enum, etc. ¿Está almacenado en el almacenamiento, la memoria o la pila?
Los tipos escalares primitivos:
residen en el almacenamiento cuando se declaran globalmente, y en la memoria cuando se declaran en funciones.
contract Locations {
// storage
bool switch;
uint number;
address account;
function doSomething() public pure {
// memory
bool switch2;
uint number2;
address account2;
}
}
Espero eso ayude.
Las variables se pueden almacenar de 3 maneras en solidez: almacenamiento, memoria y pila.
Almacenamiento: El almacenamiento es donde residen todas las variables de estado del contrato. Cada contrato tiene su propio almacenamiento y es persistente entre llamadas de función y bastante costoso de usar.
Memoria: la memoria es más barata de usar ya que almacena valores temporalmente. Se borra entre llamadas a funciones externas. La memoria no es persistente.
Pila: Casi de uso gratuito. La pila se puede usar para contener pequeñas variables locales, pero solo limitadas en número.
Los tipos de variables complejas, que no siempre caben en 256 bits, deben manejarse con cuidado. Por ejemplo, las matrices y las estructuras tienen una anotación adicional, denominada "ubicación de datos", que indica dónde se almacenan en la memoria o en el almacenamiento.
Entonces, puedes usar el siguiente concepto:
Ubicación de datos forzada:
parámetros (no retorno) de funciones externas: calldata
variables de estado: almacenamiento
Ubicación de datos predeterminada:
parámetros (también retorno) de funciones: memoria
todas las demás variables locales: almacenamiento
Además, eche un vistazo a: Almacenamiento y memoria - Solidity Docs
Kombo
willjgriff
memory
,storage
ocalldata
(creocalldata
que solo se especifica para argumentos enexternal
llamadas a funciones,msg.data
también se conoce comocalldata
).