struct A{ int num1; int num2; double num3;};struct B{ int num1; double num3; int num2;};
结构体A和B中包含的成员都一样 , 只不过顺序不同而已 , 为什么其大小不一样呢?要解释这个问题 , 就要了解结构体成员对齐的规则 。
- 结构体的大小等于结构体内最大成员大小的整数倍
- 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍 , 比如说 double 型成员相对于结构体的首地址的地址偏移量应该是 8 的倍数 。
- 为了满足规则 1 和 2 编译器会在结构体成员之后进行字节填充!
struct S{ }; sizeof(S); // 结果为1
- 对于一个空 struct 结构体取 sizeof 运算 , 运算结果为 1 并非 0。因为编译器为保证此空 struct 存在 , 专门分配一个字节 。
- 如果存在结构体嵌套 , 无论内层还是外层均需要采用内存对齐 。
- 不含继承和 static 成员变量的类 。
class A { public: int b; float c; char d; };class B{ };int main(void) { cout << “sizeof(A) is ” << sizeof(A) << endl; //输出结果为12 cout << “sizeof(B) is ” << sizeof(B) << endl; //输出结果为1 return 0 ; }
- 空的 class 同样也占用 1 个字节 。
- 计算类对象的大小时 , 类成员函数不占用对象空间 , 只需要考虑类中数据成员的大小 。
- 类中存在静态成员变量
class A { public: static int a; int b; float c; char d; };int main() { A object; cout << “sizeof(object) is ” << sizeof(object) << endl; //输出结果为12 return 0 ; }
因为在程序编译期间 , 就已经为 static 变量在静态存储区域分配了内存空间 , 并且这块内存在程序的整个运行期间都存在 。而每次声明了类 A 的一个对象的时候 , 为该对象在堆上 , 根据对象的大小分配内存 。- 类中包含成员函数
class A { public: static int a; int b; float c; char d; int add(int x,int y) { return x+y; } };int main() { A object; cout << “sizeof(object) is ” << sizeof(object) << endl; b = object.add(3,4); cout << “sizeof(object) is ” << sizeof(object) << endl; //输出结果为12 return 0 ; }
推荐阅读
- Java开源框架之SpringMVC原理及源码解析
- C++构造函数的三种写法
- 外包面试之旅
- 苦尽甘来茶道人生,茶道之真饮茶之人要怀有颗真心
- 行走茶山之寻找革登茶,革登茶山
- PLC编程语言之争:谁才是"一哥"
- 大英博物馆的镇店之宝 大英博物馆三大镇馆之宝
- 宇宙生命之谜提出问题并解决 宇宙生命之谜主要讲述了什么没有生命存在的原因
- 中国历史上夏朝之前是什么朝代 夏朝之前还有什么朝代
- 夏威夷火山喷发视频 夏威夷火山之谜