为什么行业从C转向C ++?[关闭]


19

首先,我想得到一个真实的答案,我一直在尝试从各种来源和文章中获取更多信息,当我阅读C ++之类的东西时,速度很慢,因为它具有虚函数,并且因为C更好,所以我真的不知道该说些什么,并想像一个有大脑的人。因此,请避免在答案中达到此水平。

我的问题是关于是否已通过Doom 3或多或少地完成了对C ++的大规模转换。

对我来说有趣的是,在达到这一里程碑之前,大多数游戏引擎和游戏本身都是用C语言编写的,就像自Quake时代以来那样。有趣的是,ID软件决定完全重写C ++中IdTech 4的代码库,说实话,如果没有很好的理由,我将无法理解大量的工作。

我专注于《毁灭战士3》,因为我主要对OpenGL世界感兴趣,并且在我的旅途中,我一直专注于这个话题,所以我读了很多关于此的内容,但是我认为这样的问题可以是render-API -不可知论,没有太多问题。

为什么在某个时间点,行业大量转向C ++?选择ID的原因是什么?

我要说的最后一件事是,C语言更易于实现,并且提供的功能更少,因为与C ++实际不同,C语言被碎片化的机会要少得多。用最简单的话来说,我有更多的机会找到一个真正好的C编译器,而不是一个好的C ++编译器,它具有以良好方式实现的所有功能。

例如,适用于Android的NDK仍然没有很好的C ++支持(带有r8b版本),具有所有最新和最强大的功能,它是世界上最受欢迎的移动OS的本地工具包!

如果我用现代C ++编写代码,那么现在可能会很痛苦,因为世界上最流行的操作系统之一对我来说是个禁区。和Android一样,许多其他编译器也不是很好。

我应该编写C ++代码,引用2-3版本的C ++版本吗?


1
我怀疑它只是C ++是C的准扩展。人们开始用C ++特性(例如std :: vector)编写C,从那里开始,人们开始学习C ++而不是C,因此人们开始编写完整的C ++。
API-Beast 2012年

1
那么,在开发大型应用程序时使用C还是C ++ ?OOP是一个很好的范例,.. C ++支持它。如果您要使用C语言编写游戏,请考虑面向数据的设计。否则,让我们思考一下为什么当前所有主要的行业参与者都使用C ++。无论是用于金融应用还是休闲应用的软件工程,都致力于OOP范式以及建筑和设计模式的肩上。简而言之,C无法提供封装为您提供的全局。是否有用C编写的现代大型软件?也许是内核和嵌入式系统。
teodron'8

@teodron 1)我必须生成一个良好的可执行文件,我像关心重要资产一样在乎语言,但这不是全部,也不是我在卖的东西2)封装如果有人愿意的话,对性能的影响不大说服我离开C ++世界,封装是为此的好话题之一。
user827992 2012年

3
对我来说有趣的是,在这个里程碑之前,大多数游戏引擎和游戏本身都是用C语言编写的,就像自Quake时代以来一样。 ”我希望看到一些证据。除了Id-software的开源引擎。它们并不是整个视频游戏行业。
Nicol Bolas 2012年

@NicolBolas我正在解释我谈论ID的原因,请了解整个问题的含义。
user827992 2012年

Answers:


28

C ++可以完成C的所有工作。如果C的优势超过C ++的优势,则可以将C和C ++混为一谈。这是C ++非常有意的设计决策。

C ++会做C不会做的事情。这不仅包括简单的多态性,还包括通过模板轻松生成编译时代码的方法。对于容器之类的东西,这确实很方便,这很容易成为C的最大弱点。它还允许用户定义的类似指针的类型(智能句柄)节省大量时间,以及允许用户定义的类似于原语的类型,例如带有运算符支持的向量和矩阵(也可以节省大量时间)。

虚拟功能比非虚拟功能要慢。但是,您必须选择使用虚拟功能,并且有能力的程序员只有在有益时才这样做。C程序员具有函数指针,并且经常将那些指针的集合存储在其他结构引用的结构中。换句话说,他们要进行额外的工作来重新创建与虚拟函数表完全相同的东西。在只需要一个函数指针而又不需要表的情况下,C ++仍然完全允许它,​​并且等效于C。对于现代编译器,在程序员选择使用某个功能的特定情况下,C ++仅比C慢。而且,实际上,现代功能在调制解调器CPU上的开销很小。当今的硬件是为C ++的使用模式而设计的,甚至越来越多地为满足高级解释的毛发的需求而设计。

从历史上看,C ++异常会带来很多开销,即使您不使用它们也会使C ++变慢。如果仅出于编写异常安全代码所涉及的复杂性增加之外的其他原因,则异常是添加到C ++中的一件可怕的事情,实际上,某些容器设计实际上不可能使异常安全。游戏程序员经常忽略异常的存在,甚至在编译器上将其禁用。现代的编译器具有零开销的异常(也就是说,您仅在实际使用它们时才为它们付出代价)。

