为什么引用类型的sizeof会给你该类型的size
Why does sizeof a reference type give you the sizeof the type?
根据标准,在[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);
相关文章:
- 试试完美的正方形,你能给点小费吗
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 将所有模板类型传递给运算符,而不指定所有类型
- 将超出范围的整数分配给有符号字符类型
- C++将一个指针分配给另一个指针时执行的类型检查
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- C++如果采用类类型的函数被传递派生类型,有没有办法给出错误?
- 你能在 c++ 中将不同的数字类型加在一起吗?
- 如果用户不小心给出了不正确的数据类型,cin 如何工作?
- 如何将不同的变量传递给相同类型的 QML
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- C++ - 将结构类型的数组传递给用户定义的函数
- 默认模板类型给出错误,但显式类型不会
- sizeof(* struct 指针)是否给你结构的值
- 为什么引用类型的sizeof会给你该类型的size
- 为什么用“std::chrono”进行时差测量时,与“double”类型相比,用“float”类型给出的有效数字更多
- c++模板赋值操作符重载——赋基本类型给对象
- "auto"类型推导编译,而显式类型给出错误