我想要做的是 NOT 初始化一个与给定边界对齐的指针,相反,它就像某个函数可以转换/复制指针(以及它指向的内容)的phyiscal地址来回对齐的内存地址,如下面代码中的alignedPtr()
:
void func(double * x, int len)
{
//Change x's physical address to an aligned boundary and shift its data accordingly.
alignedPtr(x, len);
//do something...
};
答案 0 :(得分:2)
假设分配的缓冲区的大小足够大,即需要len
+对齐,则实现需要2个步骤。
newPtr = ((orgPtr + (ALIGNMENT - 1)) & ALIGN_MASK);
- 这将生成新指针
由于预期的设计是进行现场计算,因此请从newPtr + len
向后复制以避免覆盖数据。
答案 1 :(得分:2)
在C ++ 11中,您可以使用稍微有点混乱来使用std::align
。
void* new_ptr = original_ptr;
std::size_t space_left = existing_space;
if(!std::align(desired_alignment, size_of_data, new_ptr, space_left)) {
// not enough space; deal with it
}
// now new_ptr is properly aligned
// and space_left is the amount of space left after aligning
// ensure we have enough space left
assert(space_left >= size_of_data);
// now copy from original_ptr to new_ptr
// taking care for the overlapping ranges
std::memove(new_ptr, original_ptr, size_of_data);