2015-01-19 1 views
2

C++ 표준 섹션 3.7.3.1는새로운 오퍼레이터 할당 함수 순서 연속성 및 초기 값

"이 할당 기능 연속 호출에 의해 할당 된 저장 순서, 연속성 및 초기 값 지정한다."라고 말한다

연속성 & 연속의 의미는 무엇입니까? 왜 그것이 불특정인가? 왜 초기 값도 지정되지 않았습니까?

+5

즉, 'new'로 메모리를 한 번 할당 한 다음 다시 할당하면 두 번째 메모리가 첫 번째 메모리 바로 다음에 위치하거나 할당 된 메모리의 바이트 값이 어떻게 든 유지된다는 보장이 없다는 것을 의미합니다 지정된. 주문을 지정하거나 예를 들어 메모리를 초기화합니다. '0'은 시간이 걸리며, C++에서는 필요없는 것을 지불하지 않습니다. – vsoftco

+2

이것은 'new'호출이 이전 호출이나 그 내용 (0으로 채워진 마스크가 아닌)에 대해 "후", "전", "바로 인접한"등의 주소를 반환한다는 지정이 없음을 의미합니다. 채워진, 등). 이러한 조건은 정의 된 방식으로 언어를 사용할 필요가없는 구현에 대한 제한을 두게됩니다. 따라서 그러한 제한을 가질 이유가 없습니다. – WhozCraig

답변

6

순서
는 할당이 점차 증가 또는 감소 (또는 다른 패턴)을 반환되는 주소에 구속되지 않는 것을 의미한다. 메모리가 일반적으로 재활용되고 프로그램 수명 기간 동안 여러 번 재사용됨에 따라 이는 의미가 있습니다. 할당 자에게 저장 순서가 어떤 식 으로든 정의되도록 요청할 수는 있지만, 코드 실행 및 메모리 효율성 모두에서 상당한 오버 헤드에 반대하는 경우에는 거의 이득이 없을 것입니다.

즉, B가 A 뒤에 할당되고 C가 B 뒤에 할당되면 A, B 및 C가 메모리의 모든 순서 (ABC, BAC, CAB, CBA, ...)로 나타날 수 있습니다. A, B, C의 각 주소는 유효하지만 그 이상은 아닙니다.

@Deduplicator에서 지적한 바와 같이 "ABA 문제"라는 동시 프로그래밍에는 잘 알려진 문제가 있습니다. 이것은 간접적으로 새로 할당 된 객체가 주소를 가질 수 있다는 사실의 결과입니다 (이는 다소 고급입니다).
비교 교환 명령어를 사용하여 lockfree 목록이나 대기열과 같이 메모리 위치를 원자 적으로 수정할 때 ABA 문제가 발생합니다. 가정은 다른 사람이 수정하려는 포인터를 동시에 수정했을 때 compare-exchange가이를 감지한다는 것입니다. 그러나 진실은 주소의 비트 패턴이인지 인지 여부 만 확인한다는 것입니다. 이제는 객체를 해제하고 다른 객체 (컨테이너에 할당 자에게 저장소를 요청하는)를 컨테이너에 보내면 할당자는 정확히 동일한 주소를 반환합니다. 이것은 절대적으로 합법적입니다. 또 다른 스레드는 compare-exchange 명령을 사용하며, 정상적으로 처리됩니다. 쾅!
lockfree 구조는 종종 참조 번호가 내장 된 포인터를 사용합니다.

연속성
이 기본적으로 또는 후속 할당에 무엇이든 할당 반환 사이에 "구멍"이 그렇지 않은 경우가있는 것을 말한다 유사한 제약 조건입니다.

즉, 크기가 8 인 객체를 할당 한 다음 다른 객체를 할당하면 할당자가 주소 A 및 주소 A+8을 반환 할 수 있습니다. 그러나 주소 A+10을 두 번째 할당 대신 자신의 재량 인으로 반환 할 수도 있습니다.
할당 자들은 종종 실제 객체 외에 메타 데이터를 저장하기 때문에 일반적으로 거의 모든 할당에서 발생합니다. 일반적으로 특정 크기 (가장 자주 16 바이트)까지 "버킷"에 대한 메모리를 구성합니다.
정수 (일반적으로 4 바이트) 또는 포인터 (일반적으로 4 또는 8 바이트)를 할당하면 할당 된 다음 항목 사이에 "구멍"이 생깁니다.

다시 말하지만, 그것은 할당이 연속 방식으로 객체를 반환 할 것을 요구하는 가능 이 될 것입니다, 그러나 이것은 상대적으로 저렴 뭔가에 비해 심각한 성능에 미치는 영향을 의미한다.

초기 값
이 더 이상 의미가 제대로 개체를 초기화해야하고 그들이 어떤 특정 값이 있다고 가정 할 수보다 적은. 아니오, 메모리는 이 아니며은 자동으로 0으로 초기화됩니다. [1]입니다.

할당자가 메모리를 0으로 초기화하도록 요구할 수는 있지만 가능한 한 효율적이지는 않습니다 (다른 두 제약 조건과 마찬가지로 치명적이지는 않지만).


[1] 글쎄, 어떤 경우에는 그렇습니다. 운영 체제는 일반적으로 프로세스에 새 페이지를 처음 제공하기 전에 모든 페이지를 0으로 만듭니다. 이는 보안을 위해 수행되므로 비밀/기밀 데이터가 유출되지 않습니다. 그러나 이것은 C++ 표준의 범위를 벗어나는 구현 세부 사항입니다.

1

본질적으로 이것은 new 운영자가 시스템에서 필요하다고 생각하는 곳 어디에서나 메모리를 할당 할 수 있으며 프로그램에 대한 할당 순서에 의존하지 않는다는 것을 의미합니다.

+1

"neccessary"? 좀 더 "좋아"할 수 있습니다. – Deduplicator