各种情况下的sizeof总结

前言

很久没有好好总结一下了,最近重新学C++,就从基础开始整理吧
 

一、常用的的sizeof

1 byte = 8 bit

类型sizeof
char1 byte
short2 byte
int4 byte
long4 byte
float4 byte
double8 byte
long long8 byte

 

二、数组的sizeof

数组的sizeof值等于数组所占用的内存字节数

1、char数组的sizeof
char a[] = {'0','1'};  //sizeof(a) = 2
//""括起来的内容末尾补'\0'
char b[] = "01";       //sizeof(b) = 3  因为 b[]="01" 也就是 b[]={'0', '1', '\0'}
2、int数组的sizeof
int a[] = {0, 1, 2, 3};  //sizeof(a) = 4*4 = 16byte
3、string数组的sizeof
//64位机器上
string a[] = {"a", ""};  //sizeof(a) = 64byte
//可以推断string b = "" 且 sizeof(b) = 32byte,经过验证是正确的

 

三、 指针的sizeof

在32位计算机中,sizeof的结果位 4 byte;在64位系统中,sizeof的结果为 8 byte。

char *a;     //sizeof(a) = 8 byte
int *b;	     //sizeof(b) = 8 byte
long *c;     //sizeof(c) = 8 byte
double *d;   //sizeof(d) = 8 byte
void (*e)();  //函数指针:sizeof(e) = 8 byte
//指针数组:sizeof() = 指针内存大小 * 元素个数
char *f[5];  //指针数组:sizeof(f) = 8*5 = 40 byte
float **g;  //多级指针:sizeof(g) = 8 byte

 

四、结构体的sizeof

1、考虑内存对齐
内存对齐原则:
(1)结构体变量的首地址能够被其最宽基本成员类型大小所整除;
(2)结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
(3)结构体的总大小为结构体最宽基本成员类型大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
(4)空结构体(不含数据成员)的sizeof值为 1。

struct A {
    char a;   //0
    int b;
    long c;
    double d;
    char ch[5];
};
//sizeof(A) = 32 byte
/*
根据对齐原则:
1、结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,即是4的倍数
2、起始位置要从该成员的子成员大小的整数倍开始
即a占 1 byte,处于位置0 ,但b从位置4开始,为 5-8 byte
同理:c为9-12 byte ,d 为 13-20byte
故如果不要char ch[5] sizeof(A) = 24 byte (8byte的整数倍)
算上ch,ch为25-29byte,最后sizeof(A) = 32 byte
*/
struct B {
    A a1;
    int *p;
    void(*f)();
};
//sizeof(B) = 32 + 8 + 8  = 48 byte
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值