Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2994 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  question de memoire

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

question de memoire

n°1159368
zzarbi
Posté le 25-07-2005 à 19:23:12  profilanswer
 

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 ?

mood
Publicité
Posté le 25-07-2005 à 19:23:12  profilanswer
 

n°1159374
Taz
bisounours-codeur
Posté le 25-07-2005 à 19:26:52  profilanswer
 

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

n°1162071
slash33
Posté le 27-07-2005 à 18:41:05  profilanswer
 

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++.

n°1162086
theshockwa​ve
I work at a firm named Koslow
Posté le 27-07-2005 à 18:58:39  profilanswer
 

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 ...

n°1162132
Taz
bisounours-codeur
Posté le 27-07-2005 à 19:24:08  profilanswer
 

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
n°1162218
blastman
just me !
Posté le 27-07-2005 à 21:07:12  profilanswer
 

(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
n°1162551
slash33
Posté le 28-07-2005 à 09:07:52  profilanswer
 

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
n°1162655
theshockwa​ve
I work at a firm named Koslow
Posté le 28-07-2005 à 10:09:16  profilanswer
 

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. :/

n°1162665
Taz
bisounours-codeur
Posté le 28-07-2005 à 10:16:07  profilanswer
 

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

n°1162684
theshockwa​ve
I work at a firm named Koslow
Posté le 28-07-2005 à 10:25:29  profilanswer
 

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
mood
Publicité
Posté le 28-07-2005 à 10:25:29  profilanswer
 

n°1162988
slash33
Posté le 28-07-2005 à 13:44:36  profilanswer
 

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
n°1163118
Rits75
to?be:!be
Posté le 28-07-2005 à 14:44:15  profilanswer
 

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
n°1163166
Taz
bisounours-codeur
Posté le 28-07-2005 à 15:02:40  profilanswer
 

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

n°1163591
theshockwa​ve
I work at a firm named Koslow
Posté le 28-07-2005 à 16:59:48  profilanswer
 

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. }


n°1163642
Taz
bisounours-codeur
Posté le 28-07-2005 à 17:11:16  profilanswer
 

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

n°1163680
slash33
Posté le 28-07-2005 à 17:28:56  profilanswer
 

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
n°1163686
theshockwa​ve
I work at a firm named Koslow
Posté le 28-07-2005 à 17:31:27  profilanswer
 

é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 :/

n°1163687
Kristoph
Posté le 28-07-2005 à 17:31:50  profilanswer
 

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.

n°1163692
Taz
bisounours-codeur
Posté le 28-07-2005 à 17:34:36  profilanswer
 

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

n°1163696
theshockwa​ve
I work at a firm named Koslow
Posté le 28-07-2005 à 17:39:02  profilanswer
 

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
n°1163705
slash33
Posté le 28-07-2005 à 17:46:21  profilanswer
 

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

n°1163872
Joel F
Real men use unique_ptr
Posté le 28-07-2005 à 20:27:51  profilanswer
 

-fstring-no-duplciate pour gcc < 3.4.4

n°1163919
blastman
just me !
Posté le 28-07-2005 à 20:58:39  profilanswer
 

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
n°1163940
adm1n1s7ra​7eur
Posté le 28-07-2005 à 21:22:34  profilanswer
 


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

n°1163946
Kristoph
Posté le 28-07-2005 à 21:29:15  profilanswer
 

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 ?

n°1164164
Taz
bisounours-codeur
Posté le 29-07-2005 à 00:24:49  profilanswer
 

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


Message édité par Taz le 29-07-2005 à 00:24:59
n°1164284
theshockwa​ve
I work at a firm named Koslow
Posté le 29-07-2005 à 09:41:43  profilanswer
 

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:

n°1164286
blackgodde​ss
vive le troll !
Posté le 29-07-2005 à 09:44:31  profilanswer
 

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 )-
n°1164405
Joel F
Real men use unique_ptr
Posté le 29-07-2005 à 10:57:05  profilanswer
 

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" ???

n°1164917
adm1n1s7ra​7eur
Posté le 29-07-2005 à 15:37:14  profilanswer
 

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 !!!  
n°1164928
slash33
Posté le 29-07-2005 à 15:42:37  profilanswer
 


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
n°1165006
Joel F
Real men use unique_ptr
Posté le 29-07-2005 à 16:22:21  profilanswer
 

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 ...

n°1165021
adm1n1s7ra​7eur
Posté le 29-07-2005 à 16:29:39  profilanswer
 

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 !!!  
n°1165030
adm1n1s7ra​7eur
Posté le 29-07-2005 à 16:34:20  profilanswer
 

: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 !!!  
n°1165031
Joel F
Real men use unique_ptr
Posté le 29-07-2005 à 16:34:23  profilanswer
 

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
n°1165034
slash33
Posté le 29-07-2005 à 16:35:52  profilanswer
 

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

n°1165041
theshockwa​ve
I work at a firm named Koslow
Posté le 29-07-2005 à 16:39:08  profilanswer
 

adm1n1s7ra7eur a écrit :

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


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

n°1165053
slash33
Posté le 29-07-2005 à 16:44:59  profilanswer
 

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.

n°1165055
++fab
victime du syndrome IH
Posté le 29-07-2005 à 16:46:46  profilanswer
 

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.

n°1165078
adm1n1s7ra​7eur
Posté le 29-07-2005 à 16:56:31  profilanswer
 

: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 !!!  
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
  FORUM HardWare.fr
  Programmation
  C++

  question de memoire

 

Sujets relatifs
[Access] 2 petites question sur les formulairesQuestion bête sur unset
Question sur la gestion mémoire[ question aux gurus sql ] est ce faisable algorithmiquement en sql ?
vbs et html question (a priori)débordement de la mémoire
[java] Question de gros noob sur l'allocation mémoire.Question sur la memoire
re post: Question carte a memoire...Question carte à mémoire....
Plus de sujets relatifs à : question de memoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR