我有两个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/

10-17 02:10