2009-04-29 3 views

답변

3

시간의 99 %와 표준 라이브러리 구현의 99 %에 대해 std :: vectors는 충분히 빠르며 사용시 얻는 편리 성과 안전성은 작은 성능 비용보다 중요 할 것입니다 .

이는 C++ 벡터가 연속적으로 할당되는 표준 보증, 그래서이다
vector <int> v(100); 
int * p = &v[0]; 
p[3] = 42; 

:

당신이 정말로 베어 메탈 (bare-metal) 코드를 필요로하는 매우 드문 경우에

, 당신은 C 스타일 배열 같은 벡터를 처리 할 수 일하도록 보장.

문자열과 관련하여 편의 요소가 압도적으로 증가하고 성능 문제가 사라지는 경향이 있습니다. Beack을 C 스타일 문자열로 옮기면 strlen()과 같은 함수의 사용으로 되돌아갑니다.이 함수는 본질적으로 매우 비효율적입니다.

목록의 경우 목록을 사용하는 경우 자체 구현 여부에 관계없이 목록을 사용하기 전에 두 번 생각하고 세 번 생각해야합니다. 대다수의 컴퓨팅 문제는 벡터/배열을 사용하면 더 잘 해결됩니다. 이유 목록은 텍스트 및 교육 과정 작성자가 포인터와 동적 할당을 한 번에 설명하는 데 사용할 수있는 편리한 데이터 구조이기 때문에 많은 부분이 문학에 자주 등장합니다. 여기서 전 훈련 과정 작가로 말합니다.

+0

정렬을 시도 할 때 벡터를 사용하는 것이 어떻게 보이는지 모르겠지만 확실하게 목록은이 것들에 대해 더 효율적입니까? 아니면 단일 목록 대신 정렬 할 때 여러 벡터를 사용하는 것이 더 좋을까요? – tweetypi

+1

정렬시 벡터가 효율적이지 않을 수도 있습니다. vecrtor는 하나의 빠른 교환 작업 만 필요로하는 반면 목록에는 여러 포인터 조정이 필요하기 때문에 int의 벡터를 정렬하는 것은 int 목록을 정렬하는 것보다 빠릅니다. 비 POD 객체의 경우 목록이 빨라질 수 있습니다. 그러나 정렬은 실제 코드에서 수행하는 것은 매우 드문 일입니다. –

0

실시간 응답이 필요하지 않은 경우 접근 방식을 고수하십시오. 그들은 숯보다 안전합니다.

2

요소에 액세스 할 때 오버 헤드가 하나 있습니다. 벡터와 문자열을 사용하더라도 인덱스로 요소에 액세스 할 때 버퍼 주소를 먼저 검색 한 다음 오프셋을 추가해야합니다 (수동으로하지는 않지만 컴파일러에서 이러한 코드를 내 보냅니다). 원시 배열을 사용하면 이미 버퍼 주소가 있습니다. 이 여분의 간접 지정은 특정 경우에 상당한 오버 헤드를 유발할 수 있으며 성능 향상을 원할 때 프로파일 링의 대상이됩니다.

+0

여기서 트릭은 'operator []'를 그렇게 많이 사용하지 않고 반복자로 작업하는 것입니다. 꽤 자주 char *에 기본 문자 배열로 매핑됩니다. –

+0

사실이 방법은 사용 된 STL 구현에 대해 조사해야합니다.이 방법이나 다른 방식으로 작동 할 수도 있습니다. – sharptooth

0

일부 작업을 수행 할 때 성능이나 메모리 사용량이 늘어날 수있는 경우가 종종 있습니다 (예 : std :: string은 일반적으로 약 24 바이트의 오버 헤드를 가지며 포인터의 12 바이트는 std :: string 자체 및 동적으로 할당 된 조각에 헤더 블록).

저는 std :: string에서 const char *로 저장되는 눈에 띄는 메모리 (MB의 10)로 변환하는 프로젝트에서 작업했습니다. 나는이 프로젝트들이 당신이 전형라고 부르는 프로젝트라고 생각하지 않습니다.

아, STL을 사용하면 컴파일 시간이 길어지고 언젠가는 문제가 될 수 있습니다. 프로젝트에서 GB 이상의 오브젝트 파일이 링커에 전달 될 때 템플릿의 부풀림 정도를 고려해야합니다.

+1

느린 컴파일 시간을 다루는 방법은 많습니다. 이런 이유로 STL을 사용하는 것을 피하는 것이 나의 최후의 수단이 될 것입니다. –

3

STL 클래스 (벡터, 문자열 등)를 사용합니다. 그들은 더 안전하고, 사용하기 쉽고, 생산성이 높으며, 메모리 누수 가능성이 적습니다. AFAIK는 최소한 DEBUG 시간 (Visual C++)에서 경계의 런타임 검사를 추가로합니다.

그런 다음 성능을 측정하십시오. 병목 현상이 STL 클래스에 있다고 판단되면 C 스타일 문자열 및 배열 사용으로 이동합니다.

내 경험에 비추어 볼 때 벡터 또는 문자열 사용에 병목 현상이 발생할 확률은 매우 낮습니다.

+0

+1 정확하게 내가 뭘 대답했을까요 :) – soulmerge

0

문자열에 대한 메모리 오버 헤드가 문제가되는 여러 프로젝트에서 작업했습니다.

응용 프로그램의 확장이 필요한지 미리 고려해야합니다. 무한대의 문자열을 저장해야하는 경우 const char*을 전역 관리되는 문자열 테이블에 사용하면 엄청난 양의 메모리를 절약 할 수 있습니다.

하지만 일반적으로 STL 유형을 사용하는 것이 좋습니다.

0

기본 메모리 할당 기술은 벡터와 문자열에 대한 버퍼라고 생각하는데 현재 할당 된 메모리가 다 소모 될 때마다 메모리 양을 두 배 할당합니다. 이것은 낭비 일 수 있습니다. 물론 사용자 정의 할당자를 제공 할 수 있습니다.

다른 점은 스택 대 힙입니다. 정적으로 크기가 지정된 배열과 문자열이 스택에 있거나 적어도 컴파일러가 메모리 관리를 처리 할 수 ​​있습니다. 최신 컴파일러는 관련 C99/C++ 0x 기능을 제공하는 경우에도 동적 크기 배열을 처리합니다. 벡터와 문자열은 항상 힙을 사용할 것이므로 제약 조건이 매우 엄격하면 성능 문제가 발생할 수 있습니다.

속도/메모리 오버 헤드로 프로젝트를 해치지 않는 한 엄지 손가락을 사용하십시오. STL이 제공하는 수업의 99 %에서 수업 시간이 거의 필요하지 않은 것으로 나타났습니다. 애플리케이션 성능에 영향을 미치지 않습니다. (즉, "조숙 한 최적화를 피하십시오")

+0

C++ 0x가 동적 배열을 suopport 할 것이라고 생각하게하는 이유는 무엇입니까? –

관련 문제