std :: vector가 연속적으로 할당 된 메모리 (캐시 친화적 인)를 보장하므로 좋다고 들었다. 그렇다면 이것과 같은 순차적 '새로운'연산자는 어떨까요?순차적 '새'연산자가 인접한 메모리를 할당합니까?
{
new Test1();
new Test2();
new Test3();
}
힙에 할당 된 연속 메모리를 만들지 않습니까?
std :: vector가 연속적으로 할당 된 메모리 (캐시 친화적 인)를 보장하므로 좋다고 들었다. 그렇다면 이것과 같은 순차적 '새로운'연산자는 어떨까요?순차적 '새'연산자가 인접한 메모리를 할당합니까?
{
new Test1();
new Test2();
new Test3();
}
힙에 할당 된 연속 메모리를 만들지 않습니까?
순차 번호 new
표현식은 반드시 순차적 메모리 블록을 할당하지는 않습니다.
그러나 C++ 14는 특정 조건에서 단일 인접한 메모리 덩어리를 할당해야하는 new
표현식으로 바꿀 수있는 new
표현식의 특수한 지원을 제공합니다. delete
표현식은 하나의 delete
표현식으로 바뀝니다.
구현은 교체 글로벌 할당 함수 (18.6.1.1, 18.6.1.2로 전화를 생략 할 수있다”). 그렇게하면 저장소가 대신 구현에 의해 제공되거나 다른
new
- 표현의 할당을 확장하여 제공됩니다. 구현은 다음은 할당이 확장되지 않은 사실이 될 것입니다 경우new
-expressione2
스토리지를 제공하는new
-expressione1
의 할당을 연장 할 수있다 :
이 -e1
의 평가e2
의 평가 전에 순서가되고,
-e2
e1
스토리지를 획득 할 때마다 평가 및
- 모두e1
및e2
는 동일한 교체 글로벌 할당 함수를 호출하고
-e1
및e2
호출 할당 기능이 던지는 경우, 어떤 exceptio 어느e1
또는e2
제 동일한 핸들러에서 잡힐 것이고,
평가 던져 NS -e1
의해 생성 된 포인터 값e2
평가delete
-expressions 피연산자이며
는 -e2
의 평가 전에 서열화 피연산자가e1
에 의해 생성 된 포인터 값인delete
- 표현식의 평가.
메모리 관리는 정말 운영 체제에 달려있다 - 런타임에,이 (가능성이 있지만) 즉 연속 할당이 보장되지 않으므로, 행의 C malloc
함수를 여러 번 호출하는 것과 같습니다. 객체가 연속 메모리 블록에 저장되도록 보장하려면 객체를 배열로 유지해야합니다.
어떤 응용 프로그램을 사용해야할지 모르겠지만 대부분의 경우 캐시 친숙성 향상 속도는 객체를 지나칠 때의 오버 헤드에 비해 훨씬 큽니다. 캐시가 좋으면 CPU가 배열을 캐시로 빠르게 송/출하는 필요가 없기 때문에 대형 데이터베이스 (예 : 긴 배열의 mergesort)에서 작동하는 프로그램의 속도가 빨라집니다. 그러나 개체의 수가 적을 경우, 그 효과는 너무 작을 것이기 때문에 캐시에 대해 걱정해야합니다. 배열의 각 블록을 개별적으로 선언하고 블록으로 선언하지 않는다면 그 중 많은 수가 없다고 추측하고 있으므로 배열에 넣는 것은 필요하지 않으며 프로그램 속도를 향상시키지 않습니다.
대부분의 구현에서 할당자는 이전에 free'd 메모리를 보유 할 것이므로 항상 연속 메모리를 얻지는 않을 것입니다.
이 경우에 대해 생각하십시오. Test1
은 큰 개체이고 Test2
은 작은 것으로 Test3
은 중간 크기입니다.
Test1
에 할당 할 때 현재 메모리 풀에 충분한 재사용 가능한 메모리가 없기 때문에 힙을 확장하고 거기에서 할당하도록 요청합니다. 그러면 작은 Test2
을 위해, 이전에 free'd 것에서 재사용 할 수있는 기억이있다, 그래서 당신은 Test2
그 수영장에서 얻는다 다만 작은 객체이다.
Test2
과의 유사한
Test3
를 들어
하지만, 성능을 위해 할당은 다른 크기 범위에 대해 여러 풀을 보유 것, 그래서 Test3
는 Test2
후 이동하지 않을 수 있습니다.
참고 :이 모든 것은 사양에서 필수는 아니며 구현에 달렸으며 여기에 제시된 것은 일반적인 구현 중 하나입니다 (추가 읽기 : 버디 메모리 할당).