C++对齐结构

C++ alignment structures

本文关键字:结构 对齐 C++      更新时间:2023-10-16

它在 #defines 和其他宏上的开放季节,我正在寻找一种可移植的方式来对齐结构 32 位和 64 位代码。以前,代码具有 AMD64 #define,如果不是这种情况,则会添加填充。

这是一种便携式的方法来做同样的事情,减去 #if!定义(...)... #endif

constexpr size_t defaultAlignmentBits = 4u;
constexpr size_t defaultAlignmentBytes = 16u;
template<size_t padLen>
struct PadIfNonZero {
    uint8_t pad[padLen];
};
template<>
    struct PadIfNonZero<0> {
};
template<typename T>
using PadToAlignment = PadIfNonZero<(sizeof(T) % defaultAlignmentBytes == 0 ? 0  : defaultAlignmentBytes - sizeof(T) % defaultAlignmentBytes)>;

如何改善这一点?

如果您希望类和结构在内存中具有一定的对齐方式,则应查看alignas运算符。它的工作原理是这样的:

Class Foo
alignas(64)
{
     Foo();
     ~Foo();
};

在这里,Foo类与64字节对齐。但请注意,alignas 仅在 c++11 或更高版本中可用。希望这有帮助!