2012-12-24 2 views
1

다른 질문을 통해 읽는 것이 대부분의 사람들이 왜 인스턴스의 크기를 알아야하는지 알고 싶어한다는 것을 알기 때문에 문제의 중심이 아닐지라도 진행해 보겠습니다. . 저는 수천 개의 매우 작은 오브젝트에 수천을 할당해야하는 프로젝트에서 작업하고 있습니다. 오브젝트의 기본 할당 패턴은 단순히 그것을 잘라 내지 못합니다. 나는 이미이 문제를 해결하기 위해 많은 양의 객체를 한꺼번에 할당하고 초기화 할 수있는 객체 풀 클래스를 만들었습니다. 할당 해제는 완벽하게 작동합니다 (오브젝트는 풀로 리턴 됨).class_getInstanceSize에 잘못된 크기를 반환하는 버그가 있습니까?

실제로 완벽하게 작동하고 내 문제는 아니지만 class_getInstanceSize이 비정상적으로 큰 크기를 반환하고 있습니다. 예를 들어, size_tisA을 포함한 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을 모두 참조 했음에도 불구하고 거의 동일한 결과를 산출하지 않습니다. 다시 말하지만, 이것은 두 런타임 모두에서 발생합니다.

+0

* * 정확하게 * 잘못된 결과를 반환하는 코드는 무엇입니까? 몇 가지 다른 것을 설명했지만 코드를 보여주지 않았습니다. 버그가 여러분이 말한 것처럼 뻔뻔 스럽다면 - NSObject가 아닌 모든 클래스에서 발생합니다. 그런 다음 간단한 테스트 케이스로 분류 할 수 있어야합니다. –

+0

@KurtRevis 정확한 코드는 - (size_t) getInstanceSize : (Class) aClass {return class_getInstanceSize (aClass); }. 테스트 목적 (예 : 인쇄 결과)을위한 메소드에 함수를 캡슐화했으나 그게 전부입니다. 어떤 식 으로든 얻을 수있는 NSObject를 제외한 다른 클래스에 피드하면 위에서 설명한 결과를 얻을 수 있습니다. – Rabbit

+0

@KurtRevis 나는 당신이 기대했던 것보다 훨씬 더 행동하는 것으로 보이는 새로운 프로젝트 (커맨드 라인 만, 10.8.2 Intel Mac)를 더 테스트했다고 언급해야한다. NSObject는 8 바이트입니다. 빈 서브 클래스는 16 바이트이고 인스턴스 크기는 16 바이트 청크에서 증가하는 것처럼 보입니다. 메모리 정렬을 위해 가장 가능성이 큽니다. 이 시점에서 나는 완전히 뒤죽박죽이다. 기본 Cocoa 프로젝트에서이 문제를 NSObject 및 call class_getInstanceSize ([MyClassName class]) 호출로부터 상속받은 간단한 클래스로 분류했습니다. 여전히 같은 행동을 보입니다. – Rabbit

답변

1

나는이 문제를 해결했다고 생각하는데, 아마도 어리석은 이유 때문일 것입니다.

이전의 프로파일 링/디버깅 라이브러리를 사용합니다. 사실, 나는 실제 이름을 모른다 (라이브러리는 libcsuomm이고 헤더는 식별 정보가 없다). 필자가 알고있는 것은 compsci 연구소의 컴퓨터에서 사용할 수있는 라이브러리라는 것입니다 (저는 지질학 전공으로 전환하기 전에 Comp-Sci를 1 년 간 졸업하고 다시 보지 않았습니다).

어쨌든 라이브러리의 요점은 다양한 프로파일 링 및 디버깅 기능을 제공한다는 점입니다. 내가 그것을 가장 많이 사용하는 것은 메모리 누수 탐지이다. 왜냐하면 C로 기반을두고 원시 할당 밖의 객체를 인식하지 못하는 다른 선호하는 메모리 누수 라이브러리 (현재는 지원되지 않는 MSS)와는 달리 객체마다 실제로 추적하기 때문이다.

디버깅 할 때 너무 많이 사용하기 때문에 기본적으로 생각조차하지 않고 항상 설정합니다.따라서 버그를 찾아 내고 테스트 할 수있는 테스트 프로젝트를 만들 때조차도 아무 것도 생각하지 않고 설정했습니다. 음, 라이브러리가 런타임 시술을 끌어 와서 제대로 작동한다는 것을 알 수 있습니다. 내가 장애가 되었기 때문에 상황이 바르게 작동하는 것 같아서 그것이 내 문제의 근원이라고 믿습니다.

이제는 버그라는 결론에 도달하는 것이 좋지 않지만 그 당시에는 문제를 일으킬 수있는 코드는 내 코드에서 볼 수 없었습니다.

관련 문제