消防器材网站建设背景,青岛谁做网站多少钱,WordPress文章页版权信息,北京网站制作济南1. 结构体对齐
要点
变量只能存储在他的长度的整数倍地址上结构体整体对齐跟他的最长的字段整数倍对齐
栗子1
struct Example1 {char a; //1个字节int c; //4个字节short b; //2个字节
};std::cout sizeof(Example1 ) std::endl; // 12
std::cout //1个字节int c; //4个字节short b; //2个字节
};std::cout sizeof(Example1 ) std::endl; // 12
std::cout alignof(Example1) std::endl; // 4int只能存储的内存序号0,4,8,12... short只能存储的内存序号0,2,4,6...
内存序号存储大小0char-a1null2null3null4int-c5int-c6int-c7int-c8short-b9short-b
现在a、c、b三个变量总共占了10个字节但是遵循第二点结构体整体对齐跟他的最长的字段的整数倍对齐所以结构体总体应该是int4的倍数也就是4,8,12... 因此最后这个结构体的大小是12个字节。对代码进行调试监视内存窗口可以看到
2. pack
要点
变量只能存储在他的min长度pack的整数倍地址上结构体整体对齐跟他的min最长的字段pack整数倍对齐
栗子2
#pragma pack(2)
struct Example2 {char a; //1个字节int c; //4个字节short b; //2个字节
};std::cout sizeof(Example2) std::endl; // 8
std::cout alignof(Example2) std::endl; // 2int原来只能存储的内存序号0,4,8,12...-因为min(4, 2) 2, 现在变成0,2,4,6... short还是只能存储的内存序号0,2,4,6...
内存序号存储大小0char-a1null2int-c3int-c4int-c5int-c6short-b7short-b
现在a、c、b三个变量总共占了8个字节但是遵循第二点结构体整体对齐跟他的min最长的字段pack整数倍对齐所以结构体总体应该是pack 2的倍数也就是2,4,6,8,... 因此最后这个结构体的大小是8个字节。
对阿秀网站栗子上的解释
C八股基础语法02
要点
变量只能存储在他的长度的整数倍地址上结构体整体对齐跟他的最长的字段整数倍对齐
// alignas 生效的情况struct Info {uint8_t a; //1个字节uint16_t b; //2个字节uint8_t c; //1个字节
};std::cout sizeof(Info) std::endl; // 6个字节
std::cout alignof(Info) std::endl; // 2uint8_t只能存储的内存序号0,1,2,3... uint16_t只能存储的内存序号0,2,4,6...
内存序号存储大小0uint8_t -a1null2uint16_t-b3uint16_t-b4uint8_t-cnull代表内存填充为空 现在a、b、c三个变量总共占了5个字节但是遵循第二点结构体整体对齐跟他的最长的字段整数倍对齐所以结构体总体应该是uint16_t大小的倍数也就是2,4,6,8,... 因此最后这个结构体的大小是6个字节。
3. alignas与alignof
c11以后引入两个关键字 alignas 与 alignof 。其中alignof可以计算出类型的对齐方式alignas可以指定结构体的对齐方式。
要点
变量只能存储在他的长度的整数倍地址上【这一点和普通版没有任何区别】结构体整体对齐跟他的max最长的字段alignas指定长度整数倍对齐 因为alignas只能指定比默认值也就是结构体最长字段更大的值。所以对齐大小要么是默认值要么是比默认值大的值 struct alignas(4) Info2 {uint8_t a; //1uint16_t b; //2uint8_t c; //1
};std::cout sizeof(Info2) std::endl; // 8 4 4
std::cout alignof(Info2) std::endl; // 4uint8_t只能存储的内存序号0,1,2,3... uint16_t只能存储的内存序号0,2,4,6...
内存序号存储大小0uint8_t -a1null2uint16_t-b3uint16_t-b4uint8_t-c
现在a、b、c三个变量总共占了5个字节但是遵循第二点结构体整体对齐跟他的max最长的字段alignas指定长度整数倍对齐所以结构体总体应该是alignas 4大小的倍数也就是4,8,... 因此最后这个结构体的大小是8个字节。
后面几个调试的例子运行结果如图