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

时间:2014-10-29 13:06:31

标签: 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

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

3 个答案:

答案 0 :(得分:14)

这种选择有些武断,试图完全证明这两种选择都会导致循环的形而上学论证。

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

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

答案 1 :(得分: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

参数2:从C ++标准的角度来看,引用是引人注目的,它甚至没有说它们是否占用了内存,所以它无法说明如何获得它们的大小。 / p>

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

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

答案 2 :(得分:3)

了解引用需要多少存储空间并不是特别重要,只需要通过添加引用来改变存储要求。而你可以确定:

struct with
{
    char c;
    T& ref;
};

struct without
{
    char c;
};

return sizeof (with) - sizeof (without);