mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
39 lines
1.7 KiB
ReStructuredText
39 lines
1.7 KiB
ReStructuredText
|
|
.. index: memory layout
|
|
|
|
****************
|
|
Layout in Memory
|
|
****************
|
|
|
|
Solidity reserves four 32-byte slots, with specific byte ranges (inclusive of endpoints) being used as follows:
|
|
|
|
- ``0x00`` - ``0x3f`` (64 bytes): scratch space for hashing methods
|
|
- ``0x40`` - ``0x5f`` (32 bytes): currently allocated memory size (aka. free memory pointer)
|
|
- ``0x60`` - ``0x7f`` (32 bytes): zero slot
|
|
|
|
Scratch space can be used between statements (i.e. within inline assembly). The zero slot
|
|
is used as initial value for dynamic memory arrays and should never be written to
|
|
(the free memory pointer points to ``0x80`` initially).
|
|
|
|
Solidity always places new objects at the free memory pointer and
|
|
memory is never freed (this might change in the future).
|
|
|
|
Elements in memory arrays in Solidity always occupy multiples of 32 bytes (this
|
|
is even true for ``byte[]``, but not for ``bytes`` and ``string``).
|
|
Multi-dimensional memory arrays are pointers to memory arrays. The length of a
|
|
dynamic array is stored at the first slot of the array and followed by the array
|
|
elements.
|
|
|
|
.. warning::
|
|
There are some operations in Solidity that need a temporary memory area
|
|
larger than 64 bytes and therefore will not fit into the scratch space.
|
|
They will be placed where the free memory points to, but given their
|
|
short lifetime, the pointer is not updated. The memory may or may not
|
|
be zeroed out. Because of this, one should not expect the free memory
|
|
to point to zeroed out memory.
|
|
|
|
While it may seem like a good idea to use ``msize`` to arrive at a
|
|
definitely zeroed out memory area, using such a pointer non-temporarily
|
|
without updating the free memory pointer can have unexpected results.
|
|
|
|
.. index: calldata layout |