为什么引用大小总是4个字节 - c ++

Ale*_*Dan 12 c++ reference

在32位机器上sizeof,即使它是对double的引用,我总是得到4个字节的引用,所以它真正存储在这4个字节中.

编辑:

class A{
public:
  double&  a;
};

int main(){
  cout << sizeof(A) << endl; // this will print out 4
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 38

标准非常明确sizeof(C++ 11,5.3.3/4):

应用于引用或引用类型时,结果是引用类型的大小.

因此,如果您真的在考虑sizeof(double&),编译器会告诉您这sizeof(double)是4.

更新:那么,你真正在做的是应用于sizeof类类型.在这种情况下,

应用于类时,结果是该类对象中的字节数[...]

所以我们知道内部引用的存在A导致它占用4个字节.这是因为即使标准没有强制要求如何实现引用,编译器仍然必须以某种方式实现它们.根据上下文的不同,这可能会有所不同,但对于类类型的参考成员来说,唯一有意义的方法是潜入double*幕后并将其称为double&面对面.

因此,如果您的体系结构是32位(其中指针长度为4个字节),则可以解释结果.

请记住,引用的概念与任何特定实现无关.该标准允许编译器实现它想要的引用.


jal*_*alf 22

你不能,也不是.

C++引用不是指针.它是对象的别名.有时,编译器选择使用指针来实现它.但通常情况下,它通过什么都不做来实现它.通过简单地生成直接引用原始对象的代码.

在任何情况下,sizeof应用于引用类型都不会给出引用的大小.因此,你所做的事情并不是很清楚,因此无法解释正在发生的事情.

编辑

既然您已经显示了一些代码,我们可以回答这个问题:

您正在获取包含引用的类的大小.如上所述,引用不是指针,但在必要时,编译器可能会回退到使用指针来表示它.当您创建包含引用的类时,编译器可以实现它的唯一(理智)方式是定义一个包含对象地址的类.在32位系统上,地址为32位或4字节宽.所以sizeof这样的课程(通常)是4.

  • 我当然可以.如果你这样做:`int i = 0; int&r = i`,然后编译器通常*不*生成用于在堆栈上放置指向`i`的代码.相反,对`r`的后续操作(比如说,`r ++`)只会发出*exact*相同的代码,就好像你写了`i ++`一个引用只是一个别名. (17认同)
  • 不,不是.¯\\ _(ツ)_ /¯ (5认同)
  • @StefanDragnev在机械上,编译器通常会使用指针来实现引用,但这并不意味着它们是同一回事。如果引用实际上不需要是不同的实体,例如jalf的`int i = 0;例如,据我所知,标准中没有什么阻止编译器将“ r”视为“ i”的语法糖,而只是在您使用“ r”时默默地替换“ i”。 (2认同)