2010-07-05 2 views
2

glMapBuffer에서 std :: vector로 매핑 된 메모리의 범위를 관리하는 것이 좋습니다.std :: vector로 매핑 된 메모리 (glMapBuffer)를 관리하십시오.

// map data to ptr 
T* dataPtr = (T*)glMapBuffer(this->target, access); 

[... debug code ...] 

// try to construct a std::vector from dataPtr 
T* dataPtrLast = dataPtr + size; 
mappedVector = new std::vector<T>(dataPtr, dataPtrLast); 

문제는 메모리 범위가 직접적으로 사용되지는 않지만 벡터에 복사된다는 것입니다.

제 질문은 벡터가 매핑 된 메모리 범위를 '사용'하게 만들 수 있습니까? (이상적으로는 resize/reserve에 예외를 던지십시오) 또는 이것을 수행하는 다른 표준 컨테이너가 있습니까?

친절 감사, 플로리안

답변

3

아니, 좋은 이유. 이 코드는 작동하지 않을 것입니다. 예를 들어 MapBuffer를 변경하고 벡터 내부의 크기/용량 값을 분리 할 수 ​​있습니다. 벡터로 밀어 넣어 액세스 위반/분할 오류가 발생할 수 있습니다. 크기를 조정하여 버퍼를 손상시킬 수 있습니다. 근본적으로 이미 인접 배열 내에있는 경우 어떤 이점이 있습니까? 고정 길이 배열을위한 사용자 정의 컨테이너를 굴릴 수 있습니다.

특히! 이미 이터레이터처럼 동작 할 포인터 쌍이 있다면.

+0

이 부분이 잘 보입니다. 정확히 무엇이 당신을 좋은 생각이라고 생각하게 만들 었는지 궁금하지 않는 한, 추가 할 것이 아무것도 없다고 생각합니까? 내가 아는 바로는 C++ 98 스펙은 벡터의 연속 저장을 보장하지 않습니다. (비록 최근 제안 된 개정판이 그것을 분명히하고 있지만) – wrosecrans

+1

C++ 98은 오래전 일입니다. C++ 03은 벡터의 연속적인 저장을 보장합니다. 그 기준은 적용 가능합니다. – Puppy

+0

Ok ... 나는 이 맵핑 된 메모리 범위에서 작업하기 위해 벡터의 깨끗한 인터페이스를 갖는 것이 좋을 것이라고 생각했다./ – fho

관련 문제