¿Por qué no puedo especificar la ubicación de almacenamiento para números enteros?

Según la documentación de Solidity ,

Para casi todos los tipos, no puede especificar dónde deben almacenarse, porque se copian cada vez que se usan.

He jugado con esto en Remix tratando de entenderlo con el siguiente código. Esperaría que al agregar "almacenamiento" a la función "inc", podría usarlo para cambiar múltiples unidades globales, pero el "almacenamiento" está reservado para estructuras y matrices.

Tengo problemas para entender el razonamiento detrás de esto: que esto no se puede hacer "porque se copian cada vez que se usan". Considero que esto significa que cada vez que se usa un uint en una función, se hace una copia en la memoria, y no se puede hacer nada al respecto. Pero puedo modificar un uint global dentro de una función diciendo, por ejemplo, "número1 += 1", y esto se guardará en el estado. Entonces, no entiendo por qué se debe hacer una copia cada vez.

pragma solidity ^0.4.0;

contract C {
    uint public number1;
    uint public number2;

    function incOne() public view {
        inc(number1);
    }

    function incTwo() public view {
        inc(number2);
    }

    function inc(uint storage d) internal pure {
        d += 1;                                         
    }
}

Respuestas (1)

uinty todos los demás tipos primitivos son de tipo valor y no de tipo referencia. Eso significa que el valor de estas variables se copia cada vez que se usan.

structsy arraysson tipos de referencia, por lo que puede especificar la storageubicación y, cuando lo haga, apuntará a la referencia del objeto pasado en la función en lugar de tener el valor en la memoria.

Los tipos en los que la llamada ubicación de almacenamiento es importante son estructuras y matrices. Si, por ejemplo, pasa tales variables en llamadas a funciones, sus datos no se copian si pueden permanecer en la memoria o en el almacenamiento. Esto significa que puede modificar su contenido en la función llamada y estas modificaciones seguirán siendo visibles en la persona que llama.

La información de esta cita ahora es incorrecta y debe editarse. "El valor predeterminado para los parámetros de función (incluidos los parámetros de retorno) es la memoria..." Eso se refiere específicamente a tipos de datos complejos. solidity.readthedocs.io/en/v0.4.24/types.html#data-ubicación