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

时间:2017-05-17 14:29:41

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

  

==&gt;这里,num的大小是4个字节(32位编译器)和refnum,因为引用只是num的别名。那么,为什么在这种情况下,对象的大小是8

==&gt;此外,如果真的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这是怎么回事?

我有兴趣从基础知识中学习,所以如果我错了,请纠正我

3 个答案:

答案 0 :(得分:8)

引用是别名,不应将其视为新变量。您无法获取其地址,也无法获得其大小。任何尝试这样做都将获得别名对象的地址或大小。实际上,大多数实现都像指针一样实现它们,但标准并不要求这样。它没有提到参考的预期大小。

来自:http://en.cppreference.com/w/cpp/language/reference

  

引用不是对象;它们不一定占用存储空间,尽管如果有必要实现所需的语义,编译器可以分配存储空间(例如,引用类型的非静态数据成员通常会增加类的大小以存储存储器地址所需的数量)

编辑:c ++标准为实现提供了很大的余地,以便自己决定类型和类的大小,以满足每个体系结构的独特要求。在这种情况下,在类的成员之间引入填充。在c ++中没有要求类的大小必须等于它的成员的总和&#39;尺寸。有关该主题的更多信息,请参阅cppreference.com上的Objects and alignment

编辑2:关于sizeof(T&)似乎仍然存在一些混淆。

来自http://en.cppreference.com/w/cpp/language/sizeof

  

当应用于引用类型时,结果是引用类型的大小。

表达式sizeof(T&)被视为您已编写sizeof(T)。这并不意味着T&的大小等于T的大小。只是您无法直接使用sizeof来获取引用的大小。

答案 1 :(得分:2)

除了已经提供的答案之外,我建议您阅读有关填充的材料:

Data structure padding

关于C ++中类和结构的填充,这是一个很好的基础讨论,需要考虑简单的例子。

答案 2 :(得分:1)

引用存储它引用的变量的地址(比如具有更强的前/后条件的指针)。 这意味着{32}架构上的sizeof(T&) == sizeof(T*) == 4

来自@FrançoisAndrieux的关于T&的真实大小的评论:

  

@nefas你声明“这意味着在32位架构上sizeof(T&) == sizeof(T*) == 4。”但是这是错误的。尝试使用更大的T。例如,sizeof(std::array<int, 10>&)远大于指针。您的尺寸为T,而不是T&

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