昨晚我在这个类上工作,作为内存对齐对象的类型安全包装器。我有字节数组和数学来访问字节数组的内存以读取和写入T
. 不过,我很好奇,如何才能最有效地访问对齐的T
.
我尝试使用一个公共T &
调用Value
,我将其初始化为T
构造函数初始化列表中的对齐。像这样:
template <typename T, size_t alignment = 64>
struct Aligned {
private:
std::uint8_t bytes[sizeof(T) + alignment - 1];
public:
T & Value;
Aligned(T const & value = T()) : Value(*reinterpret_cast<T *>((intptr_t)bytes + (alignment - 1) & ~intptr_t(alignment - 1))) {
Value = value;
}
};
这增加了类的大小,sizeof(T *)
因为T & Value
需要存储对齐的地址T
。
我的另一种方法是不存储地址,而是在每次需要访问时通过访问器方法计算它......
#include <array>
#include <cstdint>
template <typename T, size_t alignment = 64>
struct Aligned {
private:
std::array<uint8_t, sizeof(T) + alignment - 1> const bytes;
public:
T const & value() const {
return *reinterpret_cast<T *>((intptr_t)bytes.data() + (alignment - 1) & ~intptr_t(alignment - 1));
}
void value(T const & x) {
*reinterpret_cast<T *>((intptr_t)bytes.data() + (alignment - 1) & ~intptr_t(alignment - 1)) = x;
}
Aligned(T const & x = T()) {
value(x);
}
};
这种方法将需要指针算术和指针解引用(我认为?)每次访问但不会增加类的大小。
有没有其他方法或技巧来获得这两个优势?