c++不同数据类型所占内存大小:

类型

32位

64位

char

1

1

int

4

大多数4,少数8

short

2

2

long

4

8

float

4

4

double

8

8

指针

4

8

1,结构体sizeof

一般,结构体sizeof是结构体所有成员大小之和

#include <iostream>
using namespace std;
struct exs1
{
char c1; //char的偏移量为1的倍数
short s1; //short的偏移量为2的倍数
int i1;//int为4的倍数
};
int main()
{
cout<<sizeof(exs1);
return 0;
}

但是为这里应该为7,但是却为8:

c++进阶十一(结构体和共用体,枚举的sizeof)_枚举类型


这是因为对于结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。

先介绍一个相关的概念——偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小

然而,在实际中,存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则:

(1)结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)

(2)结构体大小必须是最宽基本类型大小的整数倍

上面那个例子中,c1偏移量为0,为自身大小的整数倍,满足条件1。s1偏移量为1,但是s1大小为2,不满足条件1,需要在s1前补1位。i1的偏移量位1+1+2=4,自身大小为4满足条件1.则此时的结构体大小为1+1+2+4=8;且满足条件2,即结构体的大小为8

2,共用体union的sizeof

在结构中各成员有各自的内存空间,而在“联合”中,各成员共享一段内存空间
所以联合体的sizeof:
(1)为所有成员中最长的
(2)结构体大小必须是最宽成员大小的整数倍

union u1
{
int i1;
char d1[13];
};

这里最长的成员变量大小为d1,如果union长度为13,满足条件1,但是这里最宽的基本类型为int(4),13不是8的倍数,所以需要填充三个,长度为16:

c++进阶十一(结构体和共用体,枚举的sizeof)_偏移量_02

union u2
{
int i1;
double d;
};

这个union大小就为8

3,枚举的sizeof

enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当做int来存储的,所以枚举类型的sizeof值都为4