Structs

Structs in memory

  • Allocating a struct to memory:

struct Point {
        uint256 x;
        uint256 y;
    }

function memPointer() external {
        bytes32 x40;
        assembly {
            x40 := mload(0x40) // check contents of the free memory pointer 
        }
        emit MemoryPointer(x40); // returns 0x80 -> 128 
        Point memory p = Point({x: 1, y: 2}); // allocate a struct in memory 

        assembly {
            x40 := mload(0x40) 
        }
        emit MemoryPointer(x40); // returns 0xc0 -> 192 
    }

// 0xc0 - 0x80 = 64 bytes -> two uint256s (size of the struct) 
  • Seeing msize in action:

function memPointerV2() external {
        bytes32 x40;
        bytes32 _msize;
        assembly {
            x40 := mload(0x40)
            _msize := msize()
        }
        emit MemoryPointerMsize(x40, _msize); // 0x80, 0x60 (since in betwyeen is empty) 

        Point memory p = Point({x: 1, y: 2});
        assembly {
            x40 := mload(0x40)
            _msize := msize()
        }
        emit MemoryPointerMsize(x40, _msize); // 0xc0, 0xc0 

        assembly {
            pop(mload(0xff)) // read a future byte but not write 
            x40 := mload(0x40)
            _msize := msize()
        }
        emit MemoryPointerMsize(x40, _msize); // 0xc0, 0x120 
    }

Last updated