基本数据类型长度
目前系统以64位居多,下面列出64位系统下的基本数据类型长度。
嵌入式开发或者其他对数据长度敏感的场景,建议使用int8_t
/ int16_t
/ int32_t
等明确长度的类型。
数据类型 | 长度/字节 |
---|---|
char | 1 |
short | 2 |
int | 4 |
long | 8 |
long long | 8 |
float | 4 |
double | 8 (32位系统为4) |
void* | 8 |
bool | 1 |
结构体/类 字节对齐
为了CPU高效访问数据,操作系统会对结构体/类等非基础数据类型进行字节对齐。
详细理论介绍可以去百度,网上一抓一大把。
简单来说就是一个短的基本类型和一个长的基本类型放在一个结构体里,短的类型后面后面会填充,以达到和长类型长度对齐。下面用例子来说明。
空 结构体/类
struct A {};
sizeof(A) =1 ,空结构体占用1字节空间,可以认为结构体最少需要1字节的存储空间。
单一类型 结构
struct A {
char a;
};
sizeof(A) = 1
短类型+长类型 结构
1 + 2 = 4
struct A {
char a; // 1bit + 1bit填充
short b; // 2bit
};
1 + 2 + 4 = 8
struct A {
char a; // 1bit + 1bit填充
short b; // 2bit
int c; // 4bit
};
1 + 4 = 8
struct A {
char a;
int c;
};
2 + 4 + 8 = 16
struct A {
short b;
int c;
long d;
};
长类型+短类型 结构
8 + 4 + 1 = 16
struct A {
long d;
int c;
char a;
};
短类型 和 长类型交错
4+8+1 = 24
struct A {
int c;
long d;
char a;
};
从这个图可以看出长短类型交错填充比较多,所以写代码时尽量让短类型放在一起,减少内存对齐导致的空白填充。
类 占用的空间
类占用的空间和上述结构体占用的空间类似。在C++中可以认为 struct 和 class 是一种东西,不同点在于 struct 成员默认为 public 属性,class 成员默认为 private 属性。
-
空类长度为1字节
-
仅 成员变量 和 虚函数 占用空间
虚函数因为有指向虚函数表的指针,所以占用一个指针的空间,8字节(64位系统)。
虚函数无论有多少个都只有一个虚函数表指针,所以始终占用8字节。 -
成员函数 、静态变量和函数 不占空间
-
类占用空间遵循字节对齐原则
无成员变量和虚函数
class A {
public:
A() {}
~A() {}
};
sizeof(A) = 1
有成员变量
class A {
public:
A() {}
~A() {}
long a; // 8bit
};
sizeof(A) = 8
仅虚函数
class A {
public:
A() {}
virtual ~A() {}
};
sizeof(A)=8
虚函数和成员变量
class A {
public:
A() {}
virtual ~A() {} // 8 bit
long a;
};
sizeof(A)=16
多个虚函数 只占用8字节
class A {
public:
A() {}
virtual ~A() {} // 8bit
virtual void a(){};
virtual void b(){};
};
sizeof(A)=8