我正在尝试将类成员对齐到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进行编译时可以获得预期的结果。我无法发布较大的程序,因为它很大并且无法共享。我也还无法提出能够复制特定问题的测试程序,但我会继续尝试。
问题:
char _pad[120]
之类的虚拟字段?