Sujet: [C++] Utilisation de la mémoire
05/04/2006 @ 14:01:13: blietaer: [C++] Utilisation de la mémoire
Alors ça pour un sujet con, c'est bien un sujet de débutant en C.
Si bien que...je ne m'en souviens plus.

Je voudrais faire une petite application qui va gérer des classes (2-3) utilisées par 250 objets chacunes. Elle ne contiendrons pas spécialement des données lourdes (qques petites array au mieux). Il s'agira ensuite de les faire inter-réagir dans une optique de tri pour optimiser un rangement. (style placement dans un avion, tables de mariages,..).

ref de nombreuses manipulations sur ces nombreuses classes.

Si je ne fais rien je suppose qu'elle vont être "bêtement" allouées en mémoire et trimballées....

Le fait d'utiliser la famille "malloc()" va-t-il stabiliser, nettoyer, alleger, accélerer mon soft?

A quelle moment faire ces allocation?
ds le constructeur?
un objet s'auto-alloc?

merci pour vos éventuels rafraichissements.

ceci sent bon ? :disapointted:

// Create an array containing n MyClass objects using the default constructor:
MyClass *dynamicArray = new MyClass[n];

// Access it:
dynamicArray[n - 1].Method();

// Get rid of the array:
delete[] dynamicArray;


et un bon editeur/IDE C\C++ gratos sous XP ? :tinostar:

05/04/2006 @ 14:31:24: zion: [C++] Utilisation de la mémoire
J'ai pas tout suivi déjà...

Je suis pas expert en C++, mais ca va réellement créer n objets ta ligne miracle en appelant le constructeur quivabien? En pascal t'aurais juste un array de pointeurs vers des objets mais aucun d'initialisé. Un amateur C++ pour confirmer? :oh:

Sinon, pourquoi tu parles de te compliquer la tâche à vouloir réduire l'utilisation mémoire d'une application simple qui n'existe pas encore? Tu pourrais tout d'abord partir d'une base simple et l'améliorer, histoire de pas te tuer à la tâche sur un truc bancal :joce:

J'ai pas non plus tout compris à ce que tu voulais, mais si ta mémoire est allouée dans ton objet, tu peux ne l'allouer dans l'objet qu'à sa première utilisation. Mais c'est pas un boulot difficile à modifier si tu as bien codé au début sur la version "simple" :smile:
05/04/2006 @ 16:39:32: Altar: [C++] Utilisation de la mémoire
Utiliser malloc en c++ est de l'hérésie pure et simple... malloc/free était la seule façon d'alloué et de désalloué de la mémoire en c (pas vraiment mais soit) et est resté en c++ pour des raison de compatibilité ascendente et c'est tout. En c++ tu utilises new et delete et pas autre chose si tu comptes faire du c++ correct (si tu veux faire le cochon libre à toi :D) .

Et pour répondre à ta question : class *pointer= new class[n]; va effectivement créer un array d'objets (et ils seront bien alloués) contigus en mémoire et placer l'addresse du premier objet dans pointer.

