web-dev-qa-db-fra.com

Une référence a-t-elle un emplacement de stockage?

Une référence a-t-elle un emplacement de stockage ou s'agit-il simplement d'un alias pour un autre emplacement? Est-ce que cela diffère par la révision C++ ou est-ce compatible avec toutes les versions de C++? Et si une référence a un emplacement de stockage, autorise-t-elle simplement la sémantique des valeurs sur un type de pointeur?

Comment fonctionnerait une référence lorsque vous l'utilisez comme telle:

struct aStruct{
   int aVariable;
   aClass& aReferencetoaClass;
};

Prend-il de la place ou est-ce un alias?

23
Tarick Welling

La dernière spécification C++ 2 (§ 9.2.3.3) et au moins depuis la projet de spécification C++ 2005 indique:

Il n'est pas précisé si une référence nécessite ou non un stockage

La mise en œuvre réelle se fait au cas par cas. Évidemment, si une classe a une seule variable membre qui est une référence qui devra être stockée quelque part. Mais le compilateur a une latitude pour utiliser une référence uniquement comme alias, comme vous le dites.

16
Paul Evans

La plupart des compilateurs, pour tout standard C++ jusqu'à C++ 17 au moins, implémenteront efficacement une référence en tant que pointeur, sauf s'ils sont optimisés.

En particulier, à l'intérieur d'un struct, il prendra la taille d'un pointeur (plus alignement/remplissage, etc.).

Par conséquent, cela se tiendra dans la plupart des environnements:

struct S {
    char & a;
};

static_assert(sizeof(S) == sizeof(void *));
10
Acorn