C++强大的背后
C广泛应用在不同领域使用者以数百万计。根据近十年的调查C的流行程度约稳定排行第3位(于C/Java之后)。 C经历长期的实践和演化才成为今日的样貌。1998年C标准委员会排除万难使C成为ISO标准(俗称C98)当中含非常强大的标准模版库(standard template library, STL)。之后委员会在2005年提交了有关标准库的第一个技术报告(简称TR1)并为下一个标准C0x而努力。可惜C0x并不能在200x年完成各界希望新标准能于2011年内出台。流行的C编译器中微软Visual C 2010已实现部分C0x语法并加入TR1扩充库而gcc对C0x语法和库的支持比VC2010更多。应否选择C哪些程序适宜使用C?C并非万能丹我按经验举出一些C的适用时机。C适合构造程序中需求较稳定的部分需求变化较大的部分可使用脚本语言程序须尽量发挥硬件的最高性能且性能瓶颈在于CPU和内存程序须频繁地与操作系统或硬件沟通程序必须使用C框架/库如大部分游戏引擎(如Unreal/Source)及中间件(如Havok/FMOD)虽然有些C库提供其他语言的绑定但通常原生的API性能最好、最新项目中某个目标平台只提供C编译器的支持。按应用领域来说C适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。使用C还是C?C和C的设计哲学并不一样两者取舍不同所以不同的程序员和软件项目会有不同选择难以一概而论。与C相比C具备编译速度快、容易学习、显式描述程序细节、较少更新标准(后两者也可同时视为缺点)等优点。在语言层面上C包含绝大部分C语言的功能(例外之一C没有C99的变长数组VLA)且提供OOP和GP的特性。但其实用C也可实现OOP思想亦可利用宏去实现某程度的GP只不过C的语法能较简洁、自动地实现OOP/GP。C的RAII(resource acquisition is initialization资源获取就是初始化)特性比较独特C/C#/Java没有相应功能。回顾历史Stroustrup开发的早期C编译器Cpre/Cfront是把C源代码翻译为C再用C编译器编译的。由此可知C编写的程序都能用等效的C程序代替但C在语言层面上提供了OOP/GP语法、更严格的类型检查系统、大量额外的语言特性(如异常、RTTI等)并且C标准库也较丰富。有时候C的语法可使程序更简洁如运算符重载、隐式转换。但另一方面C语言的API通常比C简洁能较容易供其他语言程序调用。因此一些C库会提供C的API封装同时也可供C程序调用。相反有时候也会把C的API封装成C形式以支持RAII和其他C库整合等。为何C性能可优于其他语言?相对运行于虚拟机语言(如C#/Java)C/C直接以静态形式把源程序编译为目标平台的机器码。一般而言C/C程序在编译及链接时可进行的优化最丰富启动时的速度最快运行时的额外内存开销最少。而C/C相对动态语言(如Python/Lua)也减少了运行时的动态类型检测。此外C/C的运行行为是确定的且不会有额外行为(例如C#/Java必然会初始化变量)也不会有如垃圾收集(GC)而造成的不确定性延迟而且C/C的数据结构在内存中的布局也是确定的。有时C的一些功能会使程序性能优于C当中以内联和模版最为突出这两项功能使C标准库的sort()通常比C标准库的qsort()快多倍(C可用宏或人手编码去解决此问题)。另一方面C/C能直接映射机器码之间没有另一层中间语言因此可以做底层优化例如使用内部(intrinsic)函数和嵌入汇编语言。然而许多C的性能优点并非免费午餐代价包括较长的编译链接时间和较易出错因而增加开发时间和成本这点稍后补充。我进行了一个简单全局渲染性能测试(512x512像素每像素10000个采样)C 1小时36分、Java 3小时18分、Python约18天、Ruby约351天。评测方式和其他语言的结果详见博文。C常见问题C源代码跨平台吗?C有不错的跨平台能力但由于直接映射硬件因性能优化的关系跨平台能力不及Java及多数脚本语言。然而实践跨平台的C软件还是可行的但须注意以下问题C标准没有规定原始数据类型(如int)的大小需要特定大小的类型时可自订类型(如int32_t)同时对任何类型使用sizeof()而不假设其大小字节序(byte order)按CPU有所不同特别要注意二进制输入输出、reinterpret_cast法原始数据和结构类型的地址对齐有差异编译器提供的一些编译器或平台专用扩充指令避免作应用二进制接口(application binary interface, ABI)的假设例如调用函数时参数的取值顺序在C/C中没定义在C中也不可随便假设RTTI/虚表等实现方式。总括而言跨平台C软件可在头文件中用宏检测编译器和平台再用宏、typedef、自定平台相关实现等方法去实践跨平台C标准不会提供这类帮助。C程序容易崩溃?和许多语言相比C/C提供不安全的功能以最优化性能有可能造成崩溃。但要注意很多运行时错误如向空指针/引用解引用、数组越界、堆栈溢出等其他语言也会报错或抛出异常这些都是程序问题而不是语言本身的问题。有些意见认为出现这类运行时错误应该尽量写入日志并立即崩溃不该让程序继续运行以免造成更大的影响(例如程序继续把内存中错误的数据覆写文件)。若要容错可按业务把程序分割为多进程像Chrome或使用fork()的形式。然而C有许多机制可以减少错误例如以string代替C字符串以vector或array(TR1)代替原始数组(有些实现可在调试模式检测越界)使用智能指针也能减少一些原始指针的问题。另外我最常遇到的Bug就是没有初始化成员变量有时会导致崩溃而且调试版和发行版的行为可能不同。C要手动做内存管理?C同时提供在堆栈上的自动局部变量以及从自由存储(free store)分配的对象。对于后者程序员需手动释放或使用不同的容器和智能指针。 C程序员经常进一步优化内存自定义内存分配策略以提升效能例如使用对象池、自定义的单向/双向堆栈区等。虽然C0x还没加入GC功能但也可以自行编写或使用现成库。此外C/C也可以直接使用操作系统提供的内存相关功能例如内存映射文件、共享内存等。使用C常要重造轮子?我曾参与的C项目都会重造不少标准库已提供的功能此情况在其他语言中较少出现。我试图分析个中原因。首先C标准库相对很多语言来说是贫乏的各开发者便会重复地制造自订库。从另一个角度看C标准库是用C编写的(很多其他语言不用自身而是用C/C去编写库)在能力和性能上自订库和标准库并无本质差别另外标准库为通用而设对不同平台及多种使用需求作取舍性能上有所影响例如EA公司就曾发表自制的EASTL规格描述游戏开发方面对STL的性能及功能需求的特点此外多个C库一起使用经常会因规范不同而引起冲突又或功能重叠所以项目可能须自行开发或引入其他库的概念或实现(如Boost/TR1/Loki)改写以符合项目规范。C编译速度很慢?错是非常慢。我认为C可能是实用程序语言中编译速度最慢的。此问题涉及C沿用C的编译链接方式又加入了复杂的类/泛型声明和内联机制使编译时间倍增。在C对编译方法改革之前(如module提案)可使用以下技巧改善第一使用pimpl手法因性能损耗应用于调用次数不多的类第二仅包含必要头文件并尽量使用及提供前置声明版本的头文件(如iosfwd)第三采用基于接口的设计但须注意虚函数调用成本第四采用unity build即把多个cpp文件结合在一个编译单元进行编译第五采用分布式生成系统如IncrediBuild。C缺乏什么功能?虽然C已经非常复杂但仍缺少很多常见功能。 C0x作出了不少改善例如语言方面加入Lambda函数、闭包、类型推导声明等而库方面则加入正则表达式、采用哈希表的unordered_set/unordered_map、引用计数智能指针shared_ptr/weak_ptr等。但最值得留意的是C0x引入多线程的语法和库功能这是C演进的一大步。然而模组、GC、反射机制等功能虽有提案却未加进C0x。C使用建议为应用挑选特性集我同意Stroustrup关于使用C各种技术的回应“你可以做不意味着你必须这么做。(Just because you can do it, doesnt mean that you have to.)” C充满丰富的特性但同时带来不同问题例如过分复杂、编译及运行性能的损耗。一般可考虑是否使用多重继承、异常、RTTI并调节使用模版及模版元编程的程度。使用过分复杂的设计和功能可能会令部分团队成员更难理解和维护。为团队建立编程规范C的编码自由度很高容易编写风格迥异的代码C本身也没有定义一些标准规范。而且C的源文件物理构成较许多语言复杂。因此除了决定特性集每个团队应建立一套编程规范包括源文件格式(可使用文件模版)、花括号风格。尽量使用C风格而非C风格由于C有对C兼容的包袱一些功能可以使用C风格实现但最好使用C提供的新功能。最基本的是尽量以具名常量、内联函数和泛型取代宏只把宏用在条件式编译及特殊情况。旧式的C要求局部变量声明在作用域开端C则无此限制应把变量声明尽量置于邻近其使用的地方for()的循环变量声明可置于for的括号内。 C中能加强类型安全的功能应尽量使用例如避免“万能”指针void *而使用个别或泛型类型用bool而非int表示布尔值选用4种C cast关键字代替简单的强制转换。结合其他语言如前文所述C并非适合所有应用情境有时可以混合其他语言使用包括用C扩展其他语言或在C程序中嵌入脚本语言引擎。对于后者除了使用各种脚本语言的专门API还可使用Boost或SWIG作整合。C学习建议C缺点之一是相对许多语言复杂而且难学难精。许多人说学习C语言只需一本KR《C程序设计语言》即可但C书籍却是多不胜数。我是从C进入C皆是靠阅读自学。在此分享一点学习心得。个人认为学习C可分为4个层次第一层次C基础挑选一本入门书籍如《C Primer》、《C大学教程》、或Stroustrup撰写的经典《C程序设计语言》或他一年半前的新作《C程序设计原理与实践》而一般C课程也止于此另外《C 标准程序库》及《The C Standard Library Extensions》可供参考第二层次正确高效地使用C此层次开始必须自修阅读过《(More)Effective C》、《(More)Exceptional C》、《Effective STL》及《C编程规范》等才适宜踏入专业C开发之路第三层次深入了解C关于全局问题可读《深入探索C对象模型》、《Imperfect C》、《C沉思录》、《STL源码剖析》要挑战智商可看关于模版及模版元编程的书籍如《C Templates》、《C设计新思维》、《C模版元编程》第四层次研究C阅读《C语言的设计和演化》、《编程的本质》(含STL设计背后的数学根基)、C标准文件《ISO/IEC 14882:2003》、C标准委员会的提案书和报告书、关于C的学术文献。由于我主要是应用C大约只停留于第二、三个层次。然而C只是软件开发的一环而已单凭语言并不能应付业务和工程上的问题。建议读者不要强求几年内“彻底学会C的知识”到达第二层左右便从工作实战中汲取经验有兴趣才慢慢继续学习更高层次的知识。虽然学习C有难度但也是相当有趣且有满足感的。数十年来C虽有起伏但她依靠其使用者而不断得到顽强的生命力相信在我退休之前都不会与她分离也希望更进一步了解她与她走进未来。

