在公共、私人和受保护的幕后



我试图从C++的低级别角度深入了解Public|Private|Protected之间的差异。

三者之间的差异是如何在记忆中表达的?

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

然而,访问说明符确实会影响类成员在内存中的排列顺序。

来自C++17标准草案:

分配具有相同访问控制(Clause[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之前。除此之外,成员在内存中的排列顺序未指定。

然而,记忆中成员的顺序很少是有用的信息。因此,说访问说明符与";低电平存储器";。

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

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

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

一点也不。

访问是";准予/拒绝";由编译器执行。

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

注意:

其他答案有效地讨论了可见性对记忆秩序的影响

我如何回答了我在OP帖子中读到的不同问题";如何使用内存保护功能来实现成员的可访问性/可见性&";,关于因果关系是一种逆向问题。或者,只有在不同配置的存储器中对成员进行排序/结构化才是实现所需可见性效果的工具,这反过来又需要(但不会导致(以某种方式对成员进行排列

也就是说,我不认为答案之间有冲突,只是对问题有不同的解释

最新更新