Objective-C 에서 인 스 턴 스 가 차지 하 는 메모리 크기 에 대한 자세 한 설명

머리말
계속이전 글의 소 개 를 받 으 면 이 글 이 탄생 하면 된다.먼저 보 는 것 을 권장 합 니 다Objective-C 클래스 의 데이터 구조.이 두 부분의 내용 은 끊 을 수 없 기 때문에 먼저 보 는 것 을 권장 합 니 다.
다음 테 마 는 Objective-C 에서 인 스 턴 스 가 차지 하 는 메모리 크기 입 니 다.
다음은 모두 64bit 로 분석 한 것 이다.
1.instance 가 차지 하 는 메모리 크기
이러한 Class 를 먼저 정의 합 니 다:

//     
@interface SizeObject : NSObject
{
 @private
 int _no;
 // int _age;
}
@end

//     
@implementation SizeObject
@end
주로 SizeObject 에 멤버 변 수 를 추가 합 니 다 intno;
다음 코드 실행:

- (void)objSize {
 // class_getInstanceSize           #import <objc/runtime.h>
 NSLog(@"%zd, %zd", class_getInstanceSize([NSObject class]), class_getInstanceSize([SizeObject class]));
 //     : 8, 16
}
결론:NSObject 의 인 스 턴 스 대상 이 사용 하 는 메모리 크기 는 8 바이트 입 니 다.그리고 int 형식의 다음 SizeObject 의 인 스 턴 스 를 추가 하여 사용 하 는 메모리 크기 는 16 바이트 입 니 다.이게 무슨 이유 일 까요?
Objective-C 클래스 의 데이터 구조을 통 해 NSOject 에 멤버 변수 인 Class isa 가 있다 는 것 을 알 수 있 습 니 다.사실은 Class 는 포인터 형식 입 니 다.그 밖 에 다른 멤버 변수 가 없 기 때문에 NSObject 의 인 스 턴 스 메모리 크기 는 8 바이트 입 니 다.그런데 왜 SizeObject 는 16 바이트 일 까요?int 형식의 구성원 변 수 를 하나 더 만 들 었 을 뿐 int 는 4 바이트 에 불과 합 니 다.다음은 이상 의 코드 intage;또한,실행 코드 인 SizeObject 의 크기 는 16 바이트 입 니 다.int 구성원 변수 가 하나 더 있 는 지 여 부 는 변 함 이 없습니다.주 된 원인 은 주소 정렬 원칙 에 의 해 결정 된다.
2.instance 실제 메모리 사용 공간
위 에서 제시 한 Class 의 구성원 변수 중 차지 하 는 공간 은 클래스 의 메모리 레이아웃 을 통 해 결 정 됩 니 다.즉,구성원 변수 입 니 다.그러나 실제+alloc 이후 인 스 턴 스 대상 에 서 는 메모리 주 소 를 얼마나 사용 합 니까?또 하나의 함수 가 mallocsize 는 시스템 이 실제 분배 한 메모리 공간 을 계산 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다.

- (void)objectSize {
 //    alloc      
 NSObject* obj = [NSObject alloc];
 // malloc_size     #import <malloc/malloc.h>
 NSLog(@"%zd, %zd", class_getInstanceSize([NSObject class]), malloc_size((__bridge void *)obj));
 //     : 8, 16
}
인쇄 결 과 는 모두 8,6 이다.실제+alloc 에서 나 온 대상 은 8 이 아니 라 16 이라는 뜻 이다.하지만-object Size 방법의 NSObject 를 SizeObject 로 바 꾸 면 인쇄 는 16,16 입 니 다.두 함수 의 결 과 는 같은 것 같다.맞습니다.NSObject 는 특례 입 니 다.지금 NSProxy 를 꼭 해 보고 싶 지 않 습 니까?결론 은 NSObject 와 같 습 니 다.
그렇다면 문 제 는:왜 그 럴 까?

원본 코드 를 보면 이 allocWithZone 에서 calloc 를 찾 는 과정 을 시작 하면 위의 그림 에서 메모리 주소 크기 를 되 돌려 주 는 함 수 를 찾 을 수 있 습 니 다.이 를 통 해 알 수 있 듯 이 Objective-C 의 대상 은 메모리 공간 을 진정 으로 분배 할 때 적어도 16 개의 바이트 이다.NSObject 나 NSObject 에 계승 되 는 하위 클래스 처럼 구성원 속성 을 추가 하지 않 은 Class 대상 은 모두 이 렇 습 니 다.8 바이트 의 공간 이 구성원 변수 에 사용 되 지 않 아 다른 곳 에 사용 할 수 있 습 니 다.
이 시리즈 의 글 은 다음 과 같다.
1、 Objective-C 클래스 의 데이터 구조
2、 Objective-C 의 인 스 턴 스 가 차지 하 는 메모리 크기
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기