[英]how does namespace and private variables work in assembly?
它是如何工作的? 变量存储在特殊寄存器或存储器中吗? 我在视觉上看寄存器/内存窗口,但我听不懂:(
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main () {
using first::x;
using second::y;
cout << x << endl;
cout << y << endl;
cout << first::y << endl;
cout << second::x << endl;
return 0;
}
class CRectangle {
int x, y;
public:
void set_values (int,int);
int area (void);
private:
int param;
} rect;
从机器的角度来看, private
或namespace
没什么不同。 这些只是编译器的标识符。 也就是说,编译器强制执行访问规则,这就是为什么您在执行不应执行的操作时会收到编译器错误的原因。 但是,编译器最终生成的二进制代码不会区分数据是什么。
编译器需要
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
并有效地产生如下的汇编代码:
_first@@x: dd 5
_first@@y: dd 10
_second@@x: dq 3.1416
_second@@y: dq 2.7183
如果您不熟悉汇编语言,则这四个语句每个都保留内存,两个用于32位整数,两个用于浮点值,并为其分配标签。 标签是内存地址。
请注意,名称空间限定了每个变量名称。 @
本身没有任何意义,但是转义了名称空间和变量名以隔离异常命名的C++
语言变量。 汇编语言标识符通常比高级语言允许更大范围的字符,在此类用法中很方便。
命名空间用作编译器的方向,因为实际的var名称和方法/类名称在编译后具有不同的名称,因此不使用命名空间名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.