一起学习交流~

c/c++细节知识点 06sizeof与字节对齐

c++面试准备 laomuji 2个月前 (08-06) 126次浏览 已收录 0个评论

目录

作用

/*
sizeof 关键字,获取字节大小
sizeof 并不是函数,sizeof后直接接需要获取字节大小的数据即可(部分编译器必须加括号,所以建议加上)
sizeof 后面可以接变量和接常量,也可以接类、结构体、共用体等
sizeof 获取的大小在编译器时就已经确定

手动设置字节对齐的大小
#pragma pack(push) 把当前字节对齐的大小压入栈
#pragma pack(pop) 在栈中恢复字节对齐的大小
push和pop成对出现,都是#pragma pack的可选参数,用于记录和恢复字节对齐

值得注意的是,位域是根据机器来确定内存布局,所以所以不同情况下计算的大小很可能不同
*/

例子

#include<iostream>
using namespace std;
class Class6_1 {
    char c;
    double d;
    int i;
};
struct Struct6_1 {
    char c;
    double d;
    int i;
};
union Union6_1 {
    char c;
    double d;
    int i;
};

#pragma pack(push) //记录字节对齐
#pragma pack(4) //修改字节对齐的大小
class Class6_2 {
    char c;
    double d;
    int i;
};
struct Struct6_2 {
    char c;
    double d;
    int i;
};
union Union6_2 {
    char c;
    double d;
    int i;

};
#pragma pack(pop)//恢复字节对齐

struct Struct6_3 {
    int d;
    int d1 : 31;
    int d2 : 1;
};//31+1 = 32 没有超过int的32位,所以还是占用的大小相同
struct Struct6_4 {
    int d;
    int d1 : 31;
    int d2 : 2;
};//31+2 = 33 超过了int的32位,所以需要新开辟一个int
int main() {
    cout << (sizeof(Class6_1)) << endl;
    cout << (sizeof(Class6_2)) << endl;
    cout << (sizeof(Struct6_1)) << endl;
    cout << (sizeof(Struct6_2)) << endl;
    cout << (sizeof(Union6_1)) << endl;
    cout << (sizeof(Union6_2)) << endl;

    cout << (sizeof(Struct6_3)) << endl;
    cout << (sizeof(Struct6_4)) << endl;
    return 0;
}
喜欢 (0)
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论