Programmation » [C++] Utilisation de la mémoire
Catégorie:  
   
[C++] Utilisation de la mémoire
Publié le 05/04/2006 @ 14:01:13,
Par blietaer
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:


Dernière édition: 05/04/2006 @ 14:10:11
Et au besoin s'arrêter.
   
[C++] Utilisation de la mémoire
Publié le 05/04/2006 @ 14:31:24,
Par zion
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:
Je suis le Roy :ocube:
   
[C++] Utilisation de la mémoire
Publié le 05/04/2006 @ 16:39:32,
Par Altar
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).

Dernière édition: 05/04/2006 @ 16:41:56
   
[C++] Utilisation de la mémoire
Publié le 05/04/2006 @ 16:44:03,
Par zion
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:
Je suis le Roy :ocube:
   
[C++] Utilisation de la mémoire
Publié le 05/04/2006 @ 16:54:45,
Par Altar
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:
   
[C++] Utilisation de la mémoire
Publié le 05/04/2006 @ 17:00:06,
Par zion
Ce qui est beaucoup plus simple à utiliser en Pascal, il duplique jamais sauf si on le demande, et c'est pas si simple :joce:
Je suis le Roy :ocube:
   
[C++] Utilisation de la mémoire
Publié le 05/04/2006 @ 17:02:52,
Par Altar
Pas convaincu ça prend 2 minutes à définir un constructeur de copie :oh:
   
[C++] Utilisation de la mémoire
Publié le 05/04/2006 @ 17:05:01,
Par zion
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).
Je suis le Roy :ocube:
   
[C++] Utilisation de la mémoire
Publié le 05/04/2006 @ 17:12:51,
Par Altar
ouch... et bien chaque langage à ses avantages et ses défauts. Le plus important c'est d'être à l'aise avec.
   
[C++] Utilisation de la mémoire
Publié le 07/04/2006 @ 10:13:57,
Par blietaer
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...

Dernière édition: 07/04/2006 @ 12:59:12
Et au besoin s'arrêter.
   
[C++] Utilisation de la mémoire
Publié le 07/04/2006 @ 13:01:07,
Par zion
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++.
Je suis le Roy :ocube:
   
[C++] Utilisation de la mémoire
Publié le 07/04/2006 @ 14:40:15,
Par blietaer
avec un strtoi() bien lourd?
Et au besoin s'arrêter.
   
[C++] Utilisation de la mémoire
Publié le 07/04/2006 @ 14:55:27,
Par zion
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:
Je suis le Roy :ocube:
   
[C++] Utilisation de la mémoire
Publié le 07/04/2006 @ 21:30:08,
Par Altar
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 ?
   
[C++] Utilisation de la mémoire
Publié le 07/04/2006 @ 21:36:42,
Par zion
   
[C++] Utilisation de la mémoire
Publié le 10/04/2006 @ 13:26:56,
Par blietaer
ca pue le troll mais je me lance...

Que prendre d'autre que MySQL pour la DB?
Et au besoin s'arrêter.
   
[C++] Utilisation de la mémoire
Publié le 10/04/2006 @ 13:34:53,
Par zion
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:
Je suis le Roy :ocube:
   
[C++] Utilisation de la mémoire
Publié le 10/04/2006 @ 13:49:21,
Par blietaer
Qui a dit que MySQL était mal?

Donc Altar deux messages au dessus... :whistle:
Et au besoin s'arrêter.
   
[C++] Utilisation de la mémoire
Publié le 10/04/2006 @ 13:51:06,
Par zion
Et tu te laisses intimider par si peu? :oh:

Homme de peu de foie foi :oh:

Dernière édition: 10/04/2006 @ 13:51:17
Je suis le Roy :ocube:
   
[C++] Utilisation de la mémoire
Publié le 10/04/2006 @ 14:15:04,
Par gizmo
MySQL c'est mal :oh:
Concept vivant.
Répondre - Catégorie:  
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?