【发布时间】:2018-10-28 10:09:25
【问题描述】:
考虑以下struct 定义:
#define SIZE ... // it's a positive multiple of sizeof(Foo*)
struct Foo {
Foo* ptr;
char padding[SIZE - sizeof(Foo*)];
};
鉴于SIZE 是指针大小(sizeof(Foo*))的正倍数,标准是否保证sizeof(Foo) == SIZE?
如果不能保证,作为实际问题,是否有任何常用平台提供反例(等式不成立)?
是的,我知道alignas...
【问题讨论】:
-
我不知道任何 ABI 的
Foo *和Foo会有不同的对齐方式 -
我会发布这个作为答案,但语言律师会因为我说出来而杀了我。 在实践中,您发布的内容有效,许多编译器也会记录它们的填充行为。但是,如果您真的想确定,编译器上有编译指示可以保证这一点。特别是 gcc/g++ 上的 attribute ((packed)) 和 Visual C++ 上的 pack 属性。
-
@selbie 谢谢!关于
packed的事情是我知道如何“打包”的编译器是我已经知道在这里做理智的事情的编译器(即,它们无论如何都不需要打包)。重要的是那些奇怪的东西,因为我知道它们,所以我不知道如何打包...... -
添加编译时断言:
bool cta[(sizeof(Foo) == SIZE) ? 1 : -1];如果您的填充假设被破坏,那么它将强制编译器不构建代码。 -
是的,我已经用
static_assert完成了。在这里,我更想满足我的好奇心。