[33] Spécificité des compilateurs

(Une partie de C++ FAQ Lite fr, Copyright © 1991-2002, Marshall Cline, cline@parashift.com)

Traduit de l'anglais par Philippe Elie

Les FAQs de la section [33]


[33.1] Où puis-je charger un compilateur C++ gratuit?
[Fixé l'URL (on 10/99). "Chaînage" des modifications récentes .]

Aller voir http://www.progsource.com/c_development.html pour une liste pour chaque plate-forme.

[ Haut | Bas | Rechercher ]


[33.2] Où puis-je trouver de l'information sur l'utilisation des MFC et Visual C++?
[URL récemment mise a jour, merci a Katy Mulvey; changé le nom du mainteneur merci (on 1/00).]

La FAQ MFC/Visual C++ (mfcfaq.stingray.com/) est maintenu par Michael Pickens (autrefois par Scot Wingo). Une autre FAQ est disponible à www.mvps.org/vcfaq.

[ Haut | Bas | Rechercher ]


[33.3] Comment afficher du texte dans la barre de statut en utilisant les MFC?
Utilisez cette portion de code:

CString s = "Text";
CStatusBar* p =
(CStatusBar*)AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
p->SetPaneText(1, s);

Ceci fonctionne avec MFC v.1.00 ce qui signifie (en étant optimiste) que cela devrait fonctionner avec les autres versions.

[ Haut | Bas | Rechercher ]


[33.4] Comment puis je décompiler une exécutable vers du code source C++?
Vous voulez plaisantez?

Voici quelques unes des nombreuses qui font que ceci est de loin infaisable:

Mais la grande question n'est pas commentvous pouvez décompiler le code de quelqu'un, mais pourquoi? Si vous essayez de décompiler le code que quelqu'un d'autre, honte sur vous; aller chercher du travail honnête. Si vous essayez de récupérer vos propres sources perdu, la meilleur suggestion que je puisse vous donnez est de faire de meilleur sauvegarde la prochaine fois.

[ Haut | Bas | Rechercher ]


[33.5] Où puis-je trouver de l'information sur les compilateurs C++ {Borland, IBM, Microsoft, Semantic, Sun, etc.}?
[Récemment ajouté merci a Edison Design Group C++ pour la Matt Page (on 10/99), changé l'URL de Watcom C++ merci Stephen Howe; ajouté Comeau C++ merci a Gary Comeau (on 1/00). ]

Par ordre alphabétique et par ordre de vendeur:

[Si quelqu'un a d'autre suggestions pour cette liste, faites moi le savoir; merci; (en anglais seulement) (cline@parashift.com)].

[ Haut | Bas | Rechercher ]


[33.6] Comment les compilateurs utilisent la technique "over-allocation" pour enregistrer le nombre d'éléments d'un tableau alloué dynamiquement?
Rappelez vous que lorsque vous faites un delete[]sur un tableau, les librairies d'exécution connaît magiquement le nombre de destructeurs a appeler . Cette FAQ décrit une technique utilisé par certain compilateur C++ pour effectuer ceci (L'autre technique commune est d' utiliser un tableau associatif ).

si le compilateur utilise la technique "over-allocation", le code pour p = new Fred[n] ressemble a ce qui suit. Notez que WORDSIZE est une constante dépendante de la machine qui est au moins égal à sizeof(size_t), éventuellement arrondi pour tenir compte de contrainte d'alignement. Sur la plupart des machines cette constante aura la valeur 4 ou 8. Ce n'est pas un identificateur du C++ qui sera définit par le compilateur.

// Code d'origine: Fred* p = new Fred[n];
char* tmp = (char*) operator new[] (WORDSIZE + n * sizeof(Fred));
Fred* p = (Fred*) (tmp + WORDSIZE);
*(size_t*)tmp = n;
size_t i;
try {
for (i = 0; i < n; ++i)
new(p + i) Fred(); // opérateur new avec syntaxe de de placement
} catch (...) {
while (i-- != 0)
(p + i)->~Fred(); // Appel explicite du destructeur
operator delete[] ((char*)p - WORDSIZE);
throw;
}

Et les delete[] p deviennent:

// Code original: delete[] p;
size_t n = * (size_t*) ((char*)p - WORDSIZE);
while (n-- != 0)
(p + n)->~Fred();
operator delete[] ((char*)p - WORDSIZE);

Notez que l'adresse passée a l'opérateur operator delete[] n'est pas la même que p.

Comparé a la technique tableau associatif , cette technique est plus rapide, mais elle est plus sensible au problème du programmeur qui écrit delete p plutôt que delete[] p. Par exemple, si vous faites une erreur et écrivez delete p ou vous devriez écrire delete[] p, l'adresse passée à l'opérateur delete(void*) n'est pas l'adresse d'une allocation valide. Ceci corrompra probablement le tas. Bang! Vous êtes mort!

[ Haut | Bas | Rechercher ]


[33.7] Comment les compilateurs utilise-t-il une "tableau associatif" pour enregistrer le nombre d'éléments d'un tableau alloué dynamiquement?
Rappelez vous que lorsque vous faites un delete[]sur un tableau, les librairies d'exécution connaît magiquement le nombre de destructeurs a appeler . Cette FAQ décrit une technique utilisée par certain compilateur C++ pour effectuer ceci (L'autre technique commune est d' utiliser "l'over-allocation ").

Si le compilateur utilise un tableau associatif, le code pour p = new Fred[n] ressemble a ceci (ou arrayLengthAssociation est le nom imaginaire d'un tableau associatif global qui permet de retrouver le taille (size_t) a partir d'un pointeur (void*)):

// Code original: Fred* p = new Fred[n];
Fred* p = (Fred*) operator new[] (n * sizeof(Fred));
size_t i;
try {
for (i = 0; i < n; ++i)
new(p + i) Fred(); // opérateur new avec syntaxe de placement
} catch (...) {
while (i-- != 0)
(p + i)->~Fred(); // Appel explicite du destructeur
operator delete[] (p);
throw;
}
arrayLengthAssociation.insert(p, n);

Et les delete[] p deviennent:

// Code original: delete[] p;
size_t n = arrayLengthAssociation.lookup(p);
while (n-- != 0)
(p + n)->~Fred();
operator delete[] (p);

Cfront utilise cette technique (Il utilise un arbre AVL pour implémenter le tableau associatif).

Comparé a la technique "over-allocation" , le tableau associatif est moins rapide, mais moins sensible au problème du programmeur écrivant delete p plutôt que delete[] p. Par exemple, si vous faites une erreur et vous écrivez delete p là où vous devriez écrire delete[] p, seulement le premier Fred dans le tableau sera détruit, mais le tas ne sera pas corrompu (a moins que vous n'ayez remplacé l'operator delete[] avec quelque chose qui n'appelle pas simplement operator delete, ou a moins que les appels des destructeurs des autres objets Fred étaient nécessaires).

[ Haut | Bas | Rechercher ]


[33.8] Si la décoration de nom était standardisé, pourrais je lié du code produit par des compilateurs provenant de différents fabriquants?
Réponse courte: Probablement non.

En d'autres mots, certaine personne aimerait que la décoration des noms soit incorporée dans le standard ANSI C++ dans l'espoir d'éviter d'acheter l'acquisition de différentes versions des librairies de classes pour différent vendeurs de compilateurs. Toutefois la décoration des noms est une des plus petite différences potentiels entre les implémentations, même sur la même plate-forme.

Voici une liste partiel des autres différences.

[ Haut | Bas | Rechercher ]


[33.9] GNU C++ (g++) produit de gros exécutable pour de petit programme, pourquoi?
libg++ (le librairie utilisé par g++) a été probablement compilée avec les infos de deboggage (-g). Sur certaine machine, recompiler libg++ sans les informations de deboggage peut sauver beaucoup d'espace disque (à peu prés 1 Mo; d'un autre coté: vous ne pourrez plus tracer les appels à libg++). Seulement supprimer les informations de deboggage de l'exécutable ne réclame pas autant de recompilation que de recompiler sans l'option -gsuivant par la suppression des informations de deboggage (N.D.T provenant de ligbg++).

Utilisé size a.out pour connaître la taille du code et des données du programme, plutôt que ls -s a.out qui inclut la taille des informations de deboggage.

[ Haut | Bas | Rechercher ]


[33.10] Existe-t-il une grammaire C++ au "format" yacc?
Il existe une grammaire (pour yacc) qui était proche du C++. autant que je le sache, elle n'a pas évolué avec les standard C++. Par exemple, cette grammaire ne grée pas les templates, les "exceptions", ni les informations de type à l'exécution, et elle dévie du langage sur d'autres points.

Elle est disponible à srawgw.sra.co.jp/.a/pub/cmd/c++grammar2.0.tar.gz

[ Haut | Bas | Rechercher ]


[33.11] Qu'est ce que C++ 1.2? 2.0? 2.1? 3.0?
Ce ne sont pas des versions du langage C++, mais plutôt des versions de cfront, qui était l'implémentation original du compilateur C++ implementé par AT&T. Il a été généralement accepté d'utiliser ces numéros de versions comme si elles étaient des numéros de versions du langage lui-même.

Très grossièrement, elles incluent:

[ Haut | Bas | Rechercher ]


E-mail Marshall Cline Ecrire à l'auteur, au traducteur, ou en savoir plus sur la traduction.
C++ FAQ Lite fr | Table des matières | Index | A propos de l'auteur | © | Téléchargez votre propre copie ]
Dernière révision Sun Apr 13 23:54:07 PDT 2003