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 に答える