CPU的精简指令集与复杂指令集之我见

1,059 阅读4分钟

作者:老九—技术大黍

社交:知乎

公众号:老九学堂(新人有惊喜)

特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系笔者授权

前言

我们经常会看到大学生在学习C/C++时经常会被问到这样的语法:

6C(CFWQ)8ST_NQ2@YU74O%5.png

问:Sum的结果打印出来是多少?image-20210331102942474.png

这种烧脑壳的问题,除了大学时的C/C++专业课程会被问到之外,我们面试C/C++岗位也会必然遇到此类问题。image-20210331103420850.png

a++和++a与什么有关

image-20210331104021089.png

百度出来都是与编译器有相关的答案。当然,上面的答案不准确,应该是与g++命令才能把上面的代码编译通过。

下面我们来动手做一下试验证明到底与什么编译器有什么关系!

源代码

在动手做试验之前,我们给出来源代码如下:

#include <iostream>
int main(int argc, char** argv){
    int a = 1, sum;
    sum = (++a)+(++a)+(++a);
    printf("%d",sum);
    return 0;
}

g++编译器

我的机器安装了QT5.14版本

image-20210331104638096.png

所以,我们准备使用咪咕编译器编译运行后结果是

image-20210331104837214.png

按照C/C++的教课书讲解的语法,它应该是9啊~ 但是实际使用g++编译器运行的结果不是我们想要的预期结果。

cl编译器

使用VS 2019创建一个控制台项目

image-20210331105333325.png

按F5键调试运行如下

image-20210331105435759.png

预期结果=9

修改源代码

#include <iostream>
int main(int argc, char** argv){
    int a = 1, sum;
    int x = ++a, y = ++a, z=++a;
    sum = x + y + z;
    printf("%d",sum);
    return 0;
}

g++编译器

image-20210331110405570.png

cl编译器

image-20210331110503152.png

两种写法的区别

    sum = (++a)+(++a)+(++a);
  • 这种写法一看上去会觉得很抽象,符合代码要抽象的概念。但是,对一般不人不友好。
  • 到处都这样写,有装逼的嫌疑。因为,其实它很难调试。
    int x = ++a, y = ++a, z=++a;
    sum = x + y + z;
  • 这种写法很啰嗦,但是表达概念清晰。
  • 总是这样写,让人不会觉得有技术含量样式(对很多来说,就是没有逼格),但是实用啊。

那么问题来了,我们现在知道了,在我们C/C++源代码中,如果大量使用复杂指令后,结果是会让编译器犯晕的,那编译器犯晕与什么有关呢?image-20210331112457539.png

编译器与什么有关

我记得上大学学习计算机组成原理时,老师讲过CPU的类型是根据指令集类型来分类的,它分为两种:

  • 复杂指令集CPU
  • 精简指令集CPU

早期计算机的CPU都是复杂指令集,所以C/C++为了适应硬件而发明了++和--的运算符,像(++a)+(++a)+(++a)这种语法就是刚好匹配复杂指令集CPU的语法,这种语法非常适合在上古时代只有很小内存时代的代码存贮机制,它占用空间小,并且CPU解析速度快,所以它们能够在64K的程序运行空间中高效运算和稳定运行。

但是,当今的CPU都是精简指令集的类型,像

int x = ++a, y = ++a, z=++a;
sum = x + y + z;

这样语法清楚,显示比较啰嗦的语法,才是非常匹配现在的CPU硬件运行要求的:

  • 解析速度比复杂指令快
  • 运行速度比复杂指令快

所以,我们现在写代码时就不要学什么老鸟去装什么逼了,我们强烈建议:大家还是老老实实的、一步一个步骤的、语意清楚的来书写C/C++源代码吧。image-20210331112728067.png

总结

通过这个示例说明一个一直存在问题:计算机软件与硬件永远都不可能分开的!

也衷心祝愿在校大学生,特别是计算机和与计算机相关专业的大学生,在学校一定要好好学习自己的专业课程啊。虽然,我们在学校看到它有用,但是有一天我们进入IT行业后,我们就会发现:曾经我们在大学认为没有什么卵用的东西,现在真的是非常有用!

当然,以上观点仅代表我个人自己,如果有不足之处,请大家指正和补充。希望能够帮助到现在和我在学校曾经学过。

最后

记得给大黍❤️关注+点赞+收藏+评论+转发❤️

作者:老九学堂—技术大黍

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。