Tengo este contrato con estas funciones, ¿por qué cada uno usa una cantidad de gas diferente?
pragma solidity 0.4.24;
contract Foo {
//transaction cost: 21471 gas
//execution cost: 199 gas
//total cost: 21670 gas
function withoutNewS() external {
uint256[3] storage data;
}
//transaction cost: 21427 gas
//execution cost: 155 gas
//total cost: 21582 gas
function withoutNew() external {
uint256[3] data;
}
//transaction cost: 21533 gas
//execution cost: 261 gas
//total cost: 21794 gas
function withoutNewM() external {
uint256[3] memory data;
}
//transaction cost: 21607 gas
//execution cost: 335 gas
//total cost: 21942 gas
function withNewM() external {
uint256[] memory data = new uint256;
}
}
Esto se debe a que está aprovechando diferentes ubicaciones de memoria del EVM (la memoria y el almacenamiento tienen significados e implicaciones muy diferentes, como puede ver aquí, por ejemplo). Estos diferentes elementos tienen diferentes propósitos y siempre debe esforzarse por el que consume menos gas y que aún sea adecuado para su propósito, ya que EVM recompensa el código cuidadosamente optimizado con menos costos.