为什么引用类型的sizeof会给你该类型的size

Why does sizeof a reference type give you the sizeof the type?

本文关键字:类型 给你 size 引用类型 sizeof 为什么      更新时间:2023-10-16

根据标准,在[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

根据定义,想要sizeof(T&) == sizeof(T)的原因是什么?

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

引用的目的是作为对象本身(的别名);根据这种推理,它们具有相同的大小(和地址)是有道理的,这就是语言所指定的。

抽象是泄漏的——有时引用有自己的存储空间,与对象分离——导致了你所指出的异常。但是,当我们需要将"引用"作为对象的独立实体来处理时,我们有指针。

参数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

参数2:从C++标准的角度来看,引用是隐藏的东西,它甚至没有说明它们是否占用内存,所以它不能说明如何获得它们的大小。

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

class A_ref
{A& ref;}
sizeof(A_ref);

知道引用需要多少存储并不特别重要,只知道添加引用导致的存储需求变化。你可以确定:

struct with
{
    char c;
    T& ref;
};
struct without
{
    char c;
};
return sizeof (with) - sizeof (without);