【问题标题】:how does namespace and private variables work in assembly?名称空间和私有变量如何在程序集中工作?
【发布时间】:2011-12-20 18:09:34
【问题描述】:

它是如何工作的?变量是存储在特殊寄存器还是内存中?我在视觉中查看寄存器/内存窗口,但我无法理解:(

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

【问题讨论】:

  • 尝试搜索“name mangling”

标签: c++ assembly namespaces


【解决方案1】:

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

【讨论】:

  • 所以对于私有变量,它没有存储在任何“特殊位置”?
  • @JoeChen 正确。 private 变量只是对编译器的指定,以防止未经授权的访问。因此,如果您想知道,private 不能用于安全存储密码等;你需要为此加密。
【解决方案2】:

编译器采用

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++ 语言变量。与高级语言相比,汇编语言标识符通常允许在其中包含更大范围的字符,这样使用起来很方便。

【讨论】:

    【解决方案3】:

    命名空间作为编译器的方向,因为实际的变量名和方法/类名在编译后有不同的名称,所以不使用命名空间名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-08
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 2012-11-02
      • 2012-08-26
      • 1970-01-01
      相关资源
      最近更新 更多