私有变量的访问是如何在C++中实现的



编译器如何控制对内存中变量的保护?内存中是否有与私有变量相关的标记位?它是如何工作的?

如果您指的是实例的private成员,那么在运行时没有任何保护。所有的保护都发生在编译时,如果你知道类的私有成员在内存中的布局,你总是可以找到它们。这需要了解平台和编译器,在某些情况下甚至可能取决于编译器设置,如优化级别。

例如,在我的Linux/x86-64 w/GCC 4.6上,以下程序会打印出您所期望的内容。它绝不是可移植的,可能会在异国情调的编译器上打印出意想不到的东西,但即使是这些编译器也会有自己的特定方式来访问私人成员。

#include <iostream>
class FourChars {
  private:
    char a, b, c, d;
  public:
    FourChars(char a_, char b_, char c_, char d_)
      : a(a_), b(b_), c(c_), d(d_)
    {
    }
};
int main()
{
    FourChars fc('h', 'a', 'c', 'k');
    char const *p = static_cast<char const *>(static_cast<const void *>(&fc));
    std::cout << p[0] << p[1] << p[2] << p[3] << std::endl;
}

(之所以有复杂的强制转换,是因为void*是任何指针都可以强制转换到的唯一类型。然后,void*可以强制转换为char*,而无需调用严格的别名规则。也可以使用单个reinterpret_cast——在实践中,我从不玩这种肮脏的把戏,所以我不太熟悉如何以最快的方式进行:)

编译器的工作是查看某些成员是私有的,并禁止您使用它们。编译后,它们与其他成员没有太大区别。

然而,的一个重要方面,因为数据成员不需要按照它们在类定义中出现的顺序排列在内存中,但对于具有相同访问级别的变量,它们需要这样做。

相关内容

  • 没有找到相关文章

最新更新