C是学习所有规则的简单方法。C ++是一种非常庞大的复杂语言。C ++允许编写更高级别的代码,从而产生更简单的API。有些人想更轻松地理解语言,有些人想更轻松地编写高级代码。在理解编译器如何处理特定代码段的简单性与编写大型复杂的互连应用程序的简单性之间进行权衡。由于种种原因,有些人对一个人的重视程度远高于另一个人。

最后,C ++是C的超集。在我看来,没有像这样的能力强的 C ++程序员也不是合格的 C程序员(尽管有很多C ++程序员都在我的门下,迷失在纯C中)。尽管C ++增加了使程序员与大部分C隔离的功能,但平凡的C ++代码通常确实需要使用C才能完成工作。这是C ++与Java和C#之间的主要区别之一。毕竟,有一个原因经常导致您将“ C / C ++”混在一起。

我个人的信念-与我接触过的大多数其他游戏行业专业人士一样-认为C ++的增强的表达能力和高级编程功能胜过C语言所增加的复杂性,而大多数其他情况是提出的反C ++声明与当今技术完全不合时宜。


19
“没有这样的人,既不是有能力的C ++程序员又不是有能力的C程序员”,我强烈不同意这一说法。惯用Ç是从惯用Ç非常不同++。两种样式有所不同,一种样式强调不透明的指针和静态函数,另一种样式使用基于语言的封装等等。有人谁只知道地道的C ++是用C ++胜任,但仍而是通过惯用C.混淆
尼科尔流星锤

我不同意您可以胜任C ++并且只懂“惯用C ++”。C ++的硬部分与C(加上模板)相同。如果C ++程序员对独立函数,纯结构以及原始或不透明的指针感到困惑,那么他还没有在任何现实的非学术场景中编写任何不平凡的C ++代码。我什至会争辩说,任何只精通“惯用” 事物的人都还没有能力。
肖恩·米德迪奇

3
“惯用语”是“舒适”的另一种说法,除了相对而言,它还意味着,根据定义,这几乎是一种不舒适的语言区域,否则本来没有能力的C ++程序员就不会特别熟练。(我不一定认为这意味着它们被这些元素“弄糊涂了”,只是对它们感到不舒服或不熟练。)而且,在一定程度上,学习惯用C ++的人们被认为不舒服只是瞥见一个原始指针。因此,我认为没有能力的C ++程序员意味着有能力的C程序员。
约翰·卡尔斯贝克

换句话说,肯定存在更高级别的C ++领域,在此领域上,您可以完全避免使用编写任何严重的C代码所需的任何更低级别的功能。我敢肯定大多数现实世界的非学术代码库不会完全落入这个领域,但是我怀疑您会找到一个只适应这个领域并且仍然称其为“有能力”的人。当然,您不会将这样的人与C程序员相提并论,而是将他们与使用多种其他高级语言进行编程的人相提并论。
约翰·卡尔斯贝克

1
@DanielCarlsson:公平地说,我只是在做书呆子。抱歉。从这个角度来看,尽管……C ++并没有做任何比C困难的事情。我们用C ++而不是C#或Java是因为我们可以只重新实现整个STL或使用原始阵列或内联汇编或语言扩展(SSE一样内在)甚至曲轴等
肖恩Middleditch

12

为什么在某个时间点,行业大量转向C ++?选择ID的原因是什么?

Id Software 不是 “行业”。他们是一家公司。尽管它们可能具有影响力,但并不是所有人。

我曾经研究过几个可以追溯到1999年的游戏引擎,他们使用的是C ++。

“大约在那个时候”采用C ++的主要理由是:

  1. 它是标准化的。C ++ 98之所以被命名为是因为它于1998年作为ISO标准发布。在此之前,存在多种C ++语言,没有明确的概念是“真实的”还是“正确的”。一旦标准化,并且编译器开始实施该标准,游戏开发人员就可以依赖实际的标准。

  2. 记住一个古老的笑话:一个人走进医生办公室,说:“当我这样举起手臂时,会很痛。” 所以医生说:“所以不要像这样举起你的手臂。”

    如果虚函数不能满足您的需求,C ++不会强迫您使用它们。C ++中的所有内容都是可选的。您选择使用每个特定功能。如果您使用的是对性能至关重要的代码,并且您不希望使用虚拟开销,那么就不要使用虚拟函数。就像在C中使用对性能至关重要的代码一样,您无需使用函数指针。

    确实,这导致许多C ++游戏不是惯用的C ++(至少不是现代惯用的C ++),而仅仅是“带有类的C”。这是编程C ++的完美功能方式。地狱,typedef struct在创建新类型时不必键入内容是有好处的。

    C ++具有很多功能,您可以选择所需的功能。