相关新闻

AI命理软件深度测评:技术如何赋能传统八字排盘与解读

AI命理软件深度测评:技术如何赋能传统八字排盘与解读

1. 项目概述:当AI遇上传统命理,我们到底在测评什么? 最近几年,AI的风吹遍了各行各业,从写代码到做设计,现在这股风终于刮到了“玄学”领域。作为一个对技术趋势和传统文化都抱有兴趣的从业者,我…

2026/8/11 9:20:18 阅读更多 →
《怪物猎人》竞速攻略:单瓶攻击极限爆发策略与资源管理

《怪物猎人》竞速攻略:单瓶攻击极限爆发策略与资源管理

1. 先搞清楚“打电鳐榜”是什么,以及为什么“一个攻击瓶”是关键 如果你在社区或论坛里看到“打电鳐榜,虽然排名有点可惜,但分是真的高,只用了一个攻击瓶”这样的讨论,第一反应可能是好奇:这到底是在玩什么…

2026/8/11 9:19:17 阅读更多 →
Linux多线程编程实战:从互斥锁到无锁队列的并发设计

Linux多线程编程实战:从互斥锁到无锁队列的并发设计

1. 项目概述:为什么多线程是Linux开发的“必修课”与“重灾区”在Linux系统编程的领域里,多线程是一个让人又爱又恨的话题。爱它,是因为它能榨干多核处理器的性能,让程序跑得飞快,响应如飞;恨它&#xff0c…

