C++中引用变量的内存?
memory of a reference variable in c++?
我刚刚开始从基础知识学习 Cpp,当我遇到引用变量时感到困惑。
据我所知,引用变量就像别名(同一内存的另一个名称),因此在这种情况下,它需要任何内存。
当我运行以下代码时:
class sample_class
{
public:
int num; //line1
int& refnum = num; //line2
}
int main()
{
sample_class sample_object;
cout<< "sample_class object size : " << sizeof(sample_object) <<endl;
return 0;
}
我得到的输出为:
sample_class对象尺寸 : 8
==>在这里,num
的大小为 4 字节(32 位编译器)和refnum
,因为引用只是num
的别名。那么,为什么在这种情况下,对象的大小是8
?
==>另外,如果真的refnum
像别名,那么这些信息(refnum
也持有/别名到num
的相同内存地址的信息)何时存储?
编辑:
并考虑这种情况(sample_class
的定义):
class sample_class
{
public:
char letter; //line3
char& refletter = letter; //line4
char letter_two; //line5
}
在这里,如果我打印sample_class
对象的对象大小,我会得到它12
(尽管letter
、refletter
和letter_two
的大小都等于1
)。但是如果我line 4
评论,对象大小只是2
。这是怎么回事???
我有兴趣从基础知识中学习,所以如果我在任何地方都错了,请纠正我
引用是别名,不应将其视为新变量。您无法获取其地址,也无法获取其大小。任何这样做的尝试都将获取别名对象的地址或大小。在实践中,大多数实现都像指针一样实现它们,但标准并不要求这样做。它没有提到预期的尺寸以供参考。
寄件人 : http://en.cppreference.com/w/cpp/language/reference
引用不是对象;它们不一定占用存储,尽管编译器可以分配存储,如果需要实现所需的语义(例如,引用类型的非静态数据成员通常会增加类的大小存储内存地址所需的量)。
编辑:c ++标准为实现提供了很大的回旋余地,可以自行决定类型和类的大小,以适应每个体系结构的独特要求。在这种情况下,在类的成员之间引入填充。在 c++ 中没有要求类的大小必须等于其成员大小的总和。有关该主题的详细信息,请参阅 cppreference.com 上的对象和对齐方式。
编辑2:关于sizeof(T&)
似乎仍然存在一些混乱。
从 http://en.cppreference.com/w/cpp/language/sizeof :
应用于引用类型时,结果是引用类型的大小。
表达式sizeof(T&)
被视为您编写了sizeof(T)
。这并不意味着T&
的大小等于T
的大小。只是您无法直接使用sizeof
获取引用的大小。
除了已经提供的答案外,我建议阅读有关填充的材料:
数据结构填充
这是一个很好的基本讨论,C++中类和结构的填充,并有简单的示例需要考虑。
引用存储它引用的变量的地址(如具有更强的前置/后置条件的指针)。这意味着sizeof(T&) == sizeof(T*) == 4
32 位架构。
@FrançoisAndrieux对T&
实际大小的评论:
@nefas 您说"这意味着
sizeof(T&) == sizeof(T*) == 4
在 32 位架构上",但事实并非如此。尝试用更大的T
.例如,sizeof(std::array<int, 10>&)
比指针大得多。您正在取T
的大小,而不是T&
.
在计算类/结构的大小时,您必须考虑的另一件事是结构/类的填充:结构的大小可能高于其成员大小的总和(我不会解释填充是如何工作的,因为我没有足够的知识)。
- 当vector是tje全局变量时,c++中vector的内存管理
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么内存屏障依赖于变量?
- 在内存不足之前,我可以声明多少个 const 变量?
- C++具有模板成员变量的类. 和参数内存输出
- 为什么同一个变量的内存地址不同?
- 分配具有 2D 向量大小的变量的内存
- C++强制变量到一个固定的内存位置
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- C++在变量的内存地址上做什么来"deallocate"它?
- 如果不分配内存,我如何能够为变量创建和分配值?
- 为什么我无法获取 MSVS2019 / C++ 中字符或uint8_t变量的内存地址?
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 函数,返回变量c++占用的内存位置的大小
- 为什么一个接一个声明的两个变量在内存中不相邻?
- 指向动态内存中结构中的变量时出现问题
- C++函数在endl(内存变量?
- 控制内存变量
- 使用内存变量初始化填充位结构体