¿Se puede hacer referencia al almacenamiento sin copiarlo?

con por ejemplo

struct Foo {
    mapping(address => uint) b;
}

Foo[] foo;

si una función solo se ocupa de foo[4], ¿puede hacer referencia a ella desde el almacenamiento sin copiarla? es eso lo que

function c() {
    Foo memory p = foo[4];
}

¿hace?

Respuestas (1)

Para obtener una referencia de una variable en el estado del contrato, debe usar storageel calificador

function c() {
    Foo storage p = foo[4];
}

Dentro de la cfunción, todos los cambios también pse actualizarán .foo

no copia nada, verdad? si uso memory, ¿copia algo o es una referencia excepto que no se puede actualizar?
@cotld Si usa el calificador de memoria, creará una copia en la memoria de la estructura.
entonces, ¿es menos trabajo para el EVM storage? es storagemas barato en gasolina tambien?
@cotld El acceso al almacenamiento es más caro, leer un uint desde el almacenamiento cuesta 200 gas, desde la memoria son 3 gas, actualizar un uint desde el almacenamiento cuesta 5000 o 20000 gas. Pero la memoria es muy limitada, si usa demasiado, el costo aumenta rápidamente. En la práctica, debe probar diferentes enfoques para reducir el consumo de gas, es decir, usar solo almacenamiento, solo memoria o mezclar almacenamiento y memoria.