2010-11-26 30 views
0

Compte tenu tableau suivant et deux séries de missions:Est-ce que la norme C++ dicte si ces deux méthodes d'accès au tableau sont identiques ou différentes?

char charArray[3]; 

charArray[0]='a'; 
charArray[1]='b'; 
charArray[2]='c'; 

char & charRef1=charArray[0]; 
charRef1='a'; 
char & charRef2=charArray[1]; 
charRef2='b'; 
char & charRef3=charArray[2]; 
charRef3='c'; 

Est-ce que la norme C++ déterminent si ces deux séries de travaux doit être mis en œuvre de façon identique ou différente par le compilateur?

+0

Très probablement, sur tout vrai compilateur, ils doivent être les mêmes. – Puppy

+0

J'ai toujours pensé que oui, même si je ne peux pas citer le ref standard maintenant. Pourquoi es-tu dans le doute? – Vlad

+0

Pourquoi avez-vous besoin de savoir? Ou avez-vous un exemple où cela aurait de l'importance? –

Répondre

4

Non, la norme ne fait aucune exigence que les détails de mise en œuvre doivent être les mêmes. 1.9/1:

Les descriptions sémantiques dans la présente Norme internationale définissent une machine abstraite non déterministes paramétrés . Cette norme internationale ne place aucune exigence sur la structure des implémentations conformes . En particulier, ils n'ont pas besoin de copier ou d'émuler la structure de la machine abstraite. Au contraire, les implémentations conformes sont requises pour émuler (uniquement) le comportement observable de la machine abstraite comme expliqué ci-dessous.

Ainsi, seul le "comportement observable" doit être le même. comportement Observable est défini dans 1,9/6:

Le comportement observable de la machine abstraite est sa séquence de lit et écrit les données volatiles et appels à la bibliothèque de fonctions d'E/S.

Les instructions exactes utilisées pour y parvenir ne sont pas « comportement observable », et dans votre exemple puisque le tableau n'est pas volatile, l'ordre de ne pas observable est écrit non plus. En fait, à moins que vous n'utilisiez le tableau plus tard, les écritures elles-mêmes ne sont pas observables. Il serait légal que l'optimiseur de l'implémentation supprime avec succès l'intégralité de l'extrait de code dans un cas mais pas dans l'autre, bien qu'il soit peut-être surprenant qu'il ne puisse en gérer qu'un seul.

0

La norme ne garantit aucune implémentation, juste un "comportement observable". Ainsi, il pourrait finir par choisir aléatoirement entre différentes implémentations pour chacun, y compris ne pas faire les affectations du tout. Chacun d'eux peut être compilé différemment chaque fois qu'il est rencontré.

Les optimisations spécifiques à la plate-forme et au contexte sont utilisées.

(par exemple si le compilateur CADDS un octet de tampon après le char [3] déclaration, il peut initialiser en affectant une seule valeur 32 bits. L'ordre de ces missions peut être modifié, etc.)