как пространство имен и частные переменные работают в сборке? - PullRequest
1 голос
/ 20 декабря 2011

как это работает? переменные хранятся в специальных регистрах или памяти? Я смотрю на регистр / окна памяти в визуальном, но я не могу понять это: (

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

Ответы [ 3 ]

8 голосов
/ 20 декабря 2011

С точки зрения машины, нет ничего особенного в private или namespace.Это просто идентификаторы для компилятора.То есть компилятор обеспечивает соблюдение правил доступа, поэтому вы получаете ошибки компилятора за то, что вы не должны этого делать.Однако двоичный код, который в конечном итоге создает компилятор, не делает различий между данными.

3 голосов
/ 20 декабря 2011

Компилятор принимает

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++.Идентификаторы языка ассемблера обычно допускают больший диапазон символов в них, чем языки высокого уровня, что удобно в таких случаях, как это.

1 голос
/ 20 декабря 2011

Пространства имен используются в качестве направления для компилятора, поскольку фактические имена переменных и имена методов / классов имеют разные имена после компиляции, поэтому имя пространства имен не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...