C++简单类的大小【GeekBand】

本文通过实验探讨了C++中类成员变量的内存对齐规则及其对类大小的影响。实验证明,成员变量会根据其后续不同类型的成员进行对齐,并且整个类的大小会根据最大的成员类型进行对齐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于编译器不同相同代码的类,大小可能不同,此处测试环境为Win 7 x64,Visual Studio 2013 Community.(C++ 11)
使用关键字 sizeof 获取变量和对象大小。
使用(int)& 获取地址。
首先是简单类:
类 A ,我们存放 1个char,1个int,1个double;

class A {
    char   c='A';
    int    n= 0 ;
    double d=0.0;
public:
    void print(){
        std::cout
            <<   "&A :" << (int)&(*this)
            << "\n&c :" << (int)&c 
            << "\n&n :" << (int)&n
            << "\n&d :" << (int)&d
            <<std::endl;
    };
};

测试代码:

int main()
{
    std::cout
        <<   "size of char   :" << sizeof(char)
        << "\nsize of int    :" << sizeof(int)
        << "\nsize of double :" << sizeof(double)
        << std::endl;
    A a;
    a.print();
    std::cin.get();

    return 0;
}

结果如下:
1
从c 到 n 用了4个字节,用3个字节补齐,与 n 的大小相等,说明变量使用大小向后对齐。

将 char c=’A’; 和 double d=0.0; 调换,再进行测试结果如下:
2
总共大小为16,而最后的变量 c 后面还有3个字节,但此时已经没有需要对齐的变量类型,考虑为类型整体大小需为4的整数倍。
进行验证:

class B {
    char a ='a';
};
class B1{
    int a = 0;
};
class B2{
    double a = 0.0;
};

int main()
{
    B  b;
    B1 b1;
    B2 b2;
    std::cout
        <<   "size of b  :" << sizeof(b)
        << "\nsize of b1 :" << sizeof(b1)
        << "\nsize of b2 :" << sizeof(b2)
        << std::endl;
    std::cin.get();
    return 0;
}

结果如下:
3

然而并不是所有类大小需为4的整数倍大小。考虑为类中最大类型大小的整数倍。

class D{
    char c;
    double d;
};

int main()
{
    D d;
    std::cout
        <<   "size of d  :" << sizeof(d)
        << std::endl;

    std::cin.get();
    return 0;
}

结果如下:
5
为char c 获取了8个字节,与double对齐。整体大小为8的倍数

class E{
    char c;
    struct { char c[9]; }p;
    double d;
public:
    void print(){
        std::cout << "&e  :" << int(&(*this))
            << "\n&c  :" << (int)&c
            << "\n&p  :" << (int)&p
            << "\n&d  :" << (int)&d
            << std::endl;
    };
};

int main()
{
    E e;
    std::cout
        << "size of e  :" << sizeof(e)
        << std::endl;
    e.print();
    std::cin.get();
    return 0;
}

结果如下:
7
由于两个相邻变量类型相同,自动无缝拼接,与后一个不同类型大小的整数倍对齐。整体为8的倍数24。
为检验是否整体为8的倍数,在最后添加: char s; 看看会多出多少字节。
结果如下:
8
虽只增加1个字节的变量,却多出8个字节。再将double替换为int。
结果如下:
9
最大类型大小为4,因此补齐至4的整数倍。
所以结论为前一个变量会补齐至后一个不同类型变量的整数倍大小,最后一个变量 补齐整体大小 至 最大变量的整数倍大小。
前提是相同测试环境。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值