Edit : Pour un bon éditeur c++, il y a visual studio 2005 qui est gratuit pour les étudiants. Sinon tu peux toujours essayer dev c++ qui utilise la version portée de g++ sur windows (et ce n'est pas franchement une réussite).
05/04/2006 @ 16:44:03: zion: [C++] Utilisation de la mémoire
Et pour répondre à ta question : class *pointer= new class[n]; va effectivement créer un array d'objets (et ils seront bien alloués) contigus en mémoire et placer l'addresse du premier objet dans pointer.


Rah benh merde, ca fait trop longtemps que j'en ai plus fait... :ddr555:

Je vais être programmeur pascal jusqu'à la fin de mes jours :ciler:

:neowen:
05/04/2006 @ 16:54:45: Altar: [C++] Utilisation de la mémoire
Blieater pour répondre ta question, si tu veux éviter que tes objets soient dupliqués inutilement, utilise des pointeurs et des références. Attention après à ne pas effacer un objet qui serait pointés par un autre pointeur que tu ne remettrais pas à NULL ou à ne pas dupbliquer un objet sans constructeur de copie définit qui aurait des pointeurs vers d'autres structures (les pointeurs seront dupliqués mais pas les objets pointés) si celle-ci doivent aussi être dédoublés.

Sinon bon amusement et bon courage c'est souvent pénible de jouer avec des pointeurs :grin:
05/04/2006 @ 17:00:06: zion: [C++] Utilisation de la mémoire
Ce qui est beaucoup plus simple à utiliser en Pascal, il duplique jamais sauf si on le demande, et c'est pas si simple :joce:
05/04/2006 @ 17:02:52: Altar: [C++] Utilisation de la mémoire
Pas convaincu ça prend 2 minutes à définir un constructeur de copie :oh:
05/04/2006 @ 17:05:01: zion: [C++] Utilisation de la mémoire
En Pascal... non :ddr555:

Si tu fais une assignation simple en pascal, il copie le pointeur vers l'objet. Si tu veux un deuxième objet, tu dois en créer un deuxième explicitement puis avoir prévu toi même une fonction pour assigner ses membres. (Il y a quelques méthodes Assign sur certaines classes, mais c'est rarissime).
05/04/2006 @ 17:12:51: Altar: [C++] Utilisation de la mémoire
ouch... et bien chaque langage à ses avantages et ses défauts. Le plus important c'est d'être à l'aise avec.
07/04/2006 @ 10:13:57: blietaer: [C++] Utilisation de la mémoire
merci pour ces réponses, un bon vieux new et delete pour toute mon array me suffira pour le moment.

Tant que j'y suis, pour ceux qu is'y connaissent mysql par le C++:
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths;
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
}
printf("\n");
}


j'arrive très bien à afficher les données d'une de mes tables, mais disons mtn que je veuille récupérer une valeur ds une variable, par exemple sous forme d'entier, comment faire?

int mavariable_int;
mavariable_int = (int *)row[3];

ben ça marche pas...
07/04/2006 @ 13:01:07: zion: [C++] Utilisation de la mémoire
Quand tu fais un fetch row, tout les fields sont convertis en string, sauf si tu utilises le protocole binaire de MySQL. Donc tu dois convertir explicitement ton string en entier en C++.
07/04/2006 @ 14:40:15: blietaer: [C++] Utilisation de la mémoire
avec un strtoi() bien lourd?
07/04/2006 @ 14:55:27: zion: [C++] Utilisation de la mémoire
Benh oui. Tu castes un string en int comme un bourrin et t'espères que ca fasse quoi? :ddr555:

Ce sont tous des strings, sauf si tu utilises le nouveau protocole binaire de MySQL :oh:
07/04/2006 @ 21:30:08: Altar: [C++] Utilisation de la mémoire
Quel idée d'utiliser MySQL aussi :oh:

Par contre où est-ce qu'on peut trouver une api et de la documentation pour ce nouveau protocol ?
07/04/2006 @ 21:36:42: zion: [C++] Utilisation de la mémoire
Oui, farpaitement:
http://dev.mysql.com/doc/refman/5.0/fr/c-api-prepared-statements.html
http://dev.mysql.com/doc/refman/5.0/fr/news-4-1-x.html
...
10/04/2006 @ 13:26:56: blietaer: [C++] Utilisation de la mémoire
ca pue le troll mais je me lance...

Que prendre d'autre que MySQL pour la DB?
10/04/2006 @ 13:34:53: zion: [C++] Utilisation de la mémoire
Qui a dit que MySQL était mal? :oh:
C'est pas parce que la fonction que tu utilises ne fonctionne pas comme tu le pensais que tu dois changer de DB dis donc :oh:

Sinon y en a pleins... Postgres, Firebird, Oracle :oh: , MSSQL, ... :joce:
10/04/2006 @ 13:49:21: blietaer: [C++] Utilisation de la mémoire
Qui a dit que MySQL était mal?

Donc Altar deux messages au dessus... :whistle:
10/04/2006 @ 13:51:06: zion: [C++] Utilisation de la mémoire
Et tu te laisses intimider par si peu? :oh:

Homme de peu de foie foi :oh:
10/04/2006 @ 14:15:04: gizmo: [C++] Utilisation de la mémoire
MySQL c'est mal :oh:
Retour