¿Es una mala práctica usar sistemáticamente la memory
palabra clave para las variables declaradas dentro de una función (que no sea constructora)?
Es una buena práctica usar explícitamente memory
o storage
aclarar si una variable contiene un puntero a la memoria o al almacenamiento.
No siempre debe usar la memory
palabra clave, porque podría hacer que su código sea realmente ineficiente: cuando asigna una matriz desde el almacenamiento a una memory
variable de puntero, la matriz completa se leerá desde el almacenamiento y se copiará en la memoria.
Aquí hay un ejemplo de una situación en la que no debe usar memory
:
contract Test
{
uint256[1000] lotsOfNumbersInStorage;
uint256[1000] moreNumbersInStorage;
function calculateSomething(uint256 a) public view returns(uint256)
{
uint256[1000] memory theChosenArray;
if (a > 0) theChosenArray = lotsOfNumbersInStorage;
else theChosenArray = moreNumbersInStorage;
return theChosenArray[3] * theChosenArray[a];
}
}
Esas asignaciones theChosenArray
parecen inocentes, pero copiarán toda la matriz del almacenamiento a la memoria, lo que costará al menos 200 000 gas (200 gas por lectura de almacenamiento * 1000 elementos). En este caso, debe declarar theChosenArray
como un storage
puntero, no como un memory
puntero.
hartmut
jesús
hartmut
jesús