C为什么没有被C++取代

简介: C为什么没有被C++取代

为什么 C 语言没有被 C++ 取代? - 知乎


 随着 C++ 的不断有新标准出炉,编译器在 C++ 背后做的事情越来越多,相比较而言 C 语言编译器在背后就老实许多。


作者:知乎用户

链接:https://www.zhihu.com/question/266995763/answer/2751818359

来源:知乎

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


如果一个项目如果对内存和编译后的机器指令做精准控制,那么应该优先选择 C 而不是 C++,C++ 编译器在背后插入了太多的指令。举两个例子:


class A {
public:
    A() {}
    ~A() {}
};
int main()
{
    A a;
    return 0;
}

这个例子说明了在 C++ 中一个对象出了其作用域(这里是 a),会自动调用其析构函数,这是编译器自动加入的:

A a;
00007FF71E2918DD  lea         rcx,[a]  
00007FF71E2918E1  call        A::A (07FF71E291302h)  
    return 0;
00007FF71E2918E6  mov         dword ptr [rbp+0E4h],0  
00007FF71E2918F0  lea         rcx,[a]  
00007FF71E2918F4  call        A::~A (07FF71E291258h)  ;编译在这里自动插入调用类A的析构函数
00007FF71E2918F9  mov         eax,dword ptr [rbp+0E4h]  
}

再比如假设 A 类有一个实例方法 f,编译器的调用 A 方法的实现是编译器自动插入了一个 this 指针作为方法的第一个参数:


class A {
public:
    A() {}
    ~A() {}
    void f(int a, int b) {}
};
int main()
{
    A a;
    a.f(1, 2);
    return 0;
}


汇编代码如下:

A a;
00007FF7157D193D  lea         rcx,[a]  
00007FF7157D1941  call        A::A (07FF7157D1311h)  
00007FF7157D1946  nop  
    a.f(1, 2);                       ;由于函数调用方式是__thiscall,
00007FF7157D1947  mov         r8d,2  ;所以参数从右往左入栈,这是第一个参数2
00007FF7157D194D  mov         edx,1  ;这是第一个参数的1
00007FF7157D1952  lea         rcx,[a];这是对象a的地址,即this指针
00007FF7157D1956  call        A::f (07FF7157D110Eh)  ;调用a的方法f
    return 0;
00007FF7157D195B  mov         dword ptr [rbp+0E4h],0  
00007FF7157D1965  lea         rcx,[a]  
00007FF7157D1969  call        A::~A (07FF7157D1267h)  
00007FF7157D196E  mov         eax,dword ptr [rbp+0E4h]

以上,在 C 编译器中不会有的,C 编译器一般不会偷偷插入开发者不知道的指令,你写了什么代码,对应的机器指令和你预期的所差无几。这就是为什么像内核以及一些对性能和内存利用率要求比较高的项目需要使用 C 而不是 C++。


目录
相关文章
|
5月前
八问八答搞懂Transformer内部运作原理
【8月更文挑战第28天】这篇名为“Transformer Layers as Painters”的论文通过一系列实验,深入探讨了Transformer模型内部不同层级的信息处理机制。研究发现,中间层级在表示空间上具有一致性,但功能各异,且模型对层级的去除或重排表现出较强的鲁棒性。此外,论文还分析了层级顺序、并行执行及循环等因素对模型性能的影响,揭示了不同任务下层级顺序的重要性差异,并指出随机化层级顺序和循环并行化对性能损害最小。
56 5
|
7月前
|
网络协议 安全 架构师
TCP:当初取代NCP,如今害怕被取代
但是随着时代的发展,人们对于速度的要求越来越高,人们不断地改良网络模型,我的兄弟也在升级,已经有了IPv6,而与我患难与共的HTTP,则是不断的从1.0优化到了3.0,这个版本的出现彻底的让我感到emo,因为http3.0版本已经使用我的死对头来替换了我,他们将UDP的速度发挥起来,并且对于安全连接和数据校验相关做了很好的控制。
53 4
|
8月前
|
存储 供应链 文件存储
计算机演变过程
我们先从最早的计算机讲起,人们在最初设计计算机时采用这样一个模型: 人们通过输入设备把需要处理的信息输入计算机,计算机通过中央处理器把信息加工后,再通过输出设备把处理后的结果告诉人们。 其实这个模型很简单,举个简单的例子,你要处理的信息是1+1,你把这个信息输入到计算机中后,计算机的内部进行处理,再把处理后的结果告诉你。 早期计算机的输入设备十分落后,根本没有键盘和鼠标,那时候计算机还是一个大家伙,最早的计算机有两层楼那么高。人们只能通过扳动计算机庞大的面板上无数的开关来向计算机输入信息,而计算机把这些信息处理之后,输出设备也相当简陋,就是计算机面板上无数的信号灯。所以那时的计算机根本无法处理
98 0
|
机器学习/深度学习 算法 程序员
AIGC会取代程序员吗?
AIGC会取代程序员吗?
209 1
|
存储
计算机基本结构(一)电子计算机的兴起
计算机基本结构(一)电子计算机的兴起
444 0
301转向有哪些用途?
除了解决网址规范化问题,还有很多需要做301转向的情形。比如,为保护版权,<a href="https://www.fgba.net/" target="_blank">富贵论坛</a>www.fgba.net拥有不同TLD的多个域名: ▪fgba.cn ▪fgba.cc ▪fgba.co
144 0
《实践者的研究方法》—— 第1章 软件的本质 1.1 软件的本质
本节书摘来自华章出版社《实践者的研究方法》一书中的第1章,第1.1节,作者布鲁斯 R. 马克西姆(Bruce R. Maxim)郑人杰 马素霞,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 第1章 Software Engineering: A Practitioner’s Approach, Eighth Edition 软件的本质 要 点 浏 览 概念:计算机软件是由专业人员开发并长期维护的软件产品。
2163 1
|
人工智能 机器人 物联网
马云:机器不可能取代人类!那会取代什么呢?
在上海纽约大学2020届毕业生典礼上,阿里巴巴创始人马云表示,“机器是不可能取代人类的”。那什么会被取代呢?
机器会取代人类吗?
有这样一个问题:人的价值体现在哪里?也有这样一个答案:人的价值体现在他的工作成果。 但,一个人在工作的时候,他究竟是在干什么?他的工作成果到底是个什么东西? 在我看来,工作成果只是表面现象。
1164 0
|
Serverless 异构计算
素有高冷之称,曾被微软放言取代冯氏结构的FPGA,被阿里云玩“活”了
对于专业人士来说,FPGA (现场可编程门阵列)并不陌生,由于其硬件并行加速能力和可编程特性,在传统通信领域和IC设计领域可谓是大放异彩,一直都被广泛使用。但是,大部分人还不是太了解它。
2507 0

热门文章

最新文章