如何在内存中的变量编译器控制保护? 是否存在与内存中的私有变量相关的变量位? 它是如何工作的?
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?