以 32 位编译环境的字节大小为例。
- 1B:
char
、bool
- 2B:
short
- 4B:
int
、long
、float
、指针 - 8B:
double
、long long
另外 string
所占字节大小根据库所实现的不同而有所差异,但在同一库中都为固定的。
结构体内存对齐规则
- 类内成员存放的起始相对地址必须是其对齐大小的整数倍。
- 类的占用大小必须是其最大成员变量对齐大小的整数倍;如不是,则需上调。
- C++ 类类型的对齐大小是其最大成员对齐大小,内置类型的对齐大小则是其类型大小。
根据以上规则可以很容易推断以下代码中结构体的内存大小。
struct A{ | |
char a; | |
int b; | |
double c; | |
}; | |
struct B{ | |
char a; | |
A A1; | |
}; | |
int main() { | |
std::cout << sizeof(A) << std::endl; // 16 | |
std::cout << sizeof(B) << std::endl; // 24 | |
return 0; | |
} |
但注意,如果改变结构体内变量的声明顺序,结构体的内存大小将有变化。
struct A{ | |
char a; | |
double c; | |
int b; | |
}; | |
struct B{ | |
char a; | |
A A1; | |
}; | |
int main() { | |
std::cout << sizeof(A) << std::endl; // 24 | |
std::cout << sizeof(B) << std::endl; // 32 | |
return 0; | |
} |