【问题标题】:Struggling with alignas syntax努力使用对齐语法
【发布时间】:2015-02-16 12:31:03
【问题描述】:

我正在尝试使用 alignas 作为类成员的指针,坦率地说,我不确定我应该把它放在哪里。

例如:

class A
{
private:
    int n;
    alignas(64) double* ptr;    

public:
    A(const int num) : n(num), ptr(new double[num])
    {}
};

我希望这能确保 ptr 的数据在 64 字节块上对齐。 使用英特尔编译器,它不会。

谁能指点我正确的方向?

【问题讨论】:

  • 似乎是working for me(注意A 的大小非常大)。还是您希望 ptr 指向 to 的数据会过度对齐?这将需要违反因果关系。
  • 也许您的编译器不支持 64 位对齐?
  • 感谢伊戈尔,这表明了我误解的根源。指针是对齐的,而不是它指向的数据。我希望数据块会对齐。
  • new 的实现怎么可能知道它产生的指针最终会分配给用alignas 声明的变量?这就是我所说的违反因果关系的意思——你希望实现能够预测未来。

标签: c++ c++11 icc alignas


【解决方案1】:

在类的成员上使用alignas(N) 关键字会导致该成员根据指定的对齐方式对齐,而不是任何可能指向的实体。毕竟,当用一个值初始化一个指针时,没有控制来对齐已经存在的对象。

您可能想看看std::align() 需要

  1. 返回指针的对齐规范。
  2. 对齐块的大小。
  3. 指向已分配内存的指针。
  4. 分配的内存量。

它返回一个相应对齐的指针,除非没有足够的空间来满足对齐和大小的要求。如果没有足够的空间,函数返回一个空指针。

【讨论】:

  • ptr = decltype(ptr)(x &~ uintptr_t(64-1)); 替换ptr = x; 将保证ptr 在64 字节边界上对齐。诚然,这不是一个好方法。
  • @Yakk:我认为使用std::align() 更可取。实现如何适当地对齐 ponter 完全取决于实现。由于您的方法可能会干扰指针前面的内存,因此您可能希望首先将指针偏移适当的量。
  • 我认为我的“解决方案”的真正问题是我随意修改了一个指针。指针是对齐的,但它没有指向任何有用的东西。
  • 另请注意alignofstd::align 只保证适用于所谓的基本对齐 值,即对齐值<= alignof(std::max_align_t),通常是@ 987654330@。因此,在 OP 代码中,应该检查各自的实现是否支持 扩展对齐 值。
猜你喜欢
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2021-11-29
相关资源
最近更新 更多