2017-03-29 7 views
7

일상 업무 중에는 팀의 선임 구성원이 캐시 친화적이지 않기 때문에 항상 조언을 듣고 있습니다. vector. 나는 list이 연속적이 아니므로 메모리 할당이 전체 메모리에 흩어져 있다는 것을 이해합니다.사용자 정의 할당자를 사용하여 std :: list 캐시를 쉽게 사용할 수있게 만드시겠습니까?

그러나 매우 자주 나는 list (또는 map)의 기능이 필요합니다. 그래서 내가 vector 밑에 내 자신의 할당자를 쓸 수 있는지 궁금합니다. 내가 push_back 일 때마다, 내 자신의 할당자는 vector 할당에서 새 항목을 할당합니다.

list/map을 여행 할 때 캐시 위치가 보존됩니다.

누구에게도 의미가 있습니까?

+2

'std :: list'는 연관 컨테이너가 아닙니다. – juanchopanza

+1

당신이 찾고있는 것을 스택 할당 자라고 부릅니다 – NathanOliver

+0

확실한 질문 : 왜 그냥 '벡터'를 사용하지 않으시겠습니까? 이 구조는'벡터 '가 제공하지 않는 것은 무엇입니까? 'vector'보다는'list'에서 더 효율적인 기능을 사용하려고하면 메모리가 누출됩니다. – user2357112

답변

1

std::list 및 std :: set (나는지도 대신 목록으로 설정해야한다고 생각합니다.) 둘 다 내부 용으로 allocator를 사용합니다. 메모리 블록을 미리 할당하여 개체 및 컨테이너를 만들 때 사용할 수 있습니다. 당신이 구글이라면, 당신은 몇 가지를 발견 할 것이다. 이 경우에는 "전체 메모리에 흩어져있는"경우 개체가 메모리 블록 주위에 흩어져 있습니다. 캐시에 블록이 맞으면 몇 가지 개선점이 있습니다. 하지만 완전히 문제를 해결하지는 못합니다.

문제의 설명에서, 정말 deque이 필요합니다. Deque는 배열 목록으로 구현됩니다. 그것은 벡터와리스트 사이에서 타협입니다. 반복 할 때 캐시가 좋으며 삽입 할 때 더 빠릅니다.

사용자 지정 할당 자나 큐를 선택할 수 있으므로 컬렉션 크기에 따라 다릅니다.

image