为什么 class 具有多个 public 访问说明符 standard_layout?
Why is a class with multiple public access specifiers standard_layout?
我只是在玩 g++,我发现
#include <type_traits>
class Foo {
public: int x;
public: char y;
public: double z;
};
static_assert(std::is_standard_layout<Foo>::value, "Foo is not standard layout");
int main() {}
编译得很好。
根据 this 回答,data members across access specifiers may be reordered in memory
。因此,无法保证 x
在内存中实际布局时实际上必须是 Foo
的第一个成员。我定义 Foo
、y
的方式实际上可能是第一个元素吧?
我认为标准布局意味着您可以或多或少地理解给定类型的字节是如何布局的。允许以任意方式重新排序标准布局类型中的字段对我来说似乎违反直觉。为什么允许这样做?
结构的所有成员都具有相同的访问说明符:public
。关键字出现在每个 class 成员之前这一事实并不重要。这相当于 public
访问说明符在所有 class 成员之前出现一次。
我只是在玩 g++,我发现
#include <type_traits>
class Foo {
public: int x;
public: char y;
public: double z;
};
static_assert(std::is_standard_layout<Foo>::value, "Foo is not standard layout");
int main() {}
编译得很好。
根据 this 回答,data members across access specifiers may be reordered in memory
。因此,无法保证 x
在内存中实际布局时实际上必须是 Foo
的第一个成员。我定义 Foo
、y
的方式实际上可能是第一个元素吧?
我认为标准布局意味着您可以或多或少地理解给定类型的字节是如何布局的。允许以任意方式重新排序标准布局类型中的字段对我来说似乎违反直觉。为什么允许这样做?
结构的所有成员都具有相同的访问说明符:public
。关键字出现在每个 class 成员之前这一事实并不重要。这相当于 public
访问说明符在所有 class 成员之前出现一次。