例如,适用于Android的NDK仍然没有很好的C ++支持(带有r8b版本),具有所有最新和最强大的功能,它是世界上最受欢迎的移动OS的本地工具包!

你的意思是?Google几乎不能容忍使用NDK的人。显然,他们希望每个人都使用Java。NDK存在的唯一原因是因为某些重要的开发人员如果没有该平台就不会使用该平台。因此,存在NDK来满足他们及其功能需求。

是的,C ++是一个更大,更复杂的实现规范。Java也是如此。除C外的任何语言也是如此。

另外,您指的是“所有最新和最强大的功能”?如果您正在谈论C ++ 11的东西,那么还没有人完全实现它。规范现在才不到一年。另外,我也不知道NDK是否也支持C11。是的,C还具有并非所有地方都支持的“最新和最出色的功能”。

这就提出了一个重要的观点:如果要让纯C应用程序在Visual Studio上编译,则它需要符合C89,没有比这更高的了。因此,使用C的碎片已经存在。一些平台仅支持C89。一些支持C99。有些人在不同程度上支持C11。等等。

如果你想用C,然后用C。其他人没有做出选择的事实并不意味着您的选择是错误的,或者他们的选择是错误的。您不需要为他们辩护,他们也不需要为您辩护。


2
我不认为Google几乎不能容忍使用NDK的人,因为NDK的开发正在进行中,并且有多个适用于Android的版本,即使Google讨厌C / C ++,我也不认为我可以实现我的Java游戏性能或市场上最重要的玩家都可以仅针对Java和Android重写其代码的良好性能水平,这可能对Google来说是必不可少的,我不知道,我的意思是询问广泛的查看并没有关于C VS C ++和Java VS世界跛脚的问题,我一直在寻找从语言更广义的答案继续
user827992

对于考虑所有语言功能的编译器,您的回答还让我强调了我对市场上C编译器的可用性的最初观点,在Windows上,我几乎拥有使用自己的编译器生成编译器的所有软件公司,其他免费选项,例如MinGW。我在C语言中发现的真正问题是,缺少对数据结构,容器的本地支持,在C ++中,您可能会了解到特定容器或特定语句的成本是多少,
827992

在C语言中,执行相同操作的代码可能不仅具有1种实现,而且在C ++语言中,编译器因此可以进行更多优化。我可能应该多学习C ++,但是我认为我将仅出于对某些特定功能(而不是语言本身)的良好支持而切换到C ++。
user827992

7

有趣的是,ID软件决定完全重写C ++中IdTech 4的代码库,说实话,如果没有非常好的理由,我将无法理解大量的工作。

对于他们来说,每个版本几乎都重写整个引擎是很普遍的(至少直到最近-我对最近的几款游戏了解不多),并且由于C ++越来越流行,因此使用它而不是坚持使用是有意义的。随着时间的流逝,越来越多的人将具备C的能力。

为什么在某个时间点,行业大量转向C ++?

因为它为您提供了许多高级功能,同时几乎完全向后兼容C代码。

选择ID的原因是什么?

Google会为您解答:http : //fabiensanglard.net/doom3/interviews.php

“ ...一半的程序员一开始就真正具有C ++背景。我具有C和Objective-C背景,通过查看C ++编写的代码,我有点“滑入C ++”。事后看来,我希望我在开始使用它之前就花了一些时间来彻底研究和探索该语言。

您也许仍然可以分辨出渲染器代码主要是用C开发的,然后又变成了C ++。

今天,我坚信C ++是具有关键性能要求的大型,多开发人员项目的正确语言,而Tech 5对于Doom 3的体验要好得多。”

如果我用现代C ++编写代码,那么现在可能会很痛苦,因为世界上最流行的操作系统之一对我来说是个禁区。

  1. 程序员看不到未来。他们不知道会有一个新的平台,该平台对C ++的支持不佳。Android直到2009年才正式存在。《毁灭战士3》是2004年问世的。
  2. 您是否认为正在为PC和游戏机编写前沿3D游戏的程序员希望他们的代码也能在手机上运行?由于可用功率的巨大差异,针对这种程度的可移植性非常罕见,而且往往毫无意义。

我应该编写C ++代码,引用2-3版本的C ++版本吗?

你为什么在乎这个?不要被追逐最新事物所困。如果5年前足够好,现在不会突然变差了。


3

好吧,C ++自80年代就问世了,所以如果编译器不支持C ++,也许您应该使用其他编译器。而且,C ++并没有比C慢很多。只有将其与虚函数和其他抽象一起加载时,C ++的速度才真正慢。但是,由于C ++的灵活性和C所没有的新功能,因此在非Unix领域中,C ++如今已被大量使用。用C ++编写模块化代码比用C编写模块化代码容易得多,并且可以帮助您编写更多可移植的代码。回到编译器的主题,我不知道任何不支持C ++的编译器(也许不完全是C ++ 11,但是任何一半不错的编译器都应该支持C ++)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.