itsource

Objective-C에서 개체 크기 확인

mycopycode 2023. 10. 19. 22:17
반응형

Objective-C에서 개체 크기 확인

objective-c 객체의 크기를 찾으려고 합니다.저는 다음과 유사한 것을 사용하고 있습니다.

    NSLog(@"sizeof myObject: %ld", sizeof(*myObject));

그 정도면 포인터의 크기를 알 수 있습니다.

내가 뭘 잘못하고 있는 거지?

컴파일러가 알고 있는 것은 포인터뿐이고, 그래서 포인터의 크기를 다시 돌려받는 것입니다.할당된 개체의 크기를 보려면 다음 코드 조각 중 하나를 사용합니다.

ARC 포함:

#import <malloc/malloc.h>

// ...

NSLog(@"Size of %@: %zd", NSStringFromClass([myObject class]), malloc_size((__bridge const void *) myObject));

ARC 미포함:

#import <malloc/malloc.h>

// ...

NSLog(@"size of myObject: %zd", malloc_size(myObject));

Mike Ash는 http://mikeash.com/ ?page=pyblog/friday-qa-2009-03-13-intro-to-the-objective-c-runtime에 Obj-C 런타임 내부에 대한 적절한 정보를 가지고 있습니다.

GNU Objective-C 런타임에서는 다음을 사용할 수 있습니다(가져와야 함).<objc/objc-api.h>:

class_get_instance_size ([MyClass class]);

Mac OS X에서는 사용할 수 있습니다(가져올 필요가 있을 수 있음).<objc/runtime.h>):

class_getInstanceSize ([MyClass class]);

이러한 함수는 개체를 할당하는 데 필요한 메모리의 양을 반환하며, 초기화할 때 개체가 할당한 메모리는 포함하지 않습니다.

우선, 위의 게시물을 통해 Jason과 Mac OS 참조 매뉴얼에 제시된 대로 malloc_size(myObject)로 객체 크기가 부여됨이 분명하다고 생각합니다.

"malloc_size(ptr) 함수는 ptr이 가리키는 할당을 백업하는 메모리 블록의 크기를 반환합니다.메모리 블록 크기는 항상 백업하는 할당만큼 크며, 더 클 수도 있습니다." (http://developer.apple.com/library/mac/ #document/Darwin/Reference/ManPages/man3/malloc_size.3.html)

그러나 사전의 크기를 알아보려면 다음 사항을 유의해야 합니다.

사전은 키-값 쌍을 저장하며 값 부분에 개체 자체를 포함하지 않고 "추가"할 개체의 보존 횟수만 늘리고 해당 개체 자체에 대한 참조를 유지합니다.이제 사전 자체에 다양한 개체에 대한 참조가 포함되어 있습니다(키가 연결되어 있음).따라서 사전에서 참조하는 모든 개체의 개체 크기를 찾고 있다면 엄밀히 말하면 사전의 크기가 아닐 것입니다.사전의 크기는 모든 키의 크기와 키에 대한 모든 값 참조의 크기의 합 및 상위 NSO 개체의 크기입니다.참조된 개체의 크기도 확인하고 싶다면 사전 값 배열 위에서 반복해 보십시오.

NSArray *myArray = [myDictionary allValues];
id obj = nil;
int totalSize = 0;
for(obj in myArray)
{
    totalSize += malloc_size(obj);
}
//totalSize now contains the total object size of the refered objects in the dictionary.

그 질문에 답하기를 바랍니다.

(객관적-c) 개체의 크기는 정의하기도 쉽지 않기 때문에 찾기가 쉽지 않습니다."목적어-c 객체의 크기"는 무엇을 의미합니까?

참조의 크기는 포인터의 크기입니다((obj_ref)의 크기로 반환됨).

생성 시 할당된 메모리의 크기(+alloc)는 제이슨이 첫 번째 답변에서 제시한 방법으로 알 수 있습니다.하지만 이는 런타임에 따라 달라집니다.gnu-runtime은 apple-runtime과 다릅니다.결국 인스턴스가 구성하는 기본 데이터 유형에 필요한 메모리만 사용할 수 있습니다.그러나 ivar 또는 문자열이 참조하는 개체에 대해 나중에(즉, 초기화(-init)) 할당할 수 있는 메모리는 아닙니다.

클래스의 예

@interface FirstClass
{
    int _someInt;
    char _someChar;
}
…
@end

최소 5바이트가 필요합니다(많은 시스템에서 -int크기는 달라질 수 있음)과 런타임에 필요한 경우 정적 오버헤드가 추가됩니다.그러한 물체의 크기는 명백합니다.

하지만 수업의 한 예로

@interface SecondClass
{
    FirstClass *_someObject;
    char *_name;
    id _data;
}
…
@end

"크기"의 정의는 복잡합니다.개체에는 12바이트(32비트 시스템)와 할당에 대한 오버헤드가 필요합니다.그러나 이름은 개체의 일부이며 개체에 의해 할당/자유로워질 수도 있습니다.실제 이름이 필요한 메모리는 개체 크기의 일부여야 합니까?그리고 참조된 물체들은?

를 사용하는 것을 제안합니다.class_getInstanceSize그리고.malloc_good_size어떤 결과를 가져올지 알기 위해서입니다이것은 아이바와 반환된 크기 안에 없는 것을 보여주지 않습니다.

#import <malloc/malloc.h>
#import <objc/runtime.h>

NSLog(@"Object Size: %zd", malloc_good_size(class_getInstanceSize([yourObject class])));

클래스 설명에는 크기 정보가 포함되어 있다고 생각합니다. -- 를 사용하여 쿼리하는 것보다 이것을 검색하는 것이 좋습니다.sizeof교환입니다.

언급URL : https://stackoverflow.com/questions/761969/checking-the-size-of-an-object-in-objective-c

반응형