0

我想要做的不是初始化与给定边界对齐的指针,而是像一些函数可以将指针(及其指向的内容)的物理地址转换/复制回对齐的内存地址来回,就像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...
};
4

2 回答 2

2

假设分配的缓冲区的大小足够大,即len需要 + 对齐,则实现将需要 2 个步骤。

  1. newPtr = ((orgPtr + (ALIGNMENT - 1)) & ALIGN_MASK);- 这将生成新的指针

  2. 由于预期的设计是进行就地计算,因此从newPtr + len向后复制以避免覆盖数据。

于 2013-02-10T04:58:50.013 回答
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);
于 2013-02-10T04:59:09.483 回答