Aller voir http://www.progsource.com/c_development.html pour une liste pour chaque plate-forme.
[ Haut | Bas | Rechercher ]
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 ]
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 ]
Voici quelques unes des nombreuses qui font que ceci est de loin infaisable:
[ Haut | Bas | Rechercher ]
Par ordre alphabétique et par ordre de vendeur:
[ Haut | Bas | Rechercher ]
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 ]
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 ]
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 ]
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 ]
Elle est disponible à srawgw.sra.co.jp/.a/pub/cmd/c++grammar2.0.tar.gz
[ Haut | Bas | Rechercher ]
Très grossièrement, elles incluent:
[ Haut | Bas | Rechercher ]
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