与class 类似,本质区别是访问权限;
struct 默认是public; class是private;
继承是看子类的权限;
struct A{};class B : A{}; //private继承, 子类是class 所以是私有继承
struct C : B{}; //public继承, 子类是struct,所以是公有继承
对齐问题
原因
硬件上,有的计算机并不允许从任意位置读取数据,只允许从偶数地址存储,如果一个整形存在了奇数地址,在32位系统上,需要读取两次才能读完。而如果放在偶数地址上,只需要读取一次数据。
sizeof简单计算
偏移量:成员数据的实际存储地址相对于结构体的起始地址;
遵循两条原则:
- 每一个成员的偏移量应该是其字节大小的整数倍,不够再之前用空字节填充;
- 整个结构体的大小是成员中字节最大的整数倍,结构体最后用空字节填充;
例如:
struct stu1
{
int i;
char c;
int j; // 地址应该为4的整数倍,之前填充3个字节
char c;
}; // 总大小为最大字节(4)的整数倍,在之后填充3字节,所以总共为 20字节。
嵌套结构体和内部数组都应该按照展开来计算。
如果嵌套结构体
- 展开后的结构体的第一个成员的偏移量应当是被展开的结构体中字节最大的成员的整数倍。
- 结构体大小必须是所有成员大小的整数倍,这里所有成员计算的是展开后的成员,而不是将嵌套的结构体当做一个整体。
struct stu5
{
char i;
struct
{
char c; // 偏移按照ss最大(4)计算, 应为:4
int j;
} ss;
char a;
char b;
char d;
char e;
char f;
} // 为20
数组
直接展开
struct ss
{
float f;
char p;
int adf[3]; // 展开,每个为4字节
}; // 总大小为20
宏定义求偏移地址
#define OFFSET(Type, member) (size_t)&( ((Type*)0)->member) )