【问题标题】:About Pointer alignment, is there a way to make a pointer aligned to some given memory boundary?关于指针对齐,有没有办法使指针与某个给定的内存边界对齐?
【发布时间】:2013-01-25 12:45:44
【问题描述】:

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

【问题讨论】:

  • 只有当x 指向比len 大到足以让你移动东西的空间时,这才有效。
  • 如果空间是大于 x 的元素,它应该可以工作(不考虑对齐的空间要求)。
  • 我很确定如果数据在虚拟内存中对齐,它也会在物理内存中对齐(至少最多 32 字节?)。另外,为什么要将它移回原来的位置?
  • 我认为没有一件事可以直接支持这一点,不。如果您愿意,可以将alignofalignasstd::copy 结合使用。
  • 我需要更多才能为 MIC 等某些计算设备提供最佳 SIMD 性能。

标签: c++ c pointers alignment


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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);
    

    【讨论】:

    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2022-01-15
    • 2017-10-02
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多