21年5月24说说结构体
C/C++的结构体, 不是定义, 是设计一个类型.
这个类型是不占空间的, 只有用它定义了变量之后, 才开辟空间(占空间).
关于结构体对齐计算大小 >> 1 根据下一个成员及其类型确定当前的大小
2 根据最大的类型, 确定最终的大小
结构体有联合体的时候
struct student { char a; union ad { int aa; int bb; }; }; struct student { char a; typedef union add { int aa; int bb; }as; };
主函数代码统一如下
int main() { struct student s1; int size = sizeof(s1); printf("%d",size); return 0; }
第一个的, 这个时候s1的大小是1, 因为union只是设计了一个类型, 并没有定义变量 ( 在main里面 student::ad y; 就可以定义一个联合体变量了 )
第二个的( 注意typedef ), 这个时候s1的大小也是1, 不管 add 和 as 有没有, 都是1. 因为这里的 as 并没有定义变量, 只是 typedef 起的别名.
struct student { char a; union { int aa; int bb; }; };
struct student { char a; union add { int aa; int bb; }as; };
第一个的, s1的大小是8, 对齐之后的结果. 因为这个是无名的联合体, 被当作一个成员在看待. struct里面的成员.
第二个的, s1的大小也是8, 注意这里的 add 是联合体的名字, as 是这个联合体定义的一个变量. (类型不开辟空间, 变量开辟空间 )
第二个里面 没有 typedef, 这是区别于之前的关键所在
总结:
这里是在struct 里面以 union 为例子, 但是道理都是相通的. struct 里面再嵌套一个struct (而不是union), 同样满足这些规则.
类型是不占空间, 变量才占.
Linux学习笔记