std::vector와 std::list는 구현과 동작이 다른 STL 컨테이너입니다.
선택 시기:
std::vector를 거의 항상 사용하세요.std::list는 데이터 양이 많고 중간에 삽입/삭제가 필요한 경우에만 정당화됩니다. 벡터의 요소를 이동하는 것이 너무 비싸기 때문입니다.std::vector가 대체로 데이터의 지역성과 때문에 더 빠릅니다.예시:
std::vector<int> v; v.push_back(1); v[0] = 2; // 인덱스에 대한 빠른 접근 std::list<int> l; l.push_back(1); // l[0] = 2; // 오류: std::list는 인덱스 접근이 없습니다!
"왜
std::list는 이론적인 장점에도 불구하고 현대 C++ 프로젝트에서 거의 사용되지 않나요?"
답변:
실제로는 작은 메모리 할당으로 인한 많은 문제, 데이터의 지역성 손실(캐시 친화적이지 않음), 구조의 비효율성 및 일부 작업에 대한 저조한 지원 때문에 그렇습니다(std::list는 메모리 할당 및 해제에 소요되는 시간 손실로 인해 큰 리스트에서도 비효율적이며, 캐시에서의 지연은 종종 비율 이득을 초과합니다). 또한 현대 프로세서는 캐시 지역성에 매우 민감하므로 대량의 데이터가 있더라도 실제 조건에서 std::vector가 더 빠른 경우가 많습니다.
이야기
실시간 시스템에서 이벤트 큐를 저장하기 위해 std::list를 선택했습니다. 그 결과 시스템은 메모리 힙에 대한 빈번한 접근으로 인해 10배 느려졌습니다.
이야기
그래픽 프로세서에서 이웃 배열을 std::list로 저장하여 삽입을 위해 구현했습니다. 이로 인해 메모리 사용량이 급증하고 L1/L2 캐시가 저하되었지만 실제로 속도 향상은 없었습니다.
이야기
보고서 생성 서비스에서 각 보고서는 Linked List 객체로 구성되었습니다. 스트레스 테스트에서 서비스가 "느려지기 시작했고," 프로파일링 결과 리스트 작업 시 메모리 할당에 대한 병목 현상이 발견되었습니다. vector로 전환하니 결과가 수배 향상되었습니다.