【问题标题】:Why does the sizeof a class give different output in C++?为什么一个类的大小在 C++ 中给出不同的输出?
【发布时间】:2022-01-05 12:08:54
【问题描述】:

根据cppreference

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

但是在下面的程序中,编译器给出了不同的输出。

#include <iostream>    
using namespace std;

class A 
{
    private:
        char ch;
        const char &ref = ch;
};

int main()
{
    cout<<sizeof(A)<<endl;
    return 0;
}

输出

16

这里ch 是字符类型,引用也是字符类型。所以输出将是 2 个字节而不是 16 个字节。

在线编译器:GDB

【问题讨论】:

  • “当应用于引用类型时” - 您没有将其应用于引用类型。
  • 类对象的大小不仅仅是每个成员对象的大小加起来。
  • 补充一下@Eljay 所说的,数据通常以块的形式分配,具体取决于您的环境。

标签: c++ reference sizeof


【解决方案1】:

首先,您要求的是对象的大小,而不是引用类型本身的大小。

sizeof(A::ref) 将等于 1

class A 
{
    public:
        char ch;
        const char &ref = ch;
};

int main()
{
    cout<<sizeof(A::ref)<<endl;
    return 0;
}

对象大小为16,因为:

  1. 对象内部的引用类型实际占用的大小等于指针的大小(本例中为8)。
  2. 由于引用类型,object alignment 已增加到 8,因此 char 现在也占用了 8 字节,即使它只真正使用了该空间的 1 字节。

即如果将char ch 更改为char ch[8]sizeof(A) 仍将等于16

class A 
{
    private:
        char ch[8];
        const char &ref = ch[0];
};

int main()
{
    cout<<sizeof(A)<<endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多