命名空间和私有变量如何在程序集中工作
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名和方法/类名在编译后会有不同的名字,所以不使用命名空间的名字
相关文章:
- 内联程序集printf将整数解释为地址
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 具有外部"c"和程序集的未定义函数
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 不同于按值传递和常量引用传递的程序集
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- C++变量在调用 x64 程序集函数后重置为 0
- 如何将C++子例程链接到 x86 程序集程序?
- Qt 网页程序集缓存
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 为什么从 constexpr 引用生成的程序集代码与从 constexpr 指针生成的程序集代码不同?
- 将内联程序集尾调用函数尾声替换为用于x86/x64 msvc的Intrinsics
- 解析 C# 中的C++程序集
- 提高驱动程序程序的时间效率
- 有没有办法测量应用程序/程序占用多少系统资源(例如 RAM)
- 程序c++程序的文件结构
- 用于创建菜单栏的c++ win32程序(程序编译并运行,也显示窗口但不显示菜单栏)
- 用于应用程序/程序设置的visual C++类