面试题答案
一键面试-
#pragma pack(1)
时:sizeof(data)
的值为13。- 原因:
#pragma pack(1)
指定按1字节对齐。char a
占1字节,double b
占8字节,int c
占4字节。由于按1字节对齐,各成员紧密排列,总大小为1 + 8 + 4 = 13字节。
#pragma pack(4)
时:sizeof(data)
的值为16。- 原因:
#pragma pack(4)
指定按4字节对齐。char a
占1字节,为满足4字节对齐,在a
后填充3字节,double b
占8字节(8是4的倍数,无需填充),int c
占4字节。总大小为(1 + 3) + 8 + 4 = 16字节。
#pragma pack(8)
时:sizeof(data)
的值为24。- 原因:
#pragma pack(8)
指定按8字节对齐。char a
占1字节,为满足8字节对齐,在a
后填充7字节,double b
占8字节(8是8的倍数,无需填充),int c
占4字节,为满足8字节对齐,在c
后填充4字节。总大小为(1 + 7) + 8 + (4 + 4) = 24字节。
- 手动修改结构体对齐方式有必要的场景举例:
- 网络通信:在网络传输数据时,不同系统的默认结构体对齐方式可能不同。为了确保数据在不同系统间准确传输,需要手动设置结构体对齐方式,使其在发送端和接收端保持一致。例如,在客户端和服务器端通信时,统一结构体对齐方式可以避免数据解析错误。
- 与硬件交互:当与特定硬件设备进行数据交互时,硬件可能对数据的存储格式有特定要求。例如,某些硬件设备可能要求数据按特定字节数对齐才能正确读写。通过手动修改结构体对齐方式,可以使程序与硬件设备更好地兼容。