gpt4 book ai didi

c++ - "class members are put in ascending order"规则的原因?

转载 作者:行者123 更新时间:2023-12-01 14:47:55 24 4
gpt4 key购买 nike

C++98 有这样的规则:

If two pointers point to nonstatic data members of the same object, or to subobjects or array elements of such members, recursively, the pointer to the later declared member compares greater provided the two members are not separated by an access-specifier label (11.1) and provided their class is not a union.



这指定成员应该按升序排列,前提是没有中间的访问说明符。

后来,这条规则在 C++11 中变得更加严格:

If two pointers point to non-static data members of the same object, or to subobjects or array elements of such members, recursively, the pointer to the later declared member compares greater provided the two members have the same access control (Clause 11) and provided their class is not a union.



在这里,具有相同访问说明符的所有成员应按升序排列。

我有两个问题:
  • 为什么规则在 C++11 中变得更加严格?
  • 为什么我们首先要有这个规则?对于标准布局类,这条规则是有意义的。但它对非标准布局类有用吗?一个明显的缺点是编译器不允许自由地重新排序所有成员,因此类可以占用更少的空间(如果数据成员通过减少对齐方式排序,则可以减少填充)。
  • 最佳答案

    我不认为第二个更严格。第一个是。

    “不被访问说明符标签分隔”显然意味着“具有相同的访问控制”。

    但是您可能在同一个类中有两个成员都由访问说明符分隔,即:

    public:
    int m1;
    public:
    int m2;

    第一个子句未经验证,但第二个是。因此,第一个限制性更强。

    因此,第一个规范更具语法性,而第二个规范更具语义性。

    第二个还让编译器按访问类别重新排列成员,从而让它有一些按访问类别的“全局”布局策略,即一个 block 用于私有(private),另一个用于 protected ,第三个用于公共(public)。

    关于c++ - "class members are put in ascending order"规则的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61591608/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com