2010-04-20 5 views
0

J'ai un morceau de code critique de performance écrit avec des pointeurs et de la mémoire dynamique. Je voudrais le réécrire avec des conteneurs STL, mais je suis un peu préoccupé par la performance. Existe-t-il un moyen d'augmenter la taille d'un conteneur sans initialiser les données?Comment faire pour changer la taille du conteneur STL en C++

Par exemple, au lieu de faire

ptr = new BYTE[x]; 

Je veux faire quelque chose comme

vec.insert(vec.begin(), x, 0); 

Cependant, cette initialise chaque octet à 0. N'est-il un moyen de simplement faire le vecteur grandir ? Je connais reserve() mais il ne fait qu'allouer de la mémoire, il ne change pas la taille du vecteur, et ne me permet pas d'y accéder avant d'avoir inséré des données valides.

Merci à tous.

+6

pourquoi voudriez-vous accéder à quelque chose qui ne contenait pas de données valides? –

+2

Cela ne devrait pas vous intéresser. 'std :: vector' est un tableau à usage général. Si vous avez besoin de vitesse brute, ce n'est pas fait pour ça (même si vous avez été suffisamment rapide pour tout ce que j'ai déjà utilisé). Vous devriez faire cuire votre propre récipient alors que vous vous souciez de ne pas inutilement initialiser les éléments. –

+0

Je dois passer un tampon à une API qui me dit combien d'espace j'ai besoin. Donc, dans l'ancien langage C, et symplifiant un peu, c'est: sz = GetSizeNeeded(); buf = malloc (sz); GetBuffer (buf); – raven

Répondre

2

vec.resize(newsize) est défini pour avoir le même effet que

vec.insert(vec.end(), newsize - vec.size(), T()) 

si newsize > vec.size() ... mais le compilateur peut avoir du mal à déterminer qu'il est de plus en plus, ne reculant pas devant, et de combien. Vous pourriez essayer de profiler avec les deux.

Si vous êtes sûr que l'initialisation par défaut prend du temps, éliminez-la explicitement avec votre propre constructeur. (Même si le constructeur implicite est correct, il est bon de montrer l'intention.)

struct BYTE { 
    char v; 
    BYTE() {} // no default initialization! 
    BYTE(char x) : v(x) {} 
    operator char&() { return v; } 
    operator char const&() const { return v; } 
    char *operator&() { return &v; } // not sure about operator&... 
    char const *operator&() const { return &v; } // probably good in this case 
}; 
+0

Merci. Enfin, j'ai résolu cela en utilisant auto_ptr. – raven

2

Modifier la taille()

Il peut ou ne peut pas faire quoi que ce soit différent de votre insert(). Les valeurs sont construites par défaut.

+0

Urghh, merci. Je ne l'ai pas vu. Quoi qu'il en soit, si les valeurs sont construites par défaut, je ne parierai pas sur ses performances. – raven

+0

@Jamie: Si ceci est la réponse à votre question, veuillez l'augmenter en cliquant sur la flèche du haut, et l'accepter en cliquant sur la grosse coche à gauche du message de Noah. –

+1

@Jaime, bon garçon. –

4

vector.resize(...) peut vous aider? Vous pouvez spécifier la taille à laquelle vous voulez redimensionner (en augmentant ou en diminuant la taille) et également initialiser ce à quoi vous voulez que les nouveaux éléments soient initialisés.

Questions connexes