¿La EVM siempre asigna nueva memoria o puede reutilizar la memoria ya asignada, pero no utilizada?

¿La EVM siempre asigna nueva memoria o puede reutilizar la memoria ya asignada, pero no utilizada?

Leyendo los documentos para delete( http://solidity.readthedocs.io/en/develop/types.html ), se menciona que:

delete a assigns the initial value for the type to a. I.e. for integers it is equivalent to a = 0, but it can also be used on arrays, where it assigns a dynamic array of length zero or a static array of the same length with all elements reset. For structs, it assigns a struct with all members reset.

¿Significa esto que si aes una matriz dinámica ( uint[]) de, digamos, longitud n, entonces se delete aasigna a auna matriz vacía: a = new uint[](0)? ¿ No es la matriz original, de longitud n, con su contenido establecido en 0?

Entonces, si newy deletese usan muchas veces en un contrato de Solidity, ¿el EVM seguirá asignando memoria nueva (memoria en expansión) o reutilizará la memoria ya asignada cuando sea posible?

Considere el bucle:

uint[] a;
for (uint i = 0; i < 1000; ++i) {
   a = new uint[](100);
   delete a;
}

¿Esto asignará 100 o 100000 celdas de memoria?

Respuestas (1)

Esta es una pregunta interesante, así que escribí un código rápido para probarlo.

contract Memsize {
    function foo(uint _its) pure public returns (uint) {
        uint ms;
        uint[] memory a;
        for (uint i = 0; i < _its; ++i) {
            a = new uint[](100);
            delete a;
        }
        assembly{
            ms := msize()
        }
        return(ms);
    }
}

Resultados;

foo(1) 3392
foo(2) 6656
foo(3) 9920

Etc. Entonces, no, Solidity no reutiliza la memoria y se asigna nueva cada vez.

Esto no es una limitación de la EVM. No hay ninguna razón por la que la memoria no pueda reutilizarse. Es una propiedad del compilador Solidity.

Si realmente le interesan estas cosas (optimización de la eficiencia de los contratos inteligentes), entonces puede estar interesado en LLL como lenguaje de contrato. Algunos documentos aquí .

Gracias, una vez más por una excelente respuesta. No sabía cómo probarlo, así que gracias por tu código.