2017-01-30 2 views
0

Je suis curieux de connaître le comportement du spécificateur de stockage register en C/C++. Programme suivant valide dans C++, mais dans le cas de C ce n'est pas valide.Enregistrer le spécificateur de stockage en C++

int main() 
{ 
     register int i; 
     int* b = &i; // Valid in C++ but not in C 
} 

Alors, ma question I, Pourquoi l'opérateur d'adresse permis C++ (&) à une variable de registre?

P.S: Je sais Le registre est déprécié dans le compilateur moderne.

+0

Il est * suggéré * au compilateur de placer la variable dans le registre, car le programmeur s'attend à un accès plus rapide à cette variable. Mais cela ne le * force * pas. –

+0

Quelle que soit la raison pour laquelle vous avez ajouté la balise C à une question C++? Ce sont des langues différentes! – Olaf

+0

Ceci est une réponse vraiment ennuyeuse, mais "parce que la norme C++ le dit". Il dit que le mot-clé 'register' est un" indice de l'implémentation que la variable ainsi déclarée sera fortement utilisée ", et" dans la plupart des implémentations seront ignorés si l'adresse de la variable est prise ". –

Répondre

3

Votre réponse se trouve ici:

http://en.cppreference.com/w/cpp/language/storage_duration

En C, l'adresse d'une variable de registre ne peut être prise, mais en C++, un registre déclaré variable est sémantiquement indiscernable d'un variable déclarée sans spécificateur de classe de stockage.

2

C et C++ ont divergé avant que le langage C soit standardisé. Les deux ont adopté le mot-clé register, mais seul C a ajouté la restriction à l'opérateur &.

Creuser dans l'histoire, le C++ 98 norme dit,

Un spécificateur register a la même sémantique en tant que prescripteur auto avec une allusion à la mise en œuvre que l'objet ainsi déclarée sera fortement utilisé . [Note: l'indice peut être ignoré et dans la plupart des implémentations, il sera ignoré si l'adresse de l'objet est prise. - note d'extrémité]

Par la suite il a été déconseillé, qui est une direction opposée à la renforcer avec des restrictions sémantiques. Il est prévu de le supprimer dans la prochaine norme C++ 17.

(auto plus tard a été reconverti en C++ 11. Son sens ancien était le même que le stockage par défaut d'une variable locale.)

+0

Remarque: C++ 98 n'est pas C++ standard. Ce serait C++ 14. Mieux vaut citer la norme valable, même si elle dit la même chose. – Olaf

+1

@Olaf Les anciennes normes sont toujours standard et valides, juste anciennes. Je suis allé pour l'ancien parce que c'est une question d'histoire. – Potatoswatter

+0

@Potatoswatter En fait, la nouvelle norme remplace toutes les autres normes. Puisque la question est étiquetée avec juste C++ (pas de version), elle devrait citer le standard au moment de l'écriture. – NathanOliver

2

Alors, ma question I, Pourquoi l'opérateur d'adresse autorisée C++ (&) à une variable de registre?

La réponse est:
Parce que C et C++ sont des langues différentes et suivent des normes différentes comme l'a dans les autres réponses.

2

La différence est expliquée par cette citation du C++ standard (7.1.1 Classe de stockage ers spéci fi)

3 Un registre spécifique er est une allusion à la mise en œuvre que la variable ainsi déclarée sera largement utilisé.[Note: L'indice peut être ignoré et dans la plupart des implémentations il sera ignoré si l'adresse de la variable est prise. Cette utilisation est déconseillée (voir D.2). -end note]