OVH Cloud OVH Cloud

Debutant C++

25 réponses
Avatar
MALIS Pierre-Yves
Je programme en VC6++, mais j'ai encore certaines "lacunes" en
programmation.

J'aimerais notamment avoir des exemples de structures de donnees de type
pile ou file, qui me permettrait une gestion un peu plus dynamique de la
memoire, notamment au stade ou j'en suis je cree des tableaux de 100
"cases" alors qu'en general je n'en utilise qu'une dizaine de celles-ci.

Si vous aviez un site simple ou je pourrais trouver ca ce serait cool.

Pierre-Yves.

10 réponses

1 2 3
Avatar
Luc Hermitte
"Arnaud Debaene" wrote in
news:4005dd57$0$28708$:

ceci dit, présenter les constructeurs avec placement à un débutant ne
me parait pas un modèle de pédagogie :-)



Nous sommes d'accord. Point de salut en dehors des abstractions ;)

--
Luc Hermitte
Avatar
Luc Hermitte
MALIS Pierre-Yves wrote in
news::

Meme si le sujet est parti un peu dans tous les sens, je pense que je
vais essayer de jeter un petit coup d'oeil, et non ce n'est pas pour
"l'ecole", a mon stade on appelle ca la fac,



Même après la FAC on continue de dire l'école. Si si ;-)

mais je n'ai fais les piles qu'en ADA et c'etait beaucoup plus simple
( dans mes souvenirs en tout cas...)



Les abstractions en C++ sont dans la SL, donc pour les piles :
std::stack<>.
Après, ce n'est pas excessivement compliqué, c'est surtout la syntaxe qui
change. Et si on veut être correct il y a divers petits détails
supplémentaires à surveiller en C++ quand on veut programmer ces
abstractions.

--
Luc Hermitte
Avatar
Thierry
Bonjour,

Arnaud Debaene a écrit :

ceci dit, présenter les constructeurs avec placement à



Qu'est ce que c'est que cette bete ?? J'en suis toujours a "on ne peut pas
appeler un constructeur explicitement".

--
« Willy, j'ai mangé le chat. »
Avatar
Ambassadeur Kosh
"Thierry" a écrit dans le message de news:

Bonjour,

Arnaud Debaene a écrit :

> ceci dit, présenter les constructeurs avec placement à

Qu'est ce que c'est que cette bete ?? J'en suis toujours a "on ne peut pas
appeler un constructeur explicitement".



de votre point de vue non.
mais en écrivant un operator new (qui n'en a pas vraiment la fonctionalité),
oui.
Avatar
Arnaud Debaene
Thierry wrote:
Bonjour,

Arnaud Debaene a écrit :

ceci dit, présenter les constructeurs avec placement à



Qu'est ce que c'est que cette bete ?? J'en suis toujours a "on ne
peut pas appeler un constructeur explicitement".



class A
{
//plein de trucs
};

//allocation avec le "placement-new"
void* buffer = malloc(sizeof(A)); //on pourrait utiliser HeapAlloc, un
memory mapped file ou n'importe quelle manière d'allouer un buffer.
A* ptr_A = new (buffer) A; //création d'un objet A dans l'espace pointé
par buffer

//utilisation de ptr_A

ptr_A->~A(); //appel explicite du destructeur
free (buffer); //libération explicite du buffer.

Grosso-modo, le "placement-new" permet de dissocier les 2 opérations qui
sont faites ensemble par un new "classique" :
- allocation d'un buffer mémoire pour contenir l'objet.
- création de l'objet dans et espace mémoire

...et bien entendu le contraire lors de la destruction.

Arnaud
Avatar
Christian
Bonjour

As tu des exemple où ça peut être vraiment utile ? On s'épargne le couple malloc/ free donc réutilisation rapide
d'un espace mémoire je suppose ... ?

Grosso-modo, le "placement-new" permet de dissocier les 2 opérations qui
sont faites ensemble par un new "classique" :
- allocation d'un buffer mémoire pour contenir l'objet.
- création de l'objet dans et espace mémoire


Avatar
Ambassadeur Kosh
> As tu des exemple où ça peut être vraiment utile ? On s'épargne le couple


malloc/ free donc réutilisation rapide
d'un espace mémoire je suppose ... ?



dans le cas d'un vector. on alloue les données par paquets, mais on
"construit" les objets un par un.
parait il que l'allocateur a du mal de gerer des millions de miettes et
qu'il en resulte un certain gachi (hitsoire de page d'allocation
chsaipakoi). on peut aussi résoudre de cette maniere des problemes de
fragmentation mémoire en réalisant son allocateur.

plein de choses de ce gout. et donc tu supposes juste.
Avatar
adebaene
"Christian" wrote in message news:<4032c1fd$0$28611$...
Bonjour

As tu des exemple où ça peut être vraiment utile ? On s'épargne le couple malloc/ free donc réutilisation rapide
d'un espace mémoire je suppose ... ?



- Dans les conteneurs genre std::vector qui peuvent avoir une capacité
supérieure à leur taille courante, on alloue un buffer pour X objets
puis on créé / détruit des objets dans ce buffer selon les besoins.

- Pour créer un objet dans une zone mémoire particulière, comme un
memory mapped file pour partager un objet entre plusieurs processus.

- Dans la programmation embarquée, pour créer un objet à l'emplacement
mémoire du hardware que l'objet représente.

Arnaud
Avatar
Manuel Leclerc
Arnaud Debaene a écrit :

- Pour créer un objet dans une zone mémoire
particulière, comme un memory mapped file pour
partager un objet entre plusieurs processus.



Jésus Marie Joseph, on peut vraiment faire une
chose pareille ? Et le code, il est où ?
Avatar
Thierry
Bonjour,

Arnaud Debaene a écrit :

- Dans les conteneurs genre std::vector qui peuvent avoir une capacité
supérieure à leur taille courante, on alloue un buffer pour X objets
puis on créé / détruit des objets dans ce buffer selon les besoins.

- Pour créer un objet dans une zone mémoire particulière, comme un
memory mapped file pour partager un objet entre plusieurs processus.



Ca marcherait aussi dans un data seg partagé de DLL ?
Le pb que je vois c'est que c'est dans le new qu'est explicitement precisé
où doit être creer l'objet. Y'a moyen de combiner le placement avec la
surcharge de l'operateur new pour que tous les objets d'un module soient
créés dans un zone mémoire précise ?

- Dans la programmation embarquée, pour créer un objet à l'emplacement
mémoire du hardware que l'objet représente.




--
« Willy, j'ai mangé le chat. »
1 2 3