为什么sizeof引用类型会给出类型的大小?

Bar*_*rry 14 c++ language-lawyer

根据标准,在[expr.sizeof](5.3.3.2)中我们得到:

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

这似乎与未指定引用[dcl.ref](8.3.2.4)的事实相符:

未指定引用是否需要存储

但是,在语言中出现这种不一致对我来说似乎很奇怪.无论引用是否需要存储,能够确定引用使用的大小不是很重要吗?看到这些结果似乎是错误的:

sizeof(vector<int>) == 24
sizeof(vector<int>*) == 8
sizeof(vector<int>&) == 24
sizeof(reference_wrapper<vector<int>>) == 8
Run Code Online (Sandbox Code Playgroud)

sizeof(T&) == sizeof(T)根据定义背后的理由是什么?

Mik*_*our 14

选择有点武断,试图完全证明任何一种选择都会导致循环的形而上学论证.

引用的意图是(对象本身)的别名; 根据这种推理,它们都具有相同的大小(和地址)是有意义的,这就是语言指定的内容.

抽象是漏洞 - 有时一个引用有自己的存储,与对象分开 - 导致像你指出的那样的异常.但是,当我们需要处理作为对象的单独实体的"引用"时,我们有指针.

  • 我已经看到了对参考vs指针的+1最佳门外汉解释.你甚至不需要提到指针;) (2认同)

Mih*_*yan 13

参数1:引用应该是对象的同义词,因此引用的接口应该与对象的接口完全相同,所有运算符应该在对象和引用上以相同的方式工作(类型运算符除外).

它将在以下代码中有意义:

MyClass a;
MyClass& b = a;
char a_buf[sizeof(a)];
char b_buf[sizeof(b)]; // you want b_buf be the same size as a_buf
memcpy(&a, a_buf, sizeof(a));
memcpy(&b, b_buf, sizeof(b)); // you want this line to work like the above line
Run Code Online (Sandbox Code Playgroud)

参数2:从C++标准的角度来看,引用是引人注目的,它甚至没有说它们是否占用内存,所以它不能说如何获得它们的大小.

如何获得引用大小:由于所有编译器引用都是通过常量指针的帮助实现的,并且它们占用内存,因此有一种方法可以知道它们的大小.

class A_ref
{A& ref;}
sizeof(A_ref);
Run Code Online (Sandbox Code Playgroud)

  • @Rndp13我的意思是A&ref我不是指A_ref和ref.该类用于计算A的引用大小而不是A_ref. (3认同)
  • 但是,sizeof(A_ref)`不会告诉你是否有任何填充.并且`A_ref`不是标准布局,因此您无法查看放置在引用之后的成员的偏移量. (2认同)