如何将指针与 16 字节边界对齐?
我找到了这段代码,不确定是否正确
char* p= malloc(1024);
if ((((unsigned long) p) % 16) != 0)
{
unsigned char *chpoint = (unsigned char *)p;
chpoint += 16 - (((unsigned long) p) % 16);
p = (char *)chpoint;
}
这行得通吗?
thanks
C++0x提出std::align http://en.cppreference.com/w/cpp/memory/align,它就是这样做的。
// get some memory
T* const p = ...;
std::size_t const size = ...;
void* start = p;
std::size_t space = size;
void* aligned = std::align(16, 1024, p, space);
if(aligned == nullptr) {
// failed to align
} else {
// here, p is aligned to 16 and points to at least 1024 bytes of memory
// also p == aligned
// size - space is the amount of bytes used for alignment
}
这看起来非常低级。我认为
// also available in Boost flavour
using storage = std::aligned_storage_t<1024, 16>;
auto p = new storage;
也有效。如果您不小心,您很容易违反别名规则。如果您心里有一个精确的场景(在 16 字节边界上容纳 N 个 T 类型的对象?)我想我可以推荐一些更好的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)