다른 질문을 통해 읽는 것이 대부분의 사람들이 왜 인스턴스의 크기를 알아야하는지 알고 싶어한다는 것을 알기 때문에 문제의 중심이 아닐지라도 진행해 보겠습니다. . 저는 수천 개의 매우 작은 오브젝트에 수천을 할당해야하는 프로젝트에서 작업하고 있습니다. 오브젝트의 기본 할당 패턴은 단순히 그것을 잘라 내지 못합니다. 나는 이미이 문제를 해결하기 위해 많은 양의 객체를 한꺼번에 할당하고 초기화 할 수있는 객체 풀 클래스를 만들었습니다. 할당 해제는 완벽하게 작동합니다 (오브젝트는 풀로 리턴 됨).class_getInstanceSize에 잘못된 크기를 반환하는 버그가 있습니까?
실제로 완벽하게 작동하고 내 문제는 아니지만 class_getInstanceSize
이 비정상적으로 큰 크기를 반환하고 있습니다. 예를 들어, size_t
과 isA
을 포함한 Class
인스턴스 변수를 저장하는 클래스는 40-52 바이트 크기로보고됩니다. class_getInstanceSize
을 여러 번 호출해도 동일한 크기를 반환한다고 보장 할 수 없기 때문에 범위를 지정합니다. 실제로, NSObject
을 제외한 모든 객체는 겉보기에 그들이해야하는 것과는 거리가 먼 임의의 크기를보고합니다.
printf("Instance Size: %zu\n", class_getInstanceSize(objc_getClass("MyClassName"));
코드 행은 항상 내가 정확 손으로 계산 한 크기에 해당하는 값을 반환합니다. 예를 들어 앞의 예제는 12 바이트 (32 비트)와 24 바이트 (64 비트)로 나옵니다.
런타임이 더 많은 메모리를 필요로하는 장면 뒤에서 뭔가를하고 있다고 생각하여 각 객체의 실제 메모리 사용을 지켜 봤습니다. 주어진 예제에서 읽거나 쓰는 유일한 메모리는 예상 된 크기로 계산 한 12/24 바이트 블록입니다.
class_getInstanceSize
은 Apple & GNU 2.0 런타임에서 이와 같이 작동합니다. 그래서이 문제를 일으키는 class_getInstanceSize
의 버그가 있습니까? 아니면 근본적으로 잘못된 것을하고 있습니까? 내 개체 풀을 비난하기 전에; 기존의 alloc
클래스 메서드를 사용하고 사용자 지정 클래스 메서드에서 class_createInstance(self, 0);
을 사용하여 개체를 할당하여 새로운 프로젝트에서이 동일한 테스트를 시도했습니다.
이전에 언급하는 것을 잊어 버린 두 가지 : 저는 거의 내 자신의 커스텀 클래스에서이를 테스트하고 있습니다. 그래서 속임수는 실제로 클래스 클러스터이거나 그 말도 안되는 것입니다. 두 번째로 class_getInstanceSize([MyClassName class])
과 class_getInstanceSize(self) \\ Ran inside a class method
은 단순히 isA
을 모두 참조 했음에도 불구하고 거의 동일한 결과를 산출하지 않습니다. 다시 말하지만, 이것은 두 런타임 모두에서 발생합니다.
* * 정확하게 * 잘못된 결과를 반환하는 코드는 무엇입니까? 몇 가지 다른 것을 설명했지만 코드를 보여주지 않았습니다. 버그가 여러분이 말한 것처럼 뻔뻔 스럽다면 - NSObject가 아닌 모든 클래스에서 발생합니다. 그런 다음 간단한 테스트 케이스로 분류 할 수 있어야합니다. –
@KurtRevis 정확한 코드는 - (size_t) getInstanceSize : (Class) aClass {return class_getInstanceSize (aClass); }. 테스트 목적 (예 : 인쇄 결과)을위한 메소드에 함수를 캡슐화했으나 그게 전부입니다. 어떤 식 으로든 얻을 수있는 NSObject를 제외한 다른 클래스에 피드하면 위에서 설명한 결과를 얻을 수 있습니다. – Rabbit
@KurtRevis 나는 당신이 기대했던 것보다 훨씬 더 행동하는 것으로 보이는 새로운 프로젝트 (커맨드 라인 만, 10.8.2 Intel Mac)를 더 테스트했다고 언급해야한다. NSObject는 8 바이트입니다. 빈 서브 클래스는 16 바이트이고 인스턴스 크기는 16 바이트 청크에서 증가하는 것처럼 보입니다. 메모리 정렬을 위해 가장 가능성이 큽니다. 이 시점에서 나는 완전히 뒤죽박죽이다. 기본 Cocoa 프로젝트에서이 문제를 NSObject 및 call class_getInstanceSize ([MyClassName class]) 호출로부터 상속받은 간단한 클래스로 분류했습니다. 여전히 같은 행동을 보입니다. – Rabbit