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?
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.
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 *));