2009-10-19 5 views
3

배열 및 벡터를 C++로 배우려고 시도하면서 나는 this을 발견했습니다. 게시물에 언급 된 "페이징 효과"란 무엇입니까? 또한, 내 자신의 이해를 확인하기 위해, 나는 벡터가 동적 메모리 할당 때문에 더 많은 시간을 사용한다고 생각한다. 내가 맞습니까?C++에서 페이징 효과 란 무엇입니까?


추가 질문 : vector<int> arr(10000)와 하지만이없는 이미 10000 INT에 대한 충분한 메모리를 할당? 또는 이렇게하면, arr은 여전히 ​​모든 요소를 ​​반복하고 초기화하는 경우 계속 증가합니까?

답변

5

Vector는 push_back()을 사용하는 경우 동적 할당을 사용하지만 reserve()를 사용하여 강제로 메모리를 미리 할당 할 수 있습니다.

디버그 라이브러리에서 일반적으로 선택되는 빌드는 디버그 모드에서 느려질 수있는 벡터 작업의 경계를 검사합니다. 릴리스 빌드는 원시 C보다 느리지 않아야합니다.

페이징은 실제 메모리가 가득 차면 메모리를 디스크로 이동하는 것을 의미합니다. 메모리가 페이징되는 경우 타이밍에주의해야합니다. 일반적인 기술은 여러 번 작업을 실행하고 가장 긴 시간을 거부하는 것입니다.

편집 : 효율성을 위해 STL 대신 원시 'C'유형을 사용하지 않아야합니다. STL을 작성한 사람들은 정말 똑똑하고 성능에 대해 정말로 관심이 있습니다. 제대로 사용하면 'C'보다 절대로 안되며 종종 더 좋습니다. 자신의 한 롤링 루프가 아닌 STL 알고리즘을 사용하면 두 배로 늘어납니다.

+0

벡터가 커질수록 이전 데이터를 다시 할당하고 이동해야하기 때문에 벡터는 원시 배열보다 느려집니다. .reserve() (또는 .resize)를 사용하여 크기를 알리면이 문제를 피할 수 있습니다. –

+1

그는 이미 reserve()에 대해 언급했습니다. 또한 벡터와 같은 원시 배열을 사용하는 경우에도 다시 할당하고 복사해야합니다. –

+0

@mgb 요소를 삽입 할 때 STL 벡터가 항상 동적 할당을 수행하지는 않습니다. 대부분의 (모든?) 구현은 선형 시간 삽입을 허용하도록 확장 할 때 용량을 두 배로 늘릴 것입니다. 특히, capacity()가 size()보다 큰 경우 벡터 자체 내에서 할당이 발생하지 않습니다. 삽입되는 객체는 벡터에 복사 될 때 물론 자체 할당을 초래할 수 있습니다. – Void

1

최적화 페이지가 링크 된 페이지가 성능 차이를 제거합니다. 이는 벡터에서 추가 함수 호출로 인해 발생할 가능성이 높다는 것을 의미합니다. 옵티 마이저가 인라인 할만큼 똑똑하기 때문에 이러한 함수는 무시해도됩니다.

포스터는 "페이징 효과"라는 이름을 사용하고 있지만 벡터 사례에서 실제로 언급 한 것은 메모리 할당 비용입니다. 또한, 그 메모리에 쓰기/읽기를 시도함으로써, 어레이의 끝 부분에있는 세그먼트를 캐시로 가져와 아마도 그 메모리 영역의 향후 성능을 향상시킬 것입니다.

-1

그 코드의 저자는 배열 버퍼 적어도 하나의 액세스가 자신의 코드의 주요 부분을 실행하기 전에 만들어졌다 있는지 확인

array[size - 1] = 0; 

접근을 강요한다. 이는 가상 메모리 스왑 파일 사용의 영향을 완화하기 위해 수행됩니다. 즉, 액세스로 인해 주 코드가 시작될 때 버퍼가 페이징 파일로 스왑 아웃되지 않을 확률이 높아집니다. 이것이 없으면 버퍼에 대한 첫 번째 액세스가 이루어질 때 스와핑이 발생하고 런타임이 크게 늘어나고 가짜 결과를 초래할 수 있습니다.

버퍼 크기가 운영 체제가 가상 메모리 주소 지정에 사용하는 최소 메모리 세그먼트 크기보다 크지 않은 경우에만 효과가 보장됩니다.

이것은 C++에만 관련된 문제는 아닙니다.

벡터에 액세스하는 데 두 개의 메모리 액세스가 필요하기 때문에 벡터가 더 느립니다. 하나는 버퍼 주소를 검색하고 다른 하나는 실제로 메모리에 액세스합니다. C 배열을 사용하면 버퍼 주소가 이미 알려지고 하나의 액세스 만 필요합니다. 벡터를 가진 동일한 코드가 버퍼 주소를 저장하기 위해 임시로 재 작성되면 훨씬 빠르게 실행됩니다.

+1

downvote는 훌륭합니다! 그러나 추론은 어디 있나? – sharptooth

+0

(내 downvote가 아님) "두 메모리 접근"문은 틀린 것인데, C와 관련된 C++의 속도에 대한 결론 ("int *"또는 "vector " 기본 주소를 레지스터에로드해야하는 스택). 틀린 것 외에, 그것은 또한 질문에 무관하다. – MSalters

+0

VC++는 이러한 경우 벡터에 대해 "두 개의 메모리 액세스"코드를 내 보냅니다. – sharptooth