如何是用C语言实现私有变量的访问++引擎盖下?(How is access for private

2019-06-26 07:17发布

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

Answer 1:

如果你的意思是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还有-在实践中,我从来不玩这种肮脏的把戏,所以我不是太熟悉,怎么做他们最快捷的方式:)



Answer 2:

这是编译器的工作,看到一些成员是私人和禁止你使用它们。 他们不是 任何 从编译后的其他成员非常不同。

然而, 一个重要的方面,在不要求数据成员在它们出现在类定义的顺序存储来布局,但他们必须具有相同的访问级别的变量。



文章来源: How is access for private variables implemented in C++ under the hood?