2016-07-05 1 views
0

현재 저는 (Design-Stage에서) 사용자 정의 IR을 사용하는 다소 작은 컴파일러를 개발 중입니다. 내가 겪고있는 문제는 모든 지시 사항을 담을 수있는 효율적인 컨테이너 데이터 구조를 선택하는 것이다.컨테이너 데이터 구조는 std :: vector 및 std :: list와 유사합니다.

기본 블록에는 ~ 10000 개의 명령어가 포함되며 명령어는 ~ 250 바이트와 비슷합니다.

컴파일러가 복잡한 변환 (예 : 수많은 무작위 삽입/제거)을 가질 것이므로 반복기를 무효화하지 않는 컨테이너 데이터 구조를 갖는 것이 좋을 것이라고 생각했습니다. 변환 알고리즘을 간단하고 쉽게 따라 할 수 있습니다.

반면에 캐시 누락 및 메모리 조각화와 관련된 알려진 문제로 인해 성능이 손실됩니다. std :: vector는 여기서 도움이 될 것이지만 벡터로 변형을 구현하는 것은 고통 스러울 것이라고 상상해보십시오.

메모리 부족 오류를 줄이기 위해 메모리 단편화가 적고 반복기가 무효화되지 않는 다른 데이터 구조가있는 경우 질문이 있습니다. 아니면 이것을 무시하고 목록을 계속 사용해야 만합니다.

+0

반복자 무효화 문제를 해결하는 것이 좋습니다. – SirGuy

답변

0

using Container = std::vector<Instruction>으로 시작하십시오. std::vector은 꽤 좋은 기본 컨테이너입니다. 퍼포먼스가 문제가되면, 몇 가지 컨테이너로 프로그램을 구성하십시오. 나머지 코드는 많이 변경하지 않고도 Container을 바꿀 수 있어야합니다. 어떤 종류의 배열 목록이 가장 좋을지 모르지만 아마 확인해야 할 것입니다.

+0

무작위로 요소를 삽입 및 제거 할 때 가능한지 확실하지 않습니다. 반복기가 무효화됩니다. 이것은 원하지 않는 동작입니다. 모든 변환 (알고리즘)은 다시 작성해야하며, 좋지 않습니다. – lled

+1

@lled 안정적인 반복자 * 및 * 임의 삽입 및 삭제가 필요한 경우 메모리 조각화 연결된 목록 이외의 다른 방법은 없습니다. 벡터에 반복자 대신 색인을 사용할 수 있는지 확인하십시오. – nwp

관련 문제