编译器如何将类的对象实例转换为二进制机器代码
How does a compiler translate an object instance of a class to binary machine code?
我曾考虑尝试为一种语言的子集研究和构建一个非常小的人工编译器。回想起来,以我目前的技术水平,这对我来说太难了。
然而,有一件事让我很感兴趣,编译器如何将抽象概念(如对象)转换为汇编/二进制?
例如:
class Dog
{
public:
Dog(string name);
~Dog();
string GetName();
};
dog *Dog = new Dog('rover');
这是如何被翻译成机器代码的——这真是令人困惑。
幕后?这里没有什么大的惊喜。让我们采用一个合理的、byt假设的编译器:
首先,有一个全局Dog* dog
。在全局对象表中添加一个名称,大小为4,类型为(Dog)指针。接下来,将使用一个非常量表达式进行初始化。编写一小段代码__dog__initializer
,它调用::operator new(sizeof(Dog))
,将结果存储在dog
中,然后调用__Ctor_Dog
。需要一个字符串常量"rover"
,所以将其添加到全局字符串表中。
当读取整个文件时,所有表都被转换为对象文件的一部分,因此链接器可以将它们放在一起。这并不是真正生成二进制代码,只是将现有的部分放在一起。
请记住,这只是一个假设的实现,在实践中细节肯定会有所不同。
相关文章:
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- C++从二进制转换为十进制数
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 如何在 O(n) 中将二进制和转换为二进制
- 我写的 ASCII 到二进制转换器C++向后显示二进制,如何使其正确显示?
- 十进制到二进制转换器 c++
- 在C++中将结构转换和存储为二进制
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 如何在C ++中将二进制字符串128位转换为十进制字符串?
- 如何将二进制文件头示例代码 (C++/C#) 转换为 Python?
- 二进制 '==':未找到采用 'Enemy' 类型左侧操作数的运算符(或者没有可接受的转换)
- 将二进制转换为十进制,我如何要求用户仅输入二进制
- QTextStream的操作数到二进制的转换无效
- 在c++中读取和转换二进制数据
- c++转换二进制到十进制从字符串输入
- 计算器转换二进制到浮点值-我做错了什么