나는 :: 내가 최대 크기를 알 수있는 값의 벡터를 성병을 가지고 있지만 실제 크기는 사용 중에 달라집니다 : setupBuffer에, 나는의 시작에 대한 포인터를 얻기 위해 필요vector :: reserve()에 의해 할당 된 버퍼의 주소는 어떻게 얻을 수 있습니까?
void setupBuffer(const size_t maxSize) {
myVector.reserve(maxSize);
}
void addToBuffer(const Value& v) {
myVector.push_back(v);
if (myVector.size() == maxSize) {
// process data...
myVector.clear();
}
}
그러나 myVector의 데이터. 제 3 자 라이브러리를 사용하고 있는데이 포인터를 "프로세스 데이터 ..."섹션에서 사용한 호출에 사용할 수 있도록 캐시해야합니다.
void setupBuffer(const size_t maxSize) {
myVector.reserve(maxSize);
cachePtr(&(myVector[0])); // doesn't work, obviously
}
나는 벡터에 추가 된 요소의 수를 의미하는 vector.size()를 사용하여 원하는대로, 정면) (벡터의 크기를 조정하고 싶지 않아요.
그래서 할당 후 벡터 버퍼에 대한 포인터를 얻을 수있는 방법이 있습니까 (reserve())? 요소가 있기 전에? 나는 버퍼가 존재한다고 상상할 것이다. (push_back의 값의 수를 제한하는 한 움직이지 않을 것이다.) 아마도 이것은 보장되지 않을까?
왜 포인터를 필요할 때 안전하게 읽는 대신 캐시해야합니까? –
특정 파일 형식에 대한 입출력을 위해 타사 라이브러리를 사용하고 있습니다. 그것이 작동하는 방식은 포인터와 최대 크기를 보내어 라이브러리에 '버퍼'를 설정하는 것입니다. 그런 다음 비동기 적으로 호출 할 수 있습니다. 디스크에 데이터를 플러시하는 'write'. maxSize를 쳤을 때마다 포인터를 설정할 수는 있지만 추가 오버 헤드가 될 수 있습니다 (테스트해야하는 정도). 그래도 좋은 지적이다. – Ryan
이 질문은 포인터를 얻는 방법을 묻지 만 대답을 얻으면 그 포인터로 할 수있는 것에 대한 대답이 다릅니다. 그 문제를 직접 다루는 질문은 [std :: vector :: reserve safe 뒤에 원시 포인터에 액세스합니까?] (http://stackoverflow.com/questions/8228072/is-accessing-the-raw-pointer)를 참조하십시오. -after-stdvectorreserve-safe) –