¿Por qué usar diferentes gases?

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;
  }
}

Respuestas (1)

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.