mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Create empty dynamic memory arrays more efficiently.
This commit is contained in:
committed by
Alex Beregszaszi
parent
c63efebd45
commit
0cbe55005d
@@ -647,6 +647,11 @@ Solidity manages memory in a very simple way: There is a "free memory pointer"
|
||||
at position ``0x40`` in memory. If you want to allocate memory, just use the memory
|
||||
from that point on and update the pointer accordingly.
|
||||
|
||||
The first 64 bytes of memory can be used as "scratch space" for short-term
|
||||
allocation. The 32 bytes after the free memory pointer (i.e. starting at ``0x60``)
|
||||
is meant to be zero permanently and is used as the initial value for
|
||||
empty dynamic memory arrays.
|
||||
|
||||
Elements in memory arrays in Solidity always occupy multiples of 32 bytes (yes, 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
|
||||
|
||||
@@ -64,12 +64,15 @@ The position of ``data[4][9].b`` is at ``keccak256(uint256(9) . keccak256(uint25
|
||||
Layout in Memory
|
||||
****************
|
||||
|
||||
Solidity reserves three 256-bit slots:
|
||||
Solidity reserves four 32 byte slots:
|
||||
|
||||
- 0 - 64: scratch space for hashing methods
|
||||
- 64 - 96: currently allocated memory size (aka. free memory pointer)
|
||||
- ``0x00`` - ``0x3f``: scratch space for hashing methods
|
||||
- ``0x40`` - ``0x5f``: currently allocated memory size (aka. free memory pointer)
|
||||
- ``0x60`` - ``0x7f``: zero slot
|
||||
|
||||
Scratch space can be used between statements (ie. within inline assembly).
|
||||
Scratch space can be used between statements (ie. 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).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user