2016-10-03 5 views
-1

점진적으로 채워지거나 읽는 오디오 버퍼를 작성해야합니다. read_samples 샘플을 버퍼에서 읽을되었을 때 지금 내가 가장 효율적인 버퍼 작성 방법

m_outputBuffer.erase(
      m_outputBuffer.begin(), 
      m_outputBuffer.begin()+read_samples); 

을 사용하고

(나는 RAM을 확보을 취소해야합니다). 하지만 erase()은 매우 비쌉니다. 대체 어떻게해야합니까? 기본적으로 포인터를 내 버퍼의 첫 번째 요소로 이동하고 시작을 자유롭게해야한다는 것을 고려해야합니다.

+0

의견이 명확하지 않습니다. 귀하의 질문은 쓸데있다. –

+3

* RAM을 비우려면 지워야합니다. * - 'std :: vector'인 경우 'erase'를 호출해도 RAM이 비어 있지 않습니다. – PaulMcKenzie

+1

std :: deque는 시퀀스의 시작 부분에서도 요소를 효율적으로 삽입하고 삭제하도록 설계된 컨테이너입니다. –

답변

0

마지막으로 나는 아직도

m_outputBuffer.erase(
      m_outputBuffer.begin(), 
      m_outputBuffer.begin()+read_samples); 

을 사용하고 있습니다.

1

std::deque은 이와 같은 상황에 가장 적합한 컨테이너 인 것으로 보입니다. std::dequestd::vector과 같은 임의 액세스 컨테이너이지만 std::vector (및 컨테이너의 끝에)과 달리 컨테이너 시작 부분에 일정한 삽입 및 삭제 복잡성이 있습니다 (상각됩니다).

+0

N이 커지면 상각 시간이 길어집니다. 실제로, N은 일반적으로 그다지 크지 않으며 벡터는 종종 더 좋습니다. – xaxxon

+0

크기는 수백, 어쩌면 수천 일 수 있습니다. 그러나 내가 양키스를 사용할 수 있는지 알게 될 것입니다. – Salamandar

-3

이 경우 C++을 사용하지 마십시오. C로 작성하십시오. 물론 C++의 서브 세트입니다.

버퍼는 메모리 영역과 시작 위치에 하나, 끝 하나에 두 개의 포인터로 구성됩니다. 데이터가 입력되면 래핑 할 때까지 데이터를 끝 포인터에 추가합니다. 데이터가 꺼지면 읽기 포인터를 증가시킵니다. 데이터를 삭제하거나 지울 필요가 없습니다. 버퍼 오버플로가 발생하면 무언가 잘못되어 시스템을 종료해야합니다. 확장하면 충돌 프로세스가 연장됩니다. 소거 한 덩어리에서 수행하고, 데이터 왼쪽, 내 벡터의 시작 부분에 따라서 더 포인터 변경 이전되지 않은 : 정말 효율적으로

+0

C는 C++의 하위 집합이 아닙니다. 두 언어는 비슷한 구문을 사용합니다. 그게 전부입니다. C++은 때때로 C 코드를 컴파일 할 수 있지만 결과는 일반적으로 C++ 사고와 논리를 C에 적용하면 C보다 차선책을 띄게됩니다. – user4581301

+0

이 답변의 기본 아이디어에 동의하지만이 코드는 사용자가 생각하기에 이해할 수없는 부분입니다. 언어 선택과 관련이있다. 나는 또한 완충 대를 성장시키지 않는다는 것에 동의하지 않는다. 그러나 이것은 OP의 문제에서 발생하는 유일한 대답입니다. 버퍼가 있습니다 ...따라서 정상적인 작동의 일부로 정의에 따라 아무 것도 할당하거나 할당을 해제하지 않아야합니다. –

+0

오디오 버퍼는 매우 낮은 수준의 데이터 구조입니다. 자신이하는 일을 안다면 C++ STL을 사용할 수 있지만 경험이 많은 프로그래머에게는 혼란스럽고 경험이 적은 사람에게는 혼란의 원인이됩니다. 기본적으로 비트 수준에서 구조를 구현하고 모든 작업을 제어하려고합니다. –

관련 문제