7
votes

Pourquoi aucun accès intrinsèque au registre d'état de la CPU dans la conception de C et C ++?

Dans le cas du drapeau de débordement, il semblerait que l'accès à ce drapeau serait une excellente arine à la programmation inter-architecture. Il fournirait une alternative sûre à compter sur un comportement non défini pour vérifier le débordement entier signé, tel que:

if(a > (INT_MAX - 100)) //detected overflow


10 commentaires

C et C ++ étaient destinés à être portables. Tous les processeurs n'ont pas le même registre d'état de la CPU.


Recherche de cette question, je n'ai pas pu trouver un record d'une CPU ne pas avoir un drapeau de débordement. L'intrinsèque pourrait être décomposé dans l'accès à un drapeau individuel, ce qui lui permet d'être portable.


Les opérations SSE n'ont pas de drapeaux de débordement. Le compilateur est autorisé à mettre en œuvre des choses en utilisant des instructions SSE.


Bien que ne soit pas strictement pertinent pour la réponse à cette question, je dirais que lorsque C était initialement conçu, il n'y avait aucune instruction SSE disponible, de sorte que le problème n'a pas influencé l'omission de cette caractéristique.


Hors du sujet. Peu importe, en termes de portabilité, s'il n'y a pas ou ne sont pas des processeurs sans le drapeau. Il n'est pertinent que si elles peuvent ou ne peuvent pas être construites.


@ Timesquare: Le fait qu'il puisse y avoir des architectures sans drapeau, a probablement influencé les décisions même si l'exemple particulier de SSE ne l'a pas fait. Êtes-vous sûr que toutes les plates-formes connues au moment de la norme C ont-elles été comprises?


Au moment de la conception initiale de C, il y avait d'autres choses. Comme les CPU qui utilisaient son complément, un signe et une valeur absolue et d'autres particularités pour mettre en œuvre des arithmétiques signés. Tous ont une sémantique de débordement complètement différente.


J'ai une fois lu un article sur un comportement indéfini qui a parlé d'une machine qui avait une architecture inhabituelle pour traiter des débordements - j'aimerais pouvoir trouver cette fichue chose maintenant.


@ Timesquare "Quand C a été conçu initialement, il n'y avait aucune instruction SSE disponible" - exactement! Vous ne voulez pas une langue qui est uniquement portable pour le matériel d'aujourd'hui, dans les cas où le matériel évolue au rythme des secondes (exagération intensionnelle). Portable signifie aussi Furture-Prouvez. Donc, vous pourriez dire que cela a effectivement influencé la décision, même si ce n'est pas directement.


J'ai utilisé une langue dans environ 1980 qui avait une variable de $ de transport. Cependant, la question devrait être adressée à Dennis Ritchie. Tout ce que vous arrivez ici sera une hypothèse. Pas constructif.


3 Réponses :


8
votes

Étant donné que C et C ++ sont conçus pour être indépendants de la plate-forme. Le registre de statut n'est pas.

Ces jours-ci, le complément de deux est universellement utilisé pour mettre en place des arithmétiques entier signés, mais ce n'était pas toujours le cas. Son complément ou sa signature et une valeur absolue utilisée était assez courante. Et lorsque C a été conçu pour la première fois, de tels processeurs étaient toujours en commun. Par exemple. Cobol distingue les 0 négatifs et positifs, qui existaient sur ces architectures. De toute évidence, le comportement de débordement sur ces architectures est complètement différent!

D'ailleurs, vous ne pouvez pas sur le comportement non défini pour détecter le débordement, car compilateurs raisonnables lors de la vue xxx

va écrire un avertissement et compiler xxx < / PRE>

... (les optimisations fournies sont activées et l'optimisation particulière n'est pas désactivée).

et note que vous ne pouvez pas compter sur l'avertissement. Le compilateur n'en émettra que l'avertissement lorsque la condition finit par true ou false après des transformations équivalentes, mais il existe de nombreux cas où la maladie sera modifiée en présence de débordement sans fin sans fin en tant que nature true / false .


0 commentaires

4
votes

Je peux penser aux raisons suivantes.

  1. En permettant l'accès aux drapeaux de registre, la transférabilité de la langue à travers les plates-formes est limitée.

  2. L'optimiseur peut changer les expressions de manière drastique et rendre vos drapeaux inutiles.

  3. Cela rendrait la langue plus complexe

  4. La plupart des compilateurs ont un grand ensemble de fonctions intrinsèques, pour faire des opérations les plus courantes (par exemple l'ajout avec le transport) sans recourir à des drapeaux.

  5. La plupart des expressions peuvent être réécrites de manière sûre d'éviter les débordements.

  6. Vous pouvez toujours revenir à l'assemblage en ligne si vous avez des besoins très spécifiques

    L'accès aux registres de statut ne semble pas suffisamment nécessaire pour passer par un effort de normalisation.


0 commentaires

6
votes
  • Parce que C ++ est conçu comme une langue portable, c'est-à-dire celui qui compile sur de nombreux processeurs (par exemple X86, ARM, LSI-11/2, avec des dispositifs tels que les garçons de jeu, les téléphones mobiles, les congélateurs, les avions, les copeaux de manipulation humaine et les épées laser ).
    • Les drapeaux disponibles sur les processeurs peuvent largement diffèrent
    • Même dans le même processeur, les drapeaux peuvent différer (prendre x86 scalar vs. constructeurs vectoriels)
    • Certaines processeurs peuvent même avoir le drapeau que vous désirez du tout
    • La question doit être répondue: Si le compilateur doit toujours livrer / activer ce drapeau lorsqu'il ne peut pas déterminer s'il est utilisé du tout? , ce qui ne correspond pas à Payer uniquement Pour ce que vous utilisez loi non écrit mais sainte de C et C ++
    • Parce que les compilateurs devraient être interdits d'optimiser et par ex. code de réorganisation pour garder ces drapeaux valides

      Exemple de ce dernier: xxx

      L'optimiseur peut transformer cela sur ce code de pseudo-assemblage: xxx

      lequel À son tour, plus similaire à xxx

      maintenant si vous interrogez des registres INBETWEEN xxx

      puis après l'optimisation et la dissache de vous < em> pourrait fin avec ceci: xxx

      qui est alors incorrect.

      Plus d'exemples pourraient être construits, comme ce qui se passe avec une constante -folding-compilé-time-débordement.


      Sidenotes: Je me souviens d'un ancien compilateur Borland C ++ ayant une petite API pour lire les registres actuels de la CPU. Cependant, l'argumentation ci-dessus sur l'optimisation s'applique toujours.

      sur un autre Sidenote: pour vérifier le débordement: xxx

      plus concret Xxx

      ou meilleur, moins de béton: xxx


0 commentaires