【问题标题】:Behind the scenes of public, private and protected公共、私人和受保护的幕后
【发布时间】:2021-03-19 19:52:57
【问题描述】:

我尝试更深入地了解和了解 Public |私人 |在 C++ 中从低级别的角度进行保护。

这三者的区别在记忆中是如何表达的?

【问题讨论】:

  • 把这些放在内存里没有区别。这些是访问修饰符和非常特定于语言(编译器)的。
  • 你会发现这很有趣:youtube.com/watch?v=SShSV_iV1Ko
  • @Snajeev 但是访问说明符确实会影响类型成员在内存中的布局方式。我不认为这是 OP 所要求的,但确实存在访问说明符的低级方面

标签: c++ oop object private-members low-level


【解决方案1】:

一点也不。

编译器“允许/拒绝”访问。

在构建之前阻止任何与适当可见性不匹配的访问(由访问对象的类控制,无论是否通过指针)。

注意:

其他答案有用地讨论了可见性对内存顺序的影响。

我回答了我读到 OP 帖子“内存保护功能如何用于实现成员可访问性/可见性?”的不同问题,这与因果关系是一种相反的问题。或者只有在不同配置的内存中成员的排序/结构是实现所需可见性效果的工具,这反过来又需要(但不会导致)成员以某种方式排序。

即我没有看到答案之间的冲突,只是对问题的不同解释。

【讨论】:

  • afaik 访问说明符确实(或曾经?)影响类型成员在内存中的布局方式。有一点盐 OPs 问题可以解释为要求那个
  • 写一个有启发性的答案,我会很高兴地支持它,并可能删除我的答案。你的评论是为了让我明白这一点...... @largest_prime_is_463035818 如果类的属性成员(这是我对内存布局的主要想法)是任何类似于结构的东西,我怀疑它们最终会以不同的行为记忆.关于方法,我认为涉及的表也不太可能有特殊的内存交叉布局。
  • 我必须自己做一些研究。在那之前,你的答案也是我能想到的最好的答案;)
  • 真是一种解脱。我理解你的评论质疑我的回答。不过,如果你写的更详细,一定要投赞成票。也许我的获得了一些“有用的简化思维模型”的价值。让我们来看看。 @largest_prime_is_463035818
  • 不,我并不是说你的答案是错误的。我在答案中概述的问题对我来说只不过是一种好奇心。出于所有实际目的,您的答案有点简化但足够好;)
【解决方案2】:

在最低级别(对象的字节表示),公共、私有和受保护之间绝对没有区别。大多数编译器可以(但不是必须)根据成员的可见性对其重新排序。

在中间级别(运行时行为)几乎没有差异。如果你能找到一个指向私有数据的公共指针,你就可以安全地使用它。具体来说,这与使用非 const 指针更改 const 数据的 constness 是明确的未定义行为,并且可能导致 SIGSEGV 错误。

差异仅在最高级别。您可以在任何地方使用公共成员,而私有成员只能在声明它们的类中使用,受保护成员可以从其类和继承它的所有类中使用 - 但友好性可以允许特定的函数类访问私有或受保护数据。

【讨论】:

    【解决方案3】:

    privatepublicprotected 不会导致成员存储在特定的内存区域中。访问由编译器检查。在最底层,没有区别。

    但是,访问说明符确实会影响您对类成员在内存中的布局顺序的保证。

    来自C++17 standard draft

    分配具有相同访问控制(子句 [class.access])的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。未指定具有不同访问控制的非静态数据成员的分配顺序(子句 [class.access])。实现对齐要求可能会导致两个相邻的成员不会被立即分配;管理虚拟函数 ([class.virtual]) 和虚拟基类 ([class.mi]) 的空间要求也是如此。

    这意味着,对于

     struct foo {
         private:
            int x;
         protected:
            int a;
            int b;
         public:
            int m;
            int n;
         private:
            int y;
    };
    

    您只能保证在内存中xy 之前,ab 之前,mn 之前。除此之外,成员在内存中的布局顺序是未指定的。

    但是,内存中成员的顺序很少是有用的信息。因此,可以说访问说明符与“低级内存”无关。

    【讨论】:

    • 订购信息很有趣。但是,它没有说明内存布局是否/如何影响可访问性。也许只是我读到了 OP 似乎期望内存访问保护参与可见性的问题。
    • @Yunnosch 好点,试图澄清这一点
    • 可惜。你已经得到了我的支持。不能再给一个。 ;-)
    • 我认为,当编译器可以证明它们从未被使用时,它是否可以决定删除私有成员也是值得了解的。
    • 好的,好的,你去:stackoverflow.com/q/65201486/430766
    猜你喜欢
    • 2012-06-15
    • 2019-02-14
    • 1970-01-01
    • 2013-02-02
    • 2023-04-08
    • 2017-09-18
    • 2017-12-19
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多