https://secureum.substack.com/p/solidity-201
126. Memory Layout
- Solidity의 메모리 배치 규칙은 Free Memory Pointer를 기반으로 동작
- 새로운 메모리 객체를 만들 때는 Free Memory Pointer가 가리키는 위치부터 차례로 할당
- 메모리는 절대 해제(free)되지 않음 → 한 번 사용한 영역은 재사용하지 않음
- Free Memory Pointer 초기값: 0x80
- 0x00 ~ 0x3F: 예약 영역 (특수 목적)
- 0x40: Free Memory Pointer 저장 위치
- 0x60: Zero slot (빈 storage 슬롯과의 충돌 방지용)
- 따라서 실제 자유 메모리 시작 주소는 0x80
127. Reserved Memory
Solidity는 EVM 메모리의 처음 128바이트(0x00 ~ 0x7F)를 특정 목적으로 예약(reserved)해서 사용합니다. 이 영역은 개발자가 직접 덮어쓰면 안 되며, 컴파일러와 EVM 내부 동작에 필수적입니다.
| 바이트 범위 |
크기 |
용도 |
| 0x00 ~ 0x3F |
64B |
Memory Layout & Arrays — 해시 계산 등 임시 데이터 저장 |
| 0x40 ~ 0x5F |
32B |
Free Memory Pointer — 현재 사용 가능한 메모리 시작 위치 |
| 0x60 ~ 0x7F |
32B |
Zero Slot — 동적 메모리 배열 초기값 저장, 절대 쓰기 금지 |
- 0x00 ~ 0x3F (Memory Layout & Arrays)
- Keccak256 같은 해싱 함수의 중간 계산값 임시 저장
- 함수 호출 시 ABI 인코딩 데이터 작업에도 사용
- 휘발성 → 호출 중간에 덮어쓰일 수 있음
- 0x40 ~ 0x5F (Free Memory Pointer)
- 현재 메모리에서 다음 데이터 할당 시작점을 저장
- mload(0x40) → 현재 포인터 값 읽기
- mstore(0x40, newPointer) → 새 할당 시작점 기록
- 초기값 = 0x80 (예약 영역 이후부터 데이터 저장)
- 0x60 ~ 0x7F (Zero Slot)
- 항상 0으로 초기화된 슬롯
- 동적 배열 초기값이나 빈 storage slot 참조 시 사용
- 절대 수정 금지 → 상태 불일치 및 ABI 파싱 오류 가능