如何将指针对齐到 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;
}
这行得通吗?
谢谢
最佳答案
C++0x 提议std::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 类型的对象?)我想我可以推荐一些更好的东西。
关于c++ - 如何对齐指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6320264/