在C ++ 11中对齐类成员

时间:2018-10-10 14:45:14

标签: c++ c++11 memory-alignment

我正在尝试将类成员对齐到C ++ 11中的特定对齐方式(例如128),以避免线程之间的错误共享。我的方法是使用alignas,但结果不尽相同。在这个简单的程序中,我得到了想要的结果:

#include <cstdio>
#include <atomic>

struct Foo {

    char foo[128];

    void* x1;
    uint32_t x2;
    uint32_t x3; // here an "entry" is only the

    alignas(128) std::atomic<unsigned int> a;
    alignas(16) std::atomic<unsigned int> b;

};


int main(int argc, char const *argv[])
{

    Foo x, y;

    printf("alignof(Foo x) = %zu\n", alignof(x));
    printf("alignof(Foo x.a) = %zu\tmod 128 = %d\n", alignof(x.a), reinterpret_cast<uintptr_t>(&(x.a)) % 128);
    printf("alignof(Foo x.b) = %zu\tmod 16 = %d\n", alignof(x.b), reinterpret_cast<uintptr_t>(&(x.b)) % 16);

    /* code */
    return 0;
}

但是,在具有非常相似的类结构的较大程序中,还使用alignas到128字节。当我打印出字段alignof时,得到的期望值和在alignas属性中指定的值。但是,当我修改相关字段的地址时,我得到的值与alignas参数(128)不同-我得到32。我期望alignas放在内存中位于内存地址开头的变量,该变量平均除以128;这种期望有效吗?

请注意,在下面的程序中,使用clang 6.0.1进行编译时可以获得预期的结果。我无法发布较大的程序,因为它很大并且无法共享。我也还无法提出能够复制特定问题的测试程序,但我会继续尝试。

问题:

  • 我推荐的将类中特定成员对齐的方法是C ++ 11的推荐方法吗?
  • 如果没有,正确的方法是什么?是否以这种方式添加了char _pad[120]之类的虚拟字段?
  • 我也应该调整整个班级本身吗?现在,我没有明确这样做。

0 个答案:

没有答案