C++编程:C++的底层机制

C++编程:C++的底层机制,第1张

C++编程:C++的底层机制,第2张

C++提供的各种访问控制只是在编译阶段给我们的限制,也就是说编译器在完成任务之前保证你的正确行为。如果你的行为是不正确的,那么你就不能构造任何可执行的程序。

但如果真的是生成可执行代码的阶段,不管是C、c++还是pascal,大家都一样。你觉得C和c++编译器生成的机器码会不一样吗?你觉得c++生成的机器码会有访问限制吗?那你就错了。什么const,private,都没有(const变量可能放在只读数据段),而且不会给你任何限制。你可以使用所有的内存修改工具或者自己写一个程序来修改某个进程中的变量空,无论它在你印象中是私有的还是公有的。这个时候对你来说都一样,你想做什么都可以。

另外,不要大声疾呼c++提供的后期绑定机制。它只是在生成的代码中增加了一些内容。它远没有你想象的那么聪明。所有的工作都由编译器替你完成。该执行的时候,计算机会一丝不苟地执行编译器生成的代码。

(以下反汇编代码均来自visial c++ 7.0)

一、先说变量——没你想的那么简单。

什么是变量?变量是在程序执行过程中可以改变的量。换个说法,变量就是一个内存区域的名字,它代表这个内存区域。当我们修改变量时,会导致内存区域的内容发生变化。但是如果你学过汇编原理或者计算机组成原理,那么你就会知道,一个内存区域是没有名字的,它唯一的标志就是它的地址。所以,要想修改一个内存区域的内容,只有知道它的地址才能实现。似乎所谓的变量只是编译器给我们的一个抽象,让我们不必了解更多的细节,减少我们的思维跨度。例如,下面的语句:

int a = 10

按照我们的思维习惯,就是“有一个值为10的变量A”,一切都显得那么自然。我们不必在意所谓的地址等细节。但是,在这个语句的底层实现中,A不能再被视为一个变量,它只是一个代表地址的标记:

mov dWord ptr[a],0Ah

反正这个说法不像上面那个那么容易接受,因为它需要知道更多的细节,你几乎得不到编译器的任何帮助,所有的思维跳跃都要靠自己去完成。这句话应该解释为“将10写入地址为A的存储区”。您说什么?/不好意思?a有点像指针?是的,但现在还不是时候。只是他们的流程看起来差不多。这里说的飞跃,其实就是从一个现实问题到一个特定地址和内存区域的飞跃。

二。引用:你可以有引用,但是编译器只有指针(地址)

看完第一篇文章,一定要对编译器的工作有一定的了解。实际上,编译器是程序员和下层之间的一个转换层。它将高级语言代码转换成低级语言代码。编译器的转换跨度越大,就会越复杂,因为程序员的工作都是他做的。正是由于这个原因,C++编译器必然比汇编编译器更复杂。如果我问你引用和指针是一样的吗?你可能会说,当然不一样。指针容易出现不安全因素,而引用则不会。真的吗?让我们看看下面的代码:

int * e = new int(10);

int & f = * e;

删除e;

f = 30

你对上面的代码有什么看法?我觉得不太安全。它和指针一样有隐患。因为它引用的内存区域是非法的。

个人认为所谓的引用其实也是指针的一种,只是两者的接口不一样,引用的接口有一定的限制。指针可以是一对多的,但是引用只能是一对一的,也就是&refer不可更改,但也不能说一对一就是安全的,只是降低了危险系数。它比引用指针更容易控制。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++编程:C++的底层机制

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情