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++。


目录
相关文章
|
6月前
|
机器学习/深度学习 自然语言处理 测试技术
直接扩展到无限长,谷歌Infini-Transformer终结上下文长度之争
【4月更文挑战第23天】谷歌研究团队推出Infini-Transformer,一种能处理无限长度输入的大型语言模型,解决了长序列数据处理中的内存和计算瓶颈。新模型采用Infini-attention机制,结合压缩记忆,实现高效计算和内存使用。实验显示,该模型在长上下文任务中表现出色,适用于处理极长输入序列,具有低内存占用和快速流式推理能力。论文链接:https://arxiv.org/pdf/2404.07143.pdf
88 1
|
人工智能 机器人
为什么聊天机器人不会在语言密集型角色中完全取代人类
在这篇博文中,我们讨论了在客户服务和写作行业中使用聊天机器人的利弊。虽然聊天机器人能够对客户查询提供快速准确的响应,但它们缺乏人类作家和客户服务代表所拥有的创造力、同理心和真实性。我们还将讨论围绕聊天机器人和人工智能的一般使用的道德问题。总的来说,聊天机器人应该被视为一种补充,而不是人类劳动的替代品。在这篇文章中详细了解聊天机器人在劳动力中的作用。 我理解许多人对人工智能取代人类工人的潜力的担忧。具体来说,人们一直在猜测聊天机器人有可能取代人类客户服务代表、作家和其他依赖语言技能的专业人士。
94 0
|
人工智能 安全 机器人
不要想当然认为人工智能不会取代你的工作!
人们反对人工智能发展的最大理由之一就是,担心这些系统会“偷走”他们的就业机会。这些人根本不理会人工智能会获得感知并最终摧毁人类的这一永久恐惧。
不要想当然认为人工智能不会取代你的工作!
|
机器学习/深度学习 人工智能 供应链
大流行是否改变了人工智能的地位,从“想要”到“必须”?
在一个受新冠肺炎及其后果影响的世界里,采用人工智能正在成为一种主流现实。越来越多的行业正在以前所未有的速度试验和适应人工智能,无论是健康、教育、零售还是制造业。
284 0
大流行是否改变了人工智能的地位,从“想要”到“必须”?
301转向有哪些用途?
除了解决网址规范化问题,还有很多需要做301转向的情形。比如,为保护版权,<a href="https://www.fgba.net/" target="_blank">富贵论坛</a>www.fgba.net拥有不同TLD的多个域名: ▪fgba.cn ▪fgba.cc ▪fgba.co
138 0
《实践者的研究方法》—— 第1章 软件的本质 1.1 软件的本质
本节书摘来自华章出版社《实践者的研究方法》一书中的第1章,第1.1节,作者布鲁斯 R. 马克西姆(Bruce R. Maxim)郑人杰 马素霞,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 第1章 Software Engineering: A Practitioner’s Approach, Eighth Edition 软件的本质 要 点 浏 览 概念:计算机软件是由专业人员开发并长期维护的软件产品。
2132 1
|
人工智能 机器人 物联网
马云:机器不可能取代人类!那会取代什么呢?
在上海纽约大学2020届毕业生典礼上,阿里巴巴创始人马云表示,“机器是不可能取代人类的”。那什么会被取代呢?
机器会取代人类吗?
有这样一个问题:人的价值体现在哪里?也有这样一个答案:人的价值体现在他的工作成果。 但,一个人在工作的时候,他究竟是在干什么?他的工作成果到底是个什么东西? 在我看来,工作成果只是表面现象。
1159 0
|
Serverless 异构计算
素有高冷之称,曾被微软放言取代冯氏结构的FPGA,被阿里云玩“活”了
对于专业人士来说,FPGA (现场可编程门阵列)并不陌生,由于其硬件并行加速能力和可编程特性,在传统通信领域和IC设计领域可谓是大放异彩,一直都被广泛使用。但是,大部分人还不是太了解它。
2502 0