2026/8/11 9:19:17 阅读更多 →

最新新闻

不需要投屏主机的无线投屏有哪些

不需要投屏主机的无线投屏有哪些

在传统的会议室场景中,无线投屏往往离不开一台独立的投屏主机或接收盒——设备需要额外供电、连接显示大屏、配置网络,部署起来颇为繁琐。然而,随着技术的演进,不需要投屏主机的无线投屏方案正逐渐成为主流,它们以“即…

2026/8/11 10:14:41 阅读更多 →
进阶指南:AI Agent 究竟是如何同时调用多个大模型的?

进阶指南:AI Agent 究竟是如何同时调用多个大模型的?

摘要单打独斗的 AI 已经过时,未来的 AI Agent(智能体)如何同时调用多个大模型?本文通俗拆解 AI Agent 跨模型调用的三种经典模式——串联接力(Pipeline)、并行动态协作(Voting)与智能…

2026/8/11 10:14:41 阅读更多 →
数据结构:哈希表

数据结构:哈希表

一、哈希表结构体指针数组存放求余后的节点指针头,节点结构体(数据域指针域)二、哈希表的创建对要存放的数据取余,得到数组指针的地址,判断当前位置有没有存有节点头地址,如果没有,就把新节点连…

2026/8/11 10:14:41 阅读更多 →
王成录:创新往往诞生于生态新势力,开源根社区赋能中小团队弯道突围

王成录:创新往往诞生于生态新势力,开源根社区赋能中小团队弯道突围

标签:王成录、M-Robots、开源生态、中小机器人企业、产业创新、技术底座 在媒体访谈中,王成录博士分享了独特的产业观察:颠覆性技术创新很少诞生于行业头部企业,更多来自中小企业、高校实验室与独立开发者,开源根社区&…

2026/8/11 10:14:41 阅读更多 →
零基础自学IT:20天实战经验与学习体系构建

零基础自学IT:20天实战经验与学习体系构建

1. 自学IT的第20天:从零到一的实战复盘 今天是我系统自学IT的第20天,作为一个完全零基础转行的文科生,这20天的学习强度堪比高考冲刺。从连命令行都不敢敲的纯小白,到现在能独立完成简单的Python爬虫和前端页面,这段经…

2026/8/11 10:14:40 阅读更多 →
3分钟学会:如何用Untrunc免费拯救损坏的MP4视频文件

3分钟学会:如何用Untrunc免费拯救损坏的MP4视频文件

3分钟学会:如何用Untrunc免费拯救损坏的MP4视频文件 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 你是否曾遇…

2026/8/11 10:13:40 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →