std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
une std::list serait elle plus approprié?
std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
une std::list serait elle plus approprié?
std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
une std::list serait elle plus approprié?
bonsoir,
je vais (tenter) d'implementer une unorderer_map assez volumineuse
environ 100 000 entrées. je ne pose des question sur l'occupation
memoire.
une entrée = key + data
la key est de taille fixe, mais les data de taille variable
(possede un membre vector)
ce vector sera composé de un (cas general) a quelques elements (une
dizaine)
bonsoir,
je vais (tenter) d'implementer une unorderer_map assez volumineuse
environ 100 000 entrées. je ne pose des question sur l'occupation
memoire.
une entrée = key + data
la key est de taille fixe, mais les data de taille variable
(possede un membre vector)
ce vector sera composé de un (cas general) a quelques elements (une
dizaine)
bonsoir,
je vais (tenter) d'implementer une unorderer_map assez volumineuse
environ 100 000 entrées. je ne pose des question sur l'occupation
memoire.
une entrée = key + data
la key est de taille fixe, mais les data de taille variable
(possede un membre vector)
ce vector sera composé de un (cas general) a quelques elements (une
dizaine)
On Mon, 23 Oct 2006 22:36:26 +0200, (Bruno
Causse):std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
Si.
On Mon, 23 Oct 2006 22:36:26 +0200, pasde.hcyrano.spam@free.fr (Bruno
Causse):
std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
Si.
On Mon, 23 Oct 2006 22:36:26 +0200, (Bruno
Causse):std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
Si.
je vais (tenter) d'implementer une unorderer_map assez volumineuse
environ 100 000 entrées. je ne pose des question sur l'occupation
memoire.
une entrée = key + data
la key est de taille fixe, mais les data de taille variable
(possede un membre vector)
ce vector sera composé de un (cas general) a quelques elements (une
dizaine)
la question que je me pose est :
std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
une std::list serait elle plus approprié?
je vais (tenter) d'implementer une unorderer_map assez volumineuse
environ 100 000 entrées. je ne pose des question sur l'occupation
memoire.
une entrée = key + data
la key est de taille fixe, mais les data de taille variable
(possede un membre vector)
ce vector sera composé de un (cas general) a quelques elements (une
dizaine)
la question que je me pose est :
std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
une std::list serait elle plus approprié?
je vais (tenter) d'implementer une unorderer_map assez volumineuse
environ 100 000 entrées. je ne pose des question sur l'occupation
memoire.
une entrée = key + data
la key est de taille fixe, mais les data de taille variable
(possede un membre vector)
ce vector sera composé de un (cas general) a quelques elements (une
dizaine)
la question que je me pose est :
std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
une std::list serait elle plus approprié?
je vais (tenter) d'implementer une unorderer_map assez volumineuse
environ 100 000 entrées. je ne pose des question sur l'occupation
memoire.
une entrée = key + data
la key est de taille fixe, mais les data de taille variable
(possede un membre vector)
ce vector sera composé de un (cas general) a quelques elements (une
dizaine)
la question que je me pose est :
std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
Il y a reserve() qui devrait permettre d'influer sur cette
optimisation il me semble.
une std::list serait elle plus approprié?
Attention: deviner l'usage mémoire est difficile. Si on prend
une list, on va surement avoir une liste chainée de cellules,
chaque cellule contenant deux pointeurs vers les deux autres,
en plus de la taille de ton objet.
Ensuite, les allocateurs habituels allouent souvent des
blocs de quantité mémoire en puissance de 2. Donc, si par
malchance tu demande (2^n)+1 octets, tu en utilises réellement
2^(n+1)...
Heureusement, les conteneurs de la STL te permettent de
spécifier ton propre allocateur, qui peut être optimisé
pour l'objet maClasse.
je vais (tenter) d'implementer une unorderer_map assez volumineuse
environ 100 000 entrées. je ne pose des question sur l'occupation
memoire.
une entrée = key + data
la key est de taille fixe, mais les data de taille variable
(possede un membre vector)
ce vector sera composé de un (cas general) a quelques elements (une
dizaine)
la question que je me pose est :
std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
Il y a reserve() qui devrait permettre d'influer sur cette
optimisation il me semble.
une std::list serait elle plus approprié?
Attention: deviner l'usage mémoire est difficile. Si on prend
une list, on va surement avoir une liste chainée de cellules,
chaque cellule contenant deux pointeurs vers les deux autres,
en plus de la taille de ton objet.
Ensuite, les allocateurs habituels allouent souvent des
blocs de quantité mémoire en puissance de 2. Donc, si par
malchance tu demande (2^n)+1 octets, tu en utilises réellement
2^(n+1)...
Heureusement, les conteneurs de la STL te permettent de
spécifier ton propre allocateur, qui peut être optimisé
pour l'objet maClasse.
je vais (tenter) d'implementer une unorderer_map assez volumineuse
environ 100 000 entrées. je ne pose des question sur l'occupation
memoire.
une entrée = key + data
la key est de taille fixe, mais les data de taille variable
(possede un membre vector)
ce vector sera composé de un (cas general) a quelques elements (une
dizaine)
la question que je me pose est :
std::vector<maClass) list; ne reserve pas pas souci d'optimisation un
nombre d'element minimun?
Il y a reserve() qui devrait permettre d'influer sur cette
optimisation il me semble.
une std::list serait elle plus approprié?
Attention: deviner l'usage mémoire est difficile. Si on prend
une list, on va surement avoir une liste chainée de cellules,
chaque cellule contenant deux pointeurs vers les deux autres,
en plus de la taille de ton objet.
Ensuite, les allocateurs habituels allouent souvent des
blocs de quantité mémoire en puissance de 2. Donc, si par
malchance tu demande (2^n)+1 octets, tu en utilises réellement
2^(n+1)...
Heureusement, les conteneurs de la STL te permettent de
spécifier ton propre allocateur, qui peut être optimisé
pour l'objet maClasse.
Attention: deviner l'usage mémoire est difficile. Si on prend
une list, on va surement avoir une liste chainée de cellules,
chaque cellule contenant deux pointeurs vers les deux autres,
en plus de la taille de ton objet.
Ensuite, les allocateurs habituels allouent souvent des
blocs de quantité mémoire en puissance de 2. Donc, si par
malchance tu demande (2^n)+1 octets, tu en utilises réellement
2^(n+1)...
Le multiplicateur varie selon les implémentations ; je crois
qu'aujourd'hui, 1.5 est plus courant que 2.
Note que si tu laisses croître le vector de cette façon, tu
risques beaucoup de pertes suite à la fragmentation de la
mémoire aussi : si ton implémentation utilise un multiplicateur
de 2, tu risques fort qu'après (2^n)+1 allocations, tu as
utiliser de la mémoire pour 2^(n+2), dont la moitié serait
disponible pour d'autres objets (mais il faut l'avoir eu).
Attention: deviner l'usage mémoire est difficile. Si on prend
une list, on va surement avoir une liste chainée de cellules,
chaque cellule contenant deux pointeurs vers les deux autres,
en plus de la taille de ton objet.
Ensuite, les allocateurs habituels allouent souvent des
blocs de quantité mémoire en puissance de 2. Donc, si par
malchance tu demande (2^n)+1 octets, tu en utilises réellement
2^(n+1)...
Le multiplicateur varie selon les implémentations ; je crois
qu'aujourd'hui, 1.5 est plus courant que 2.
Note que si tu laisses croître le vector de cette façon, tu
risques beaucoup de pertes suite à la fragmentation de la
mémoire aussi : si ton implémentation utilise un multiplicateur
de 2, tu risques fort qu'après (2^n)+1 allocations, tu as
utiliser de la mémoire pour 2^(n+2), dont la moitié serait
disponible pour d'autres objets (mais il faut l'avoir eu).
Attention: deviner l'usage mémoire est difficile. Si on prend
une list, on va surement avoir une liste chainée de cellules,
chaque cellule contenant deux pointeurs vers les deux autres,
en plus de la taille de ton objet.
Ensuite, les allocateurs habituels allouent souvent des
blocs de quantité mémoire en puissance de 2. Donc, si par
malchance tu demande (2^n)+1 octets, tu en utilises réellement
2^(n+1)...
Le multiplicateur varie selon les implémentations ; je crois
qu'aujourd'hui, 1.5 est plus courant que 2.
Note que si tu laisses croître le vector de cette façon, tu
risques beaucoup de pertes suite à la fragmentation de la
mémoire aussi : si ton implémentation utilise un multiplicateur
de 2, tu risques fort qu'après (2^n)+1 allocations, tu as
utiliser de la mémoire pour 2^(n+2), dont la moitié serait
disponible pour d'autres objets (mais il faut l'avoir eu).
Attention: deviner l'usage mémoire est difficile. Si on prend
une list, on va surement avoir une liste chainée de cellules,
chaque cellule contenant deux pointeurs vers les deux autres,
en plus de la taille de ton objet.
Ensuite, les allocateurs habituels allouent souvent des
blocs de quantité mémoire en puissance de 2. Donc, si par
malchance tu demande (2^n)+1 octets, tu en utilises réellement
2^(n+1)...
Le multiplicateur varie selon les implémentations ; je crois
qu'aujourd'hui, 1.5 est plus courant que 2.
Note que si tu laisses croître le vector de cette façon, tu
risques beaucoup de pertes suite à la fragmentation de la
mémoire aussi : si ton implémentation utilise un multiplicateur
de 2, tu risques fort qu'après (2^n)+1 allocations, tu as
utiliser de la mémoire pour 2^(n+2), dont la moitié serait
disponible pour d'autres objets (mais il faut l'avoir eu).
Je crois que nous ne nous comprenons pas: je ne dis pas que
vector croît en 2^n, je dis que l'allocateur mémoire qui
donne la mémoire à vector alloue des blocs en puissance de 2.
C'était par exemple le cas du malloc de la glibc sous Linux
la dernière fois que j'ai regardé, et il me semble que c'est
assez commun comme stratégie.
Attention: deviner l'usage mémoire est difficile. Si on prend
une list, on va surement avoir une liste chainée de cellules,
chaque cellule contenant deux pointeurs vers les deux autres,
en plus de la taille de ton objet.
Ensuite, les allocateurs habituels allouent souvent des
blocs de quantité mémoire en puissance de 2. Donc, si par
malchance tu demande (2^n)+1 octets, tu en utilises réellement
2^(n+1)...
Le multiplicateur varie selon les implémentations ; je crois
qu'aujourd'hui, 1.5 est plus courant que 2.
Note que si tu laisses croître le vector de cette façon, tu
risques beaucoup de pertes suite à la fragmentation de la
mémoire aussi : si ton implémentation utilise un multiplicateur
de 2, tu risques fort qu'après (2^n)+1 allocations, tu as
utiliser de la mémoire pour 2^(n+2), dont la moitié serait
disponible pour d'autres objets (mais il faut l'avoir eu).
Je crois que nous ne nous comprenons pas: je ne dis pas que
vector croît en 2^n, je dis que l'allocateur mémoire qui
donne la mémoire à vector alloue des blocs en puissance de 2.
C'était par exemple le cas du malloc de la glibc sous Linux
la dernière fois que j'ai regardé, et il me semble que c'est
assez commun comme stratégie.
Attention: deviner l'usage mémoire est difficile. Si on prend
une list, on va surement avoir une liste chainée de cellules,
chaque cellule contenant deux pointeurs vers les deux autres,
en plus de la taille de ton objet.
Ensuite, les allocateurs habituels allouent souvent des
blocs de quantité mémoire en puissance de 2. Donc, si par
malchance tu demande (2^n)+1 octets, tu en utilises réellement
2^(n+1)...
Le multiplicateur varie selon les implémentations ; je crois
qu'aujourd'hui, 1.5 est plus courant que 2.
Note que si tu laisses croître le vector de cette façon, tu
risques beaucoup de pertes suite à la fragmentation de la
mémoire aussi : si ton implémentation utilise un multiplicateur
de 2, tu risques fort qu'après (2^n)+1 allocations, tu as
utiliser de la mémoire pour 2^(n+2), dont la moitié serait
disponible pour d'autres objets (mais il faut l'avoir eu).
Je crois que nous ne nous comprenons pas: je ne dis pas que
vector croît en 2^n, je dis que l'allocateur mémoire qui
donne la mémoire à vector alloue des blocs en puissance de 2.
C'était par exemple le cas du malloc de la glibc sous Linux
la dernière fois que j'ai regardé, et il me semble que c'est
assez commun comme stratégie.
Marc Boyer wrote:Je crois que nous ne nous comprenons pas: je ne dis pas que
vector croît en 2^n, je dis que l'allocateur mémoire qui
donne la mémoire à vector alloue des blocs en puissance de 2.
C'était par exemple le cas du malloc de la glibc sous Linux
la dernière fois que j'ai regardé, et il me semble que c'est
assez commun comme stratégie.
En effet, j'avais mal compris. Je connaissais des versions de
malloc qui fonctionnaient comme ça dans le temps, mais je crois
qu'elles ne servaient plus, et qu'on savait faire mieux depuis.
Marc Boyer wrote:
Je crois que nous ne nous comprenons pas: je ne dis pas que
vector croît en 2^n, je dis que l'allocateur mémoire qui
donne la mémoire à vector alloue des blocs en puissance de 2.
C'était par exemple le cas du malloc de la glibc sous Linux
la dernière fois que j'ai regardé, et il me semble que c'est
assez commun comme stratégie.
En effet, j'avais mal compris. Je connaissais des versions de
malloc qui fonctionnaient comme ça dans le temps, mais je crois
qu'elles ne servaient plus, et qu'on savait faire mieux depuis.
Marc Boyer wrote:Je crois que nous ne nous comprenons pas: je ne dis pas que
vector croît en 2^n, je dis que l'allocateur mémoire qui
donne la mémoire à vector alloue des blocs en puissance de 2.
C'était par exemple le cas du malloc de la glibc sous Linux
la dernière fois que j'ai regardé, et il me semble que c'est
assez commun comme stratégie.
En effet, j'avais mal compris. Je connaissais des versions de
malloc qui fonctionnaient comme ça dans le temps, mais je crois
qu'elles ne servaient plus, et qu'on savait faire mieux depuis.