我有两个CPU。一个32位和另一个64位。我们有一段如下的C ++代码:
typedef std::bitset<16> MyBits;
typedef struct t_MyStruct_16 {
uint32_t first;
int16_t second;
__attribute__((__aligned__(8))) MyBits st;
} MyStruct_16;
typedef struct t_MyStruct_12 {
uint32_t first;
int16_t second;
MyBits st;
} MyStruct_12;
使用sizeof来计算32位和64位处理器的结构大小是否安全?那填充的东西呢,如果我进行按位操作,会影响代码的行为吗?
谢谢。
最佳答案
在C ++中,总是添加填充以满足数据成员的对齐要求。因此问题可以改写为:“ alignof(T)
对于32位和64位版本是否相同?”
通常,答案是否定的。使用gcc7(linux)编译示例,在64位版本上,我得到的alignof(MyBits)
等于8;在32位版本上,我得到的sizeof(T)
等于4。
由于POD结构的对齐方式与具有最高对齐方式的成员的对齐方式相同,并且alignof(T)
必须始终是sizeof(MyStruct_12)
的倍数,因此在64位版本上,您会得到alignof
为16的情况。的12。
一种可能的解决方案是在每个单个成员上强制对齐(使用__attrbitue__((aligned))
或#pragma pack(push)
)。
如果使用的是gcc,一个更简单的解决方案是将4
与强制对齐值一起使用。例如:
#pragma pack (push, 4)
typedef std::bitset<16> MyBits;
typedef struct t_MyStruct_16 {
uint32_t first;
int16_t second;
MyBits st;
} MyStruct_16;
typedef struct t_MyStruct_12 {
uint32_t first;
int16_t second;
MyBits st;
} MyStruct_12;
#pragma pack(pop)
这将每个成员的最大对齐方式强制为,这在32位和64位版本上均应起作用。
关于c++ - 强制对32位和64位处理器进行对齐的C++安全性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44700967/