J'ai un std :: vecteur de valeurs pour lesquelles je connais la taille maximale, mais la taille réelle variera pendant l'utilisation:Comment puis-je obtenir l'adresse du buffer allouée par 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();
}
}
Cependant, setupBuffer, je dois obtenir un pointeur vers le début de Les données de myVector. J'utilise une bibliothèque tierce dans laquelle je dois mettre en cache ce pointeur avant de l'utiliser dans un appel effectué pendant la section "données de processus ...".
void setupBuffer(const size_t maxSize) {
myVector.reserve(maxSize);
cachePtr(&(myVector[0])); // doesn't work, obviously
}
Je ne veux pas redimensionner() le vecteur avant, comme je veux utiliser vector.size() pour signifier le nombre d'éléments ajoutés au vecteur.
Donc, est-il possible d'obtenir le pointeur sur le tampon du vecteur après l'allocation (reserve()) mais avant qu'il ait des éléments? J'imagine que le tampon existe (et ne bougera pas tant que je limiterai le nombre de valeurs push_back'd) .... peut-être que ce n'est pas garanti?
Pourquoi avez-vous besoin de mettre en cache le pointeur, plutôt que de le lire en toute sécurité lorsque vous en avez besoin? –
J'utilise une bibliothèque tierce pour les E/S dans un format de fichier spécifique. La façon dont cela fonctionne est de mettre en place des «tampons» dans la bibliothèque en envoyant un pointeur et une taille maximale. Vous pouvez ensuite appeler de manière asynchrone par ex. 'write' qui vide les données sur le disque. Je pourrais mettre en place le pointeur à chaque fois que je toucherais maxSize, mais ce serait un surcoût supplémentaire (combien je devrais tester). Bon point, cependant. – Ryan
Notez que cette question vous demande comment obtenir le pointeur, mais les réponses diffèrent sur ce que vous êtes autorisé à * faire * avec ce pointeur une fois que vous l'avez. Pour une question qui couvre directement ce problème, veuillez consulter [Le pointeur brut est-il accessible après std :: vector :: reserve safe?] (Http://stackoverflow.com/questions/8228072/is-accessing-the-raw-pointer -after-stdvectorreserve-safe) –