命名空间和私有变量如何在程序集中工作

how does namespace and private variables work in assembly?

本文关键字:程序 程序集 集中 工作 变量 命名空间      更新时间:2023-10-16

它是如何工作的?变量是否存储在特殊的寄存器或内存中?我看着注册/内存窗口的视觉,但我不能理解它:(

#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;

从机器的角度来看,privatenamespace没有什么不同。那些只是编译器的标识符。也就是说,编译器强制执行访问规则,这就是为什么做了不该做的事情会导致编译器错误的原因。然而,编译器最终生成的二进制代码并不区分数据是什么。

编译器接受

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名和方法/类名在编译后会有不同的名字,所以不使用命名空间的名字