Je suppose que le "Manque de modèle de mémoire" dans ces cas, signifie simplement que les optimiseurs ont été écrits avant le C++11 modèle de mémoire a été publié, et pourrait effectuer maintenant invalide optimisations. Il est très difficile et prend du temps pour valider les optimisations contre le modèle de mémoire, c'est donc sans grande surprise que le clang/gcc équipes n'ai pas fini encore.
Le manque de modèle de mémoire de soutien juridique C++11 programmes qui utilisent std::atomic arent seq-elle cohérente?
Oui, c'est une possibilité. C'est encore pire: le compilateur peut introduire des données courses dans (selon le standard C++11) course-gratuit programmes, par exemple en introduisant spéculative écrit.
Par exemple, plusieurs compilateurs C++ utilisé pour effectuer cette optimisation:
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++count;
}
Pourrait obtenir optimisé en:
register int r1 = count;
for (p = q; p = p -> next; ++p) {
if (p -> data > 0) ++r1;
}
count = r1;
Si tous p->data
sont non-négatives, le code source d'origine n'a pas d'écrire count
, mais l'optimisation de code ne. Cela peut introduire des données course dans une course-programme libre, de sorte que le C++11 spécification n'autorise pas de telles optimisations. Compilateurs existants ont maintenant à vérifier et ajuster si nécessaire) toutes les optimisations.
Voir la Simultanéité de la mémoire de modèle compilateur conséquences pour les détails.