Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- HIG
- 리팩토링
- 리펙터링
- rxswift
- ribs
- tableView
- uiscrollview
- Clean Code
- 리펙토링
- RxCocoa
- ios
- MVVM
- map
- clean architecture
- Xcode
- swift documentation
- Human interface guide
- Protocol
- combine
- 클린 코드
- SWIFT
- collectionview
- UITextView
- Observable
- Refactoring
- 스위프트
- uitableview
- swiftUI
- UICollectionView
- 애니메이션
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 2. Swift 메모리 할당 - 타입별 메모리 할당 위치 분석 기본 (stack, heap) 본문
iOS 응용 (swift)
[iOS - swift] 2. Swift 메모리 할당 - 타입별 메모리 할당 위치 분석 기본 (stack, heap)
jake-kim 2023. 8. 12. 01:091. Swift 메모리 할당 - address 확인 방법, withUnsafePointer, Memory Graph Debugger, vmmap
2. Swift 메모리 할당 - 타입별 메모리 할당 위치 분석 기본 (stack, heap)
3. Swift 메모리 할당 - 타입별 메모리 할당 위치 분석 심화 (String타입, struct안에 class, class안에 struct)
4. Swift 메모리 할당 - MALLOC, MALLOC guard, dyld private memory, Shared memory, ColorSync (vmmap PID)
사전지식) 메모리 표현 식 (16진수, Byte, bit)
- 0x16d2dc000의 의미?
- 16진수(hexadecimal)로 표현된 메모리 주소
- 16진수는 숫자 앞에 0x를 붙여서 표현
ex)
- 16진수: 한자리에 16개의 숫자 표현이 가능
- 2진수: 한자리에 2개의 숫자 표현이 가능
- 1바이트: 8진수 (한 자리에 8자리 표현이 가능)
- 2바이트: 16진수 (한 자리에 16자리 표현이 가능)
- 보통 메모리 주소를 표현할 때는 16진수로 총 16개로 표현하기 때문에, 앞에 0x를 붙여서 표현
- 16진수 한 자리는 4개의 bit로 표현할 수 있으므로, 16진수 2개는 곧 8bit
- 16진수 두 개씩 끊어서 보여주는 곳이 많은데 이유는 16진수 2개가 곧 1byte이므로 바이트 단위로 보기 위함
메모리 할당 위치 알아내기 (Stack vs Heap)
- 예제로 사용할 proprety 준비
- 이전 포스팅 글에서 알아본 vmmap <PID> | grep stack을 사용하여 stack 범위 확인
- break point를 걸고 메모리 주소를 확인한 다음 이 메모리 주소가 stack영역에 포함되는지 확인
ex 1) Int 프로퍼티 메모리 할당 위치 파악하기
목적) Int 프로퍼티는 value type이므로 stack 메모리 영역에 위치할 것인데 이것을 직접 확인
- 메모리 확인하는 함수 준비
@inlinable func printMemoryAddress<T>(_ o: inout T) {
withUnsafePointer(to: &o) { print($0) }
}
- 확인
- PID 확인
- intValue 주소 확인
- 메모리 속 stack 주소 범위 확인
- vmmap <PID> | grep Stack
vmmap 61064 | grep Stack
- 해석
- 스레드 0의 스택 영역의 크기는 56MB이며 주소 범위는 0x16b268000 ~ 0x16ba64000
- 스레드 1의 스택 영역의 크기는 16k이며 주소 범위는 0x16baf4000 ~ 0x16bb7c000
- 스레드 2의 스택 영역의 크기는 16k이며 주소 범위는 0x16bc0c000 ~ 0x16bc94000
- 위 메모리 주소는 9자리로 나오는데, 보통 16진수로 표현하므로 0x가 앞에 붙이고 앞에 0을 붙여주어야함 (실제로는 16진수로 16개의 숫자로 표현)
- 0이 암묵적으로 생략되어 있어서, 직접 7개를 붙여주어야 메모리 전체 주소
- 16b858000 -> 0x000000016b858000
- 표현 (16진수 두 개씩 끊어서 표현 2^8 즉 1byte): 00 00 00 01 6b 85 80 00
- intValue 프로퍼티의 메모리 주소는 0x000000016ba5f8d0 이므로 이 값은 스레드 0의 스택 메모리 범위(0x16b268000 ~ 0x16ba64000) 에 속하므로 heap이 아닌 stack영역에 할당 확인이 가능
cf) Int 타입은 예상한대로 stack영역에 속하지만, String타입, struct안에 class가 있는 타입, class안에 struct가 있는 타입들은 어느 메모리 영역에 저장되는지 쉽게 예측이 불가능
- 다음 포스팅 글에서 계속
'iOS 응용 (swift)' 카테고리의 다른 글
Comments