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 |