2016-07-31 3 views

답변

3

순차 번호 new 표현식은 반드시 순차적 메모리 블록을 할당하지는 않습니다.

그러나 C++ 14는 특정 조건에서 단일 인접한 메모리 덩어리를 할당해야하는 new 표현식으로 바꿀 수있는 new 표현식의 특수한 지원을 제공합니다. delete 표현식은 하나의 delete 표현식으로 바뀝니다.

C++ §5.3.4 14/10 (N3936 초안)
구현은 교체 글로벌 할당 함수 (18.6.1.1, 18.6.1.2로 전화를 생략 할 수있다

). 그렇게하면 저장소가 대신 구현에 의해 제공되거나 다른 new- 표현의 할당을 확장하여 제공됩니다. 구현은 다음은 할당이 확장되지 않은 사실이 될 것입니다 경우 new -expression e2 스토리지를 제공하는 new -expression e1의 할당을 연장 할 수있다 :
이 - e1의 평가 e2의 평가 전에 순서가되고,
- e2e1 스토리지를 획득 할 때마다 평가 및
- 모두 e1e2는 동일한 교체 글로벌 할당 함수를 호출하고
- e1e2 호출 할당 기능이 던지는 경우, 어떤 exceptio 어느 e1 또는 e2 제 동일한 핸들러에서 잡힐 것이고,
평가 던져 NS - e1 의해 생성 된 포인터 값 e2 평가 delete -expressions 피연산자이며
는 - e2의 평가 전에 서열화 피연산자가 e1에 의해 생성 된 포인터 값인 delete- 표현식의 평가.

0

메모리 관리는 정말 운영 체제에 달려있다 - 런타임에,이 (가능성이 있지만) 즉 연속 할당이 보장되지 않으므로, 행의 C malloc 함수를 여러 번 호출하는 것과 같습니다. 객체가 연속 메모리 블록에 저장되도록 보장하려면 객체를 배열로 유지해야합니다.

어떤 응용 프로그램을 사용해야할지 모르겠지만 대부분의 경우 캐시 친숙성 향상 속도는 객체를 지나칠 때의 오버 헤드에 비해 훨씬 큽니다. 캐시가 좋으면 CPU가 배열을 캐시로 빠르게 송/출하는 필요가 없기 때문에 대형 데이터베이스 (예 : 긴 배열의 mergesort)에서 작동하는 프로그램의 속도가 빨라집니다. 그러나 개체의 수가 적을 경우, 그 효과는 너무 작을 것이기 때문에 캐시에 대해 걱정해야합니다. 배열의 각 블록을 개별적으로 선언하고 블록으로 선언하지 않는다면 그 중 많은 수가 없다고 추측하고 있으므로 배열에 넣는 것은 필요하지 않으며 프로그램 속도를 향상시키지 않습니다.

0

대부분의 구현에서 할당자는 이전에 free'd 메모리를 보유 할 것이므로 항상 연속 메모리를 얻지는 않을 것입니다.

이 경우에 대해 생각하십시오. Test1은 큰 개체이고 Test2은 작은 것으로 Test3은 중간 크기입니다.

Test1에 할당 할 때 현재 메모리 풀에 충분한 재사용 가능한 메모리가 없기 때문에 힙을 확장하고 거기에서 할당하도록 요청합니다. 그러면 작은 Test2을 위해, 이전에 free'd 것에서 재사용 할 수있는 기억이있다, 그래서 당신은 Test2 그 수영장에서 얻는다 다만 작은 객체이다.

Test2과의 유사한 Test3를 들어

하지만, 성능을 위해 할당은 다른 크기 범위에 대해 여러 풀을 보유 것, 그래서 Test3Test2 후 이동하지 않을 수 있습니다.

참고 :이 모든 것은 사양에서 필수는 아니며 구현에 달렸으며 여기에 제시된 것은 일반적인 구현 중 하나입니다 (추가 읽기 : 버디 메모리 할당).

관련 문제