C++中引用变量的内存?

memory of a reference variable in c++?

本文关键字:内存 变量 引用 C++      更新时间:2023-10-16

我刚刚开始从基础知识学习 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(尽管letterrefletterletter_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*) == 432 位架构。

@FrançoisAndrieux对T&实际大小的评论:

@nefas 您说"这意味着sizeof(T&) == sizeof(T*) == 4在 32 位架构上",但事实并非如此。尝试用更大的T.例如,sizeof(std::array<int, 10>&)比指针大得多。您正在取T的大小,而不是T&.

在计算类/结构的大小时,您必须考虑的另一件事是结构/类的填充:结构的大小可能高于其成员大小的总和(我不会解释填充是如何工作的,因为我没有足够的知识)。