Un smart pointer est un objet qui encapsule un pointeur, il y a donc bien une allocation de l'objet qui encapsule. Tu peux mettre ce que tu veux comme pointeur dedans, qu'il soit valide ou invalide ne change rien au fais qu'il y a bien allocation d'une coquille pour stocker le pointeur et son compteur de références.
La derniere fois que j'ai regardé l'implementation de boost::shared_ptr, j'y ai vu... qu'il n'y a pas de telle coquille. Le shared_ptr possède deux membres, un pointeur vers le compteur de référence, et un pointeur vers l'objet partagé (oui, les deux ne sont pas co-localisés, c'est un design possible, il y avait un papier sur les performances qui trainait sur le site, bref...)
Et avec ce modèle, on n'est pas obligé d'allouer le compteur dans le constructeur par défaut, parce que cela ne sert a rien.
Désolé, jne n'avais pas cherché a comprendre ce que tu voulais dire, mais d'autre s'en sont chargés dans les commentaires an dessous. Maintenant je vois, et je me dis qu'un bon design d'utilisation des references partagées serait plus efficace que la solution a compteurs global/local. Mais mon, c'est que mon avis...
Relis attentivement l'exemple de Thomas. Si tu ne comprends pas pourquoi il faut un comptage de référence atomique, tu devrais t'abstenir de faire de la programmation multi-thread, tu vas au devant de sérieux problèmes.
il faut remplacer les .begin et .end par .cbegin et .cend, j'imagine pour que l'inférence de type produise un const_iterator au lieu d'un iterator, c'est logique mais comme cela nécessite de changer les habitudes des programmeurs, ça fera probablement une "erreur" (mineure) commune de plus.
Et on a maintenant deux fonctions .begin et .cbegin qui retournent un const_iterator (pareil pour end), pour ne pas casser le code qui utilisait .begin sur un vector const ... c'est moche.
20 lignes ? J'aimerais bcp voir un pool en 20 lignes qui marche et qui est efficace (temps d'allocation, support multithread,...)
Oui, 20 lignes, c'est nettement suffisant pour un pool simple, sans multi-thread (tu rajoutes des contraintes quand ça t'arrange). Pour un exemple, demande à Herb, il te montrera.
Un pool à multiples blocs, typé et réutilisable, c'est grosso-modo 20 lignes de code, sans aucun impact sur le reste si on surcharge new/delete dans la structure bob. Ou est le problème ?
J'ai un peu de mal à cerner le genre de programme auquel tu fais référence : on a besoin d'un maximum de performances (on descend jusqu'au lignes de cache), mais d'un autre coté on alloue de nombreux objets de petite taille, avec cycle de vie court (la performance des ctor/dtor a été évoquée), et on ne peut pas faire de pré-allocation massive parce qu'il faut aussi réduire l'empreinte mémoire globale...
Ca depend du cas comme pour tout, si par defaut ton vecteur a une taille allouee de 10 objets (parce que dans le cas usuel ou le vecteur contient quelque chose il en a 10), ton constructeur va faire une allocation a chaque fois par exemple.
Gni ? L'implémentation de std::vector n'est pas obligée de faire une préallocation si on ne donne pas de capacité initiale. Si le constructeur par défaut le fait quand même, c'est un problème de qualité d'implémentation de std::vector.
Si dans ton cas particulier le vector contient généralement 10 elements, rien ne t'empeche de faire un reserve(10) avant la premiere insertion, que le vecteur soit alloué dynamiquement ou non.
L'allocateur standard dans Windows a tout un tas de features pour eviter qu'un buffer overflow dans la heap ne se transforme en vulnerabilite (...), je ne connais a peu pres aucun allocateur 'custom' qui a ces features.
Un simple pool de char[sizeof bob] obtenues via l'allocateur est suffisant.
a) J'evites le cout du constructeur / destructeur si le vecteur n'est pas utilise
Quel est le cout d'un constructeur / destructeur pour un vecteur vide ? Si le cycle de vie de la structure est un probleme de performance, ca ne viendrait pas plutot de l'allocateur ?
En ce qui concerne la taille de la structure et les performances d'un allocateur "standard" par bloc, cela n'est pertinent que si tu alloue tes structures unitairement avec cet allocateur (un gros tableau de structures n'est pas concerné).Si tu as vraiment des problèmes de performance liées a ton allocateur, pourquoi ne pas en prendre un autre, puisque le langage le permet facilement ?
Ah, oui, je comprends mieux. Donc pour gagner en performance, tu rajoute une indirection supplémentaire, et tu parsème ton code de tests if (MonVecteur != 0), c'est bien ça ?
La question portait sur l'allocation dynamique d'un std::vector<T> et la manipulation de pointeurs sur std::vector<T> ensuite, et dans ton exemple tu parles d'un tableau T[], ce n'est pas le meme besoin.
Maintenant, pour l'occupation memoire, le tableau de base, c'est au moins un pointeur, mais tu as aussi besoin de sa capacité (taille allouée), et du nombre d'éléménts présents (taille utilisée). Au final, c'est la même empreinte mémoire, sauf si la capacité et la longueur sont fixes. Mais dans ce cas, pourquoi ne pas utiliser std::array<T> ?
Bref, ca ne sert a rien d'allouer dynamiquement un std::vector<T>.
Tu viens de montrer qu'il est techniquement possible de dériver de std::vector, c'est a dire que le compilateur ne génère pas de diagnostic. Le problème, c'est que le compilateur ne va pas t'avertir des dangers potentiels a l'utilisation.
Et pourtant, dans la fonction run(), c'est bien l'instance de MyVector qui est utillisée, n'est-ce pas ? Pourquoi le comportement du programme a-t'il changé ?
Tu auras aussi des résultats comiques si tu ajoute un destructeur spécifique a MyVector et que tu manipules tes instances par l'intermédiaire de pointeur sur sdt::vector...
Les containers de la STL ne sont pas conçus pour êtres dérivés en public, mais il n'y a pas de garde fou, comme d'habitude.
Les champs circulaire, j'admets que ça peut exister, même si c'est rare. Par contre, une chèvre qui broute dans le champ alors qu'il lui est possible de brouter en dehors, ca n'existe pas.
Comme le piquet est fixé a la périphérie, quel que soit la longueur de corde, la surface mangée dans le champ sera toujours nulle, donc il n'y a pas de solution.
Je crois que c'est une question de point de vue, toi phxonx tu est au niveau paquet, et Zenitram est au niveau données émises et recues par les clients.
Si j'ai bien compris le propos, Alice envoie deux données D1 et D2, en les plaçant respectivement dans des paquets P1 et P2. Comme le réseau fait ce qu'il peut, a l'arrivée on reçoit dans l'ordre P2 puis P1, mais comme la vie est bien faite, c'est P1 qui sera traité avant P2 et donc Bob a bien les données dans l'ordre D1 puis D2.
Alice, Bob et Zenitram sont contents, parce que les données reçues sont identiques a celles qui ont été envoyées, mais phxonx n'est pas satisfait parce que c'est l'ordre des paquets qui l'interesse.
En resume le compilo Microsoft est bugge car ne respecte pas la norme ACPI!
Je crois que c'est la le point d'incomprehension avec PbPG. Pour lui, le compilo et la plateforme sont conformes à la norme parce que une source correcte donnera un résultat qui fonctionne. Pour d'autres, la conformité à la norme se mesure plutôt vis à vis de source incorrecte, qui devrait être rejetée par le compilo, ou vautrer a l'execution.
Mais il y a peut-etre dans la norme ACPI (que je ne connais pas) un jeu subtil de "comportement indéfinis" comme dans les normes C ou C++, et dans ce cas son raisonnement est valable, le compilo serait conforme.
Windows est conforme, tu lui passe une table ACPI correcte, il l'avale sans problème
et maintenant:
le compilo MS laisse passer plus d'erreurs que le compilo Intel car certaines de ces erreurs sont sans consequences pour Windows
Ahem... si le compilateur MS était moins laxiste, les constructeurs pourraient corriger leurs erreurs, obtenir des tables correctes, et ca marcherait sous Windows mais aussi ailleurs.
Bref, c'est une situation qui vous arrange bien, et on va présumer que ca n'a pas été fait exprès...
Ben non, c'est tout a fait légal, d'ailleurs la page que tu cite nous dit :
Le retrait de permis (et non de points) peut également être prononcé comme peine complémentaire pour certaines fautes graves relevant du droit pénal. Cette sanction ne concerne pas les infractions mais uniquement les délits, comme la conduite sous l’emprise de stupéfiants ou d’alcool, ou des délits très difficiles à commettre au guidon d’un vélo : grand excès de vitesse, ou délit de fuite après avoir provoqué un accident.
[^] # Re: templates variadiques
Posté par shbrol . En réponse à la dépêche Le standard C++0x a enfin été voté. Évalué à 1.
La derniere fois que j'ai regardé l'implementation de boost::shared_ptr, j'y ai vu... qu'il n'y a pas de telle coquille. Le shared_ptr possède deux membres, un pointeur vers le compteur de référence, et un pointeur vers l'objet partagé (oui, les deux ne sont pas co-localisés, c'est un design possible, il y avait un papier sur les performances qui trainait sur le site, bref...)
Et avec ce modèle, on n'est pas obligé d'allouer le compteur dans le constructeur par défaut, parce que cela ne sert a rien.
[^] # Re: Gouverner, c'est prévoir. Limiter internet, c'est régresser.
Posté par shbrol . En réponse au journal Horreur, enfer et damnation: Fin de l'illimité. Évalué à 8.
Recherche sur google.fr, avec les mots "yacht tva". Le premier lien contient la phrase :
donc il semblerait que le riche, lorsqu'il s'achète un yacht, a la possibilité de ne pas payer la TVA en passant par un intermédiaire spécialisé.
Par contre, je n'ai pas trouvé le même genre de service pour les paquets de pâtes...
[^] # Re: Gouverner, c'est prévoir. Limiter internet, c'est régresser.
Posté par shbrol . En réponse au journal Horreur, enfer et damnation: Fin de l'illimité. Évalué à 3.
Si tu place ton épargne sur un support qui se casse la figure, il y a une certaine partie qui ne sera pas soumise a la TVA.
[^] # Re: Gouverner, c'est prévoir. Limiter internet, c'est régresser.
Posté par shbrol . En réponse au journal Horreur, enfer et damnation: Fin de l'illimité. Évalué à 2.
Source ?
[^] # Re: templates variadiques
Posté par shbrol . En réponse à la dépêche Le standard C++0x a enfin été voté. Évalué à 1.
Désolé, jne n'avais pas cherché a comprendre ce que tu voulais dire, mais d'autre s'en sont chargés dans les commentaires an dessous. Maintenant je vois, et je me dis qu'un bon design d'utilisation des references partagées serait plus efficace que la solution a compteurs global/local. Mais mon, c'est que mon avis...
[^] # Re: templates variadiques
Posté par shbrol . En réponse à la dépêche Le standard C++0x a enfin été voté. Évalué à 1.
Relis attentivement l'exemple de Thomas. Si tu ne comprends pas pourquoi il faut un comptage de référence atomique, tu devrais t'abstenir de faire de la programmation multi-thread, tu vas au devant de sérieux problèmes.
[^] # Re: Quelque petite remarques
Posté par shbrol . En réponse à la dépêche Le standard C++0x a enfin été voté. Évalué à 1.
Et on a maintenant deux fonctions .begin et .cbegin qui retournent un const_iterator (pareil pour end), pour ne pas casser le code qui utilisait .begin sur un vector const ... c'est moche.
[^] # Re: works for me
Posté par shbrol . En réponse à la dépêche Naissance d'un géant : Java. Évalué à 2.
Oui, 20 lignes, c'est nettement suffisant pour un pool simple, sans multi-thread (tu rajoutes des contraintes quand ça t'arrange). Pour un exemple, demande à Herb, il te montrera.
[^] # Re: works for me
Posté par shbrol . En réponse à la dépêche Naissance d'un géant : Java. Évalué à 1.
Un pool à multiples blocs, typé et réutilisable, c'est grosso-modo 20 lignes de code, sans aucun impact sur le reste si on surcharge new/delete dans la structure
bob
. Ou est le problème ?J'ai un peu de mal à cerner le genre de programme auquel tu fais référence : on a besoin d'un maximum de performances (on descend jusqu'au lignes de cache), mais d'un autre coté on alloue de nombreux objets de petite taille, avec cycle de vie court (la performance des ctor/dtor a été évoquée), et on ne peut pas faire de pré-allocation massive parce qu'il faut aussi réduire l'empreinte mémoire globale...
Un exemple concret serait le bienvenu.
[^] # Re: works for me
Posté par shbrol . En réponse à la dépêche Naissance d'un géant : Java. Évalué à 2.
Gni ? L'implémentation de std::vector n'est pas obligée de faire une préallocation si on ne donne pas de capacité initiale. Si le constructeur par défaut le fait quand même, c'est un problème de qualité d'implémentation de std::vector.
Si dans ton cas particulier le vector contient généralement 10 elements, rien ne t'empeche de faire un
reserve(10)
avant la premiere insertion, que le vecteur soit alloué dynamiquement ou non.Un simple pool de char[sizeof bob] obtenues via l'allocateur est suffisant.
[^] # Re: works for me
Posté par shbrol . En réponse à la dépêche Naissance d'un géant : Java. Évalué à 1.
Quel est le cout d'un constructeur / destructeur pour un vecteur vide ? Si le cycle de vie de la structure est un probleme de performance, ca ne viendrait pas plutot de l'allocateur ?
En ce qui concerne la taille de la structure et les performances d'un allocateur "standard" par bloc, cela n'est pertinent que si tu alloue tes structures unitairement avec cet allocateur (un gros tableau de structures n'est pas concerné).Si tu as vraiment des problèmes de performance liées a ton allocateur, pourquoi ne pas en prendre un autre, puisque le langage le permet facilement ?
[^] # Re: works for me
Posté par shbrol . En réponse à la dépêche Naissance d'un géant : Java. Évalué à 3.
Ah, oui, je comprends mieux. Donc pour gagner en performance, tu rajoute une indirection supplémentaire, et tu parsème ton code de tests
if (MonVecteur != 0)
, c'est bien ça ?[^] # Re: works for me
Posté par shbrol . En réponse à la dépêche Naissance d'un géant : Java. Évalué à 1.
La question portait sur l'allocation dynamique d'un
std::vector<T>
et la manipulation de pointeurs surstd::vector<T>
ensuite, et dans ton exemple tu parles d'un tableauT[]
, ce n'est pas le meme besoin.Maintenant, pour l'occupation memoire, le tableau de base, c'est au moins un pointeur, mais tu as aussi besoin de sa capacité (taille allouée), et du nombre d'éléménts présents (taille utilisée). Au final, c'est la même empreinte mémoire, sauf si la capacité et la longueur sont fixes. Mais dans ce cas, pourquoi ne pas utiliser
std::array<T>
?Bref, ca ne sert a rien d'allouer dynamiquement un
std::vector<T>
.[^] # Re: works for me
Posté par shbrol . En réponse à la dépêche Naissance d'un géant : Java. Évalué à 3.
Tu viens de montrer qu'il est techniquement possible de dériver de std::vector, c'est a dire que le compilateur ne génère pas de diagnostic. Le problème, c'est que le compilateur ne va pas t'avertir des dangers potentiels a l'utilisation.
En modifiant légèrement le main() :
On obtient a l'exécution :
Et pourtant, dans la fonction run(), c'est bien l'instance de MyVector qui est utillisée, n'est-ce pas ? Pourquoi le comportement du programme a-t'il changé ?
Tu auras aussi des résultats comiques si tu ajoute un destructeur spécifique a MyVector et que tu manipules tes instances par l'intermédiaire de pointeur sur sdt::vector...
Les containers de la STL ne sont pas conçus pour êtres dérivés en public, mais il n'y a pas de garde fou, comme d'habitude.
[^] # Re: Journal completement foireux
Posté par shbrol . En réponse au journal Bitcoin hors-la-loi, Tor victime collatérale. Évalué à 2.
Oui, sauf si c'est moi qui trouve ton portefeuille...
[^] # Re: The goat leash
Posté par shbrol . En réponse au journal Cherche exemple d'expression de calcul lourd. Évalué à 1.
Et depuis quand une clôture empêche une chèvre de brouter de l'autre coté ?
[^] # Re: The goat leash
Posté par shbrol . En réponse au journal Cherche exemple d'expression de calcul lourd. Évalué à 2.
Les champs circulaire, j'admets que ça peut exister, même si c'est rare. Par contre, une chèvre qui broute dans le champ alors qu'il lui est possible de brouter en dehors, ca n'existe pas.
Comme le piquet est fixé a la périphérie, quel que soit la longueur de corde, la surface mangée dans le champ sera toujours nulle, donc il n'y a pas de solution.
Je suis déjà sorti...
[^] # Re: XoT et fermeture transpac
Posté par shbrol . En réponse au journal Transmissions bancaires : toujours pas dans un format ouvert, et encore plus cher !. Évalué à 2.
Je crois que c'est une question de point de vue, toi phxonx tu est au niveau paquet, et Zenitram est au niveau données émises et recues par les clients.
Si j'ai bien compris le propos, Alice envoie deux données D1 et D2, en les plaçant respectivement dans des paquets P1 et P2. Comme le réseau fait ce qu'il peut, a l'arrivée on reçoit dans l'ordre P2 puis P1, mais comme la vie est bien faite, c'est P1 qui sera traité avant P2 et donc Bob a bien les données dans l'ordre D1 puis D2.
Alice, Bob et Zenitram sont contents, parce que les données reçues sont identiques a celles qui ont été envoyées, mais phxonx n'est pas satisfait parce que c'est l'ordre des paquets qui l'interesse.
[^] # Re: cool je vais tester sur mon portable ;)
Posté par shbrol . En réponse au journal La surconsommation électrique de Linux identifiée. Évalué à 4.
Je crois que c'est la le point d'incomprehension avec PbPG. Pour lui, le compilo et la plateforme sont conformes à la norme parce que une source correcte donnera un résultat qui fonctionne. Pour d'autres, la conformité à la norme se mesure plutôt vis à vis de source incorrecte, qui devrait être rejetée par le compilo, ou vautrer a l'execution.
Mais il y a peut-etre dans la norme ACPI (que je ne connais pas) un jeu subtil de "comportement indéfinis" comme dans les normes C ou C++, et dans ce cas son raisonnement est valable, le compilo serait conforme.
[^] # Re: cool je vais tester sur mon portable ;)
Posté par shbrol . En réponse au journal La surconsommation électrique de Linux identifiée. Évalué à 6.
Tu nous a dit plus haut :
et maintenant:
Ahem... si le compilateur MS était moins laxiste, les constructeurs pourraient corriger leurs erreurs, obtenir des tables correctes, et ca marcherait sous Windows mais aussi ailleurs.
Bref, c'est une situation qui vous arrange bien, et on va présumer que ca n'a pas été fait exprès...
[^] # Re: Et comment feront les chauffards
Posté par shbrol . En réponse au journal Après les voitures sans permis, voici les voitures sans conducteurs :). Évalué à 2.
Je ne sais pas si c'est systematique ou pas, mais j'ai pas envie d'essayer...
[^] # Re: Et comment feront les chauffards
Posté par shbrol . En réponse au journal Après les voitures sans permis, voici les voitures sans conducteurs :). Évalué à 2.
Ben non, c'est tout a fait légal, d'ailleurs la page que tu cite nous dit :
[^] # Re: Et comment feront les chauffards
Posté par shbrol . En réponse au journal Après les voitures sans permis, voici les voitures sans conducteurs :). Évalué à 1.
Mais si tu roule bourré en vélo, et que tu as un papier rose, alors on te le confisquera...
[^] # Re: Yo, à rebour
Posté par shbrol . En réponse au journal Les SSD, ce n'est pas au point. Évalué à 1.
Merci pour l'info.
[^] # Re: Ben moi...
Posté par shbrol . En réponse au journal Programmez vous chez vous?. Évalué à 1.
Copain ! Je développe sur mon temps perso un programme qui correspond très fortement à ta description...