c++ - 如何对齐指针

标签 c++

如何将指针对齐到 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/

相关文章:

c++ - 使用 TinyXML 解析 XML 文件 C++

c++ - 错误 : prototype does not match any in class

c++ - 如何连接矩阵?

c++ - 在派生类中实现虚函数时访问基类私有(private)成员

c++ - 将多个解析值传递给 addPositionalArgument 函数

c++ - libpq 中的查询流水线在哪里?

c++ - Go和C++中指针和引用之间的逻辑区别?

c++ - 通过C++/Qt生成word文档(.doc/.odt)

c++ - 如何将整数句柄转换为 HWND

c++ - vtable:底层算法