question de memoire

question de memoire - C++ - Programmation

Marsh Posté le 25-07-2005 à 19:23:12    

une petite question
 
pour l'utilisation des deux expressions suivantes :

Code :
  1. #define nombre 25
  2. // ou
  3. const int nombre 25; // en variable globale


 
le resultat lors de l'execution du programme est le même mais en est-t-il de même pour la memoire ?

Reply

Marsh Posté le 25-07-2005 à 19:23:12   

Reply

Marsh Posté le 25-07-2005 à 19:26:52    

const sans hésiter :
- typage
- aussi rapide que la macro
- tu peux prendre l'addresse
- const implique une portée statique, donc au final, tu les avantages, mais ça ne coute rien de plus

Reply

Marsh Posté le 27-07-2005 à 18:41:05    

Une macro (le #define) n'est qu'une chaîne de caractères qui sera remplacée à chaque occurence dans ton code. Donc en terme d'occupation mémoire nada! Par contre, impossible de debogguer (aucune existence physique) et non typé. Quand on fait du C++, il FAUT abandonner le #define du C (sauf flags de compilation ou pour des usages particuliers). Je te recommande "Effective C++" de Scott Meyers pour connaître les bons trucs pour programmer en C++.

Reply

Marsh Posté le 27-07-2005 à 18:58:39    

slash33 a écrit :

Une macro (le #define) n'est qu'une chaîne de caractères qui sera remplacée à chaque occurence dans ton code. Donc en terme d'occupation mémoire nada! Par contre, impossible de debogguer (aucune existence physique) et non typé. Quand on fait du C++, il FAUT abandonner le #define du C (sauf flags de compilation ou pour des usages particuliers). Je te recommande "Effective C++" de Scott Meyers pour connaître les bons trucs pour programmer en C++.


 
 
tu pourras peut-être expliquer comment on arrive à trouver la donnée a l'exécution, dans ce cas ...

Reply

Marsh Posté le 27-07-2005 à 19:24:08    

on parle de mode debug hein
 
autrement, une constante const n'a aucune existance physique non-plus ...


Message édité par Taz le 27-07-2005 à 19:24:36
Reply

Marsh Posté le 27-07-2005 à 21:07:12    

(C++) always const for me  
(C) always #define
 
L'utilisation de const est moins interessante en C-ANSI qu'en C++.

Code :
  1. const int size = 100;
  2. char tab[2*size];  //legal en C++, mais illegal en C-ANSI


 
Une declaration comme, par exemple const int N=5
est equivalante a :
 
en C++ :     static const int N=5
en C-ANSI :  extern const int N=5
 
Ce qui empeche en C-ANSI de placer la definition d'une constante dans un fichier d'en-tete.
(Probleme a l'edition de liens si ce fichier est importe (#include) par plusieurs modules)


Message édité par blastman le 27-07-2005 à 21:08:53

---------------
http://www.blastmanu.info
Reply

Marsh Posté le 28-07-2005 à 09:07:52    

theshockwave a écrit :

tu pourras peut-être expliquer comment on arrive à trouver la donnée a l'exécution, dans ce cas ...


Pas clair ton histoire "trouver la données à l'exécution"...  :heink:
 
Une variable occupe un espace mémoire du programme, un #define non: il fait partie intégrante du programme. J'ai jamais pu voir la valeur affectée à mon #define avec le debugger (VC++ 6.0). Si tu y arrives fais moi signe.  :jap:


Message édité par slash33 le 28-07-2005 à 09:14:04
Reply

Marsh Posté le 28-07-2005 à 10:09:16    

Si je ne m'abuse, ca se retrouve dans le segment de données du programme (.text, non ?) et lorsqu'on fait un #define sur une chaine, par exemple, pour chaque objet (.o) compilé ayant le #define, on aura une occurrence de ladite chaine dans le code produit, alors qu'avec un extern const, la chaine ne s'y trouvera évidemment qu'une fois. Je suis d'accord sur le fait que ca n'encombre pas les zones de mémoire qu'on utilise pour les variables, mais les données en question se retrouvent bien chargées en mémoire à terme et y occuppent toujours de la place. :/

Reply

Marsh Posté le 28-07-2005 à 10:16:07    

tu penses bien que les chaines sont unifiées et que t'en as pas 36 copies hein

Reply

Marsh Posté le 28-07-2005 à 10:25:29    

j'ai vérifié avant de faire ca, tu mets ton #define dans un .h et deux fichiers C qui l'incluent, et avec gcc (enfin, mingw pour mes tests) on se retrouve avec la chaine en double dans l'exe ...
 
Edit : j'imagine qu'il ne peut pas faire le lien entre les différentes versions de la chaine dans les différents .c simplement parce qu'il n'a pas de symbole associé


Message édité par theshockwave le 28-07-2005 à 10:26:20
Reply

Marsh Posté le 28-07-2005 à 10:25:29   

Reply

Marsh Posté le 28-07-2005 à 13:44:36    

Exact theShOckKwAvE (t'a pas un nom plus simple?). Au final le #define prend certainement plus de place... sur le disque, en mémoire je ne suis vraiment pas sûr.
C'est pour cette raison que le premier qui arrive à débugger la valeur du #define il me fait signe!
De toute façon les constantes par #define c'est bon pour le C, en C++ faut utiliser les variables const.


Message édité par slash33 le 28-07-2005 à 13:51:11
Reply

Marsh Posté le 28-07-2005 à 14:44:15    

le #define remplace  l'expression dans le code avant la compilation (preprocesseur)!
ce qui doit impliquer plussieurs declaration d'une meme  
variable je pense (à voir a la compil)
 
avantage du const qui lui a une portée locale(internal linkage) donc une seul reference a l'interieur d'un meme bloc/classe de plus il est typé ce qui implique des verifs de la part du compilo(+ clean)!
en gros ce qu'a dit Taz.
 
 
En C++ c'est du const pour declarer des constantes!
et le #define pour plein d'autre chose flag de compil, debut/fin de sous-routines de methodes  
pour eviter des redondances de codes etc...

Code :
  1. #define safe_delete if(x) {delete x; x = NULL;}


Message édité par Rits75 le 28-07-2005 à 14:50:38
Reply

Marsh Posté le 28-07-2005 à 15:02:40    

theshockwave a écrit :

j'ai vérifié avant de faire ca, tu mets ton #define dans un .h et deux fichiers C qui l'incluent, et avec gcc (enfin, mingw pour mes tests) on se retrouve avec la chaine en double dans l'exe ...


on doit pas avoir le meme gcc

Reply

Marsh Posté le 28-07-2005 à 16:59:48    

j'ai précisé que c'était mingw, et j'ai fait ca sur un exemple assez simple :
 

Code :
  1. // common.h
  2. #include <stdio.h>
  3. #define CHAINE "1234567890"
  4. void foo();


Code :
  1. // foo2.c
  2. #include "common.h"
  3. void foo() {
  4.   printf(CHAINE);
  5.   printf(CHAINE);
  6.   printf(CHAINE);
  7. }


Code :
  1. // foo.c
  2. #include "common.h"
  3. int main() {
  4.   printf(CHAINE);
  5.   printf(CHAINE);
  6.   printf(CHAINE);
  7.   foo();
  8.   return 0;
  9. }


Reply

Marsh Posté le 28-07-2005 à 17:11:16    

et qu'est-ce qui te dit que la chaine est 2x présente dans le binaire ?

Reply

Marsh Posté le 28-07-2005 à 17:28:56    

Taz a écrit :

et qu'est-ce qui te dit que la chaine est 2x présente dans le binaire ?


Tu l'édites en hexadécimal non?
 
En tout cas avec Visual c'est clairement ce qu'il se passe.


Message édité par slash33 le 28-07-2005 à 17:29:55
Reply

Marsh Posté le 28-07-2005 à 17:31:27    

éditeur hexa [:petrus75]
et la chaine incriminée apparait en un exemplaire pour chaque fichier compilé incluant common.h. De même, si je rajoute n fichiers du style

Code :
  1. #include "common.h"
  2. void bar() {
  3.   printf(CHAINE);
  4. }


j'obtiens n occurrences supplémentaires de la chaine dans le fichier exécutable :/

Reply

Marsh Posté le 28-07-2005 à 17:31:50    

Taz a écrit :

et qu'est-ce qui te dit que la chaine est 2x présente dans le binaire ?


Il y a une option de compilation dans gcc qui sert à controler si oui ou non il faut dupliquer les strings dans l'exe obtenu dans ce cas. Ce n'est pas fait par défaut parceque certaines personnes s'ammusent à modifier ces chaines et que si on les réunies cela fait des bugs difficiles à comprendre.

Reply

Marsh Posté le 28-07-2005 à 17:34:36    

Kristoph a écrit :

Il y a une option de compilation dans gcc qui sert à controler si oui ou non il faut dupliquer les strings dans l'exe obtenu dans ce cas. Ce n'est pas fait par défaut parceque certaines personnes s'ammusent à modifier ces chaines et que si on les réunies cela fait des bugs difficiles à comprendre.


bah avec les vieilles versions de gcc oui. maintenant on est en 2005

Reply

Marsh Posté le 28-07-2005 à 17:39:02    

toujours est-il que, même pour du C, je préfère éviter les #define et mettre des extern aux endroits appropriés. Sinon, ma version de minGW est assez récente (date d'un mois ou deux) donc j'imagine que cette fonctionnalité du compilo (rassembler les lignes identiques) n'est toujours pas activée par défaut
 
Edit : bon, ok, je viens de vérifier, j'ai la 3.4.2 ... en clair, j'ai récupéré ma version une ou deux semaines avant qu'ils ne passent à la 3.4.4, peut-être que ca a changé depuis


Message édité par theshockwave le 28-07-2005 à 17:40:34
Reply

Marsh Posté le 28-07-2005 à 17:46:21    

Remarquez que les macros ont des applications contre le piratage plutôt intéressantes.

Reply

Marsh Posté le 28-07-2005 à 20:27:51    

-fstring-no-duplciate pour gcc < 3.4.4

Reply

Marsh Posté le 28-07-2005 à 20:58:39    

d'facon l'informatique ca sux surtout la programmation et surtout le C++


Message édité par blastman le 28-07-2005 à 20:59:37

---------------
http://www.blastmanu.info
Reply

Marsh Posté le 28-07-2005 à 21:22:34    


meme en C++ , #define joue un role important :  
 
elle remplace les fonctions inline ce qui est interressant  
 
pour un bon programmeur       !!

Reply

Marsh Posté le 28-07-2005 à 21:29:15    

Taz a écrit :

bah avec les vieilles versions de gcc oui. maintenant on est en 2005


Options -fmerge-constants et -fmerge-all-constants de gcc 4.0. C'est assez recent pour toi ou il faut que j'aille chercher ma machine à voyager dans le temps pour prendre une version future ?

Reply

Marsh Posté le 29-07-2005 à 00:24:49    

ben ça le fait par défaut chez moi en O2


Message édité par Taz le 29-07-2005 à 00:24:59
Reply

Marsh Posté le 29-07-2005 à 09:41:43    

adm1n1s7ra7eur a écrit :

meme en C++ , #define joue un role important :  
 
elle remplace les fonctions inline ce qui est interressant  
 
pour un bon programmeur       !!


:heink:

Reply

Marsh Posté le 29-07-2005 à 09:44:31    

adm1n1s7ra7eur a écrit :

meme en C++ , #define joue un role important :  
 
elle remplace les fonctions inline ce qui est interressant  
 
pour un bon programmeur       !!


 
je dirais plutot l'inverse : l'inline du c++ remplace les #define de fonction du C.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 29-07-2005 à 10:57:05    

adm1n1s7ra7eur a écrit :

meme en C++ , #define joue un role important :  
elle remplace les fonctions inline ce qui est interressant  
pour un bon programmeur       !!


 
Comment perdre toute crédibilité en 1 leçon.
 
C'est quoi deja le Smiley "Fortune" ???

Reply

Marsh Posté le 29-07-2005 à 15:37:14    

Citation :


Comment perdre toute crédibilité en 1 leçon.  
 
C'est quoi deja le Smiley "Fortune" ???


Citation :


je dirais plutot l'inverse : l'inline du c++ remplace les #define  
 
de fonction du C.


 
vous ferez mieux si vous essayez de visiter le faq de [url]
 
http://c.developpez.com/faq/cpp[/url] .
 
 
 


---------------
n'editez pas !!!  
Reply

Marsh Posté le 29-07-2005 à 15:42:37    


Bon puisque tu veux jouer à ça LIT CORRECTEMENT LA PAGE QUI SUIT:
 
http://c.developpez.com/faq/cpp/?p [...] LINE_macro


Message édité par slash33 le 29-07-2005 à 16:32:27
Reply

Marsh Posté le 29-07-2005 à 16:22:21    

adm1n1s7ra7eur : je crosi que sur ce poitn tu n'as rien à m'apprendre ... et bon developpez.com 'na jamasi été un site de reference vraiment correct ...

Reply

Marsh Posté le 29-07-2005 à 16:29:39    

Citation :


developpez.com 'na jamasi été un site de reference vraiment correct ...


 
 :non: , tu es sur de que tu viens de dire  :ouch:  
 
 


---------------
n'editez pas !!!  
Reply

Marsh Posté le 29-07-2005 à 16:34:20    

:o  

Citation :


Les fonctions inline peuvent rendre le code plus gros
c'est la notion de code 'indigeste', décrite ci-dessus. Par exemple, si un programme a 100 fonctions inline qui augmenteront à chaque fois la taille de l'exécutable de 100 bytes et qui sont appelées 100 fois chacune, l'augmentation de taille de l'exécutable sera proche de 1 MB. Est-ce que ce Mo posera problème ? Qui sait, mais ce Mo risque d'être celui qui fera faire de la pagination au système et donc le ralentir.


 
LIT ET RELIT ce paragraphe  :o  
 
 :sol:


---------------
n'editez pas !!!  
Reply

Marsh Posté le 29-07-2005 à 16:34:23    

oui ...
 
Et ce n'est pas parce que les fonctions inline générent du code blaot qu'il faut ls abnnir. Hein [:pingouino]
Apprendre à inliner ca aide beaucoup. Alors s'il te plait remballe tes :sol: et va faire joujou ailleurs


Message édité par Joel F le 29-07-2005 à 16:36:40
Reply

Marsh Posté le 29-07-2005 à 16:35:52    

FANTASTIQUE! Monsieur veut m'apprendre comment le précompilateur traite les MACROS C.
 
Bon je laisse tomber ça en vaut pas la peine.

Reply

Marsh Posté le 29-07-2005 à 16:39:08    

adm1n1s7ra7eur a écrit :

:o  
 
LIT ET RELIT ce paragraphe  :o  
 
 :sol:


 
 
:heink:
 
une macro poserait le même problème, hein ...

Reply

Marsh Posté le 29-07-2005 à 16:44:59    

Oui une macro pose exactement le même problème, le code est duppliqué à chaque occurence. Enfin apparement ça peut se régler sur certains compilos.

Reply

Marsh Posté le 29-07-2005 à 16:46:46    

En plus, le compilateur n'est pas tenu d'honorer l'inlining s'il trouve ça pénalisant (surtout pour les architectures "pauvres" en registres).
C'est un sacré avantage par rapport aux macros.

Reply

Marsh Posté le 29-07-2005 à 16:56:31    

:o  
 
un avis personnel : les fonctions inline n'ont pas d'important role  
 
à jouer  :)  .
 
je prefere utiliser les macros :love:  .
 
si je suis obligé à utiliser des fonctions ,j'essaie d'éloigner le  
 
compilo et d'y faire du code assembleur  :sol:  comme ça le temps  
 
d'execution sera court .


---------------
n'editez pas !!!  
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed