2010-08-08 3 views
5

"Modern C++ Design"의 Small-Object Allocation에 대해 읽었습니다. Andrei Alexandrescu는 범용 연산자 (new 및 delete)는 작은 객체를 할당 할 때 성능이 좋지 않다고 주장합니다.C++에서 작은 개체로 간주되는 것은 무엇입니까?

내 프로그램에는 무료 저장소에서 생성되고 파괴 된 많은 개체가 있습니다. 이 개체는 8000 바이트 이상을 측정합니다.

작은 크기로보고있는 크기는 무엇입니까? C++로 메모리를 할당 할 때 8000 바이트가 작거나 크지 않습니까?

+0

구현에 따라 다릅니다. – kennytm

+2

개체가 개별적으로 8000 바이트를 측정합니까, 아니면 누적 적으로 측정합니까? @KennyTM은 구현에 의존한다고 말하지만 객체 당 8000 바이트에는 그 객체가 작은 –

+0

@ Jared P로 간주되는 실제 구현이 많지 않으며 각 객체 측정은 8000 바이트 이상입니다. 내 프로그램은 Windows 및 Linux 서버 시스템에서 매우 잘 실행되어야합니다. –

답변

13

"small"의 정의는 다양하지만 일반적으로 객체의 크기가 힙 할당으로 인해 발생하는 크기 오버 헤드보다 작 으면 (또는 적어도 해당 크기에 가까운 경우) 객체는 "작음"으로 간주 될 수 있습니다.

따라서 16 바이트 개체는 대부분의 경우 "작은"것으로 간주됩니다. 32 바이트 오브젝트는 특정 상황에서 작다고 간주 될 수 있습니다. 8,000 바이트 개체는 확실히 "작지"않습니다.

일반적으로 작은 객체 할당자를 사용하는 데 어려움을 겪으려면 코드 블록의 성능을 향상 시키려합니다. 작은 객체 할당자를 사용하는 것이 성능에 도움이되지 않는다면, 아마 그것을 사용해서는 안됩니다.

1

확실히 8000 바이트를 '작음'으로 간주하지 않습니다. 작은 개체는 대부분 개체가 수백 바이트를 넘지 않는다는 것을 의미합니다. 개체가 소수의 바이트 만 있으면 가장 큰 문제가 발생할 수 있습니다. Kenny가 지적했듯이 이것은 구현에 따라 다르며 일부 C++ 런타임은 처리시 훌륭 할 수 있습니다 작은 물건.

3

[...]은 일반 목적 연산자 (new 및 delete)가 작은 객체를 할당하는 데 잘못 수행한다고 주장합니다.

플랫폼에 따라 다릅니다. 예 : 리눅스에서는 정적 인 메모리 관리와 red-black 트리 인 GNU의 std :: map과 완전히 동적 인 메모리 관리를 사용하여 내 자생 AVL 트리를 벤치 마크했습니다. 놀랍게도, std :: map은 종종 구현과 매우 유사합니다. 그리고 std :: map은 위험한 양의 작은 메모리 할당을합니다.

내 프로그램에는 무료 저장소에서 많은 개체가 만들어지고 파괴되었습니다.

메모리 관리 문제는 유효합니다. 가능한 경우 기존 리소스를 재사용하거나 임시 복사본을 만들지 않도록 항상 노력해야한다는 의미입니다.

효율성/CPU 성능이 우수합니다. 코드가 거의 실행되지 않으면 신경 쓸 필요가 없습니다.

이 개체는 8000 바이트 이상을 측정합니다. 어떤 크기가 작은 것으로 간주됩니까? C++로 메모리를 할당 할 때 8000 바이트가 작거나 크지 않습니까?

이것은 무의미한 질문입니다. 당신의 프로그램이 8K를 취하는 객체를 필요로한다면, 당신의 프로그램은 그것을 필요로한다. 기간.

소프트웨어가 메모리 관리에서 성능 병목 현상에 너무 많은 RAM 또는 Profiler를 사용한다는 불만이있는 경우에만 걱정해야합니다. 그렇지 않으면 현대의 메모리 관리가 비교적 빠르고 강력합니다.

P. 저는 개인적으로 8K를 평균 메모리 할당 크기라고 생각합니다. 작지 않고 크지 않습니다. 하지만 저는 이미 힙에 10 + GB를 할당하는 프로그램을 사용하는 데 익숙합니다. 데이터 세트가 RAM에 있어야하고 크기가 10GB라면 잘 응용 프로그램은 선택의 여지가 있지만로드하려고합니다.

0

질문은 객체가 얼마나 작습니까?하지만 new/delete 연산자에서 얼마나 많은 메모리 오버 헤드가 발생합니까? 당신의 물건이 그 이상이라면 그다지 작지는 않습니다.

관련 문제