C ++能做什么在任何其他语言中都太难或太乱了?

时间:2009-01-08 05:17:58

标签: c++ unique

我仍然觉得C ++提供了一些无法打败的东西。我不打算在这里开始一场火焰战,如果你对不喜欢C ++有强烈的意见,请不要在这里发泄它们。我很想听听C ++专家为什么坚持使用它。

我对C ++的方面特别感兴趣,这些方面鲜为人知或未得到充分利用。

编辑:人们,请至少粗略地阅读其他回复,以确保您不会重复已经说过的内容,如果您同意其他人所说的内容,请进行投票!

16 个答案:

答案 0 :(得分:52)

RAII /确定性最终确定。不,当您处理稀缺的共享资源时,垃圾收集不是一样好

不受限制地访问OS API

答案 1 :(得分:37)

我一直坚持使用C ++,因为它仍然是性能最高的通用语言,适用于需要结合效率复杂性的应用程序。作为一个例子,我为测量行业编写了用于手持设备的实时表面建模软件。鉴于资源有限,Java,C#等......只是没有提供必要的性能特征,而像C这样的低级语言在较弱的抽象特性下开发要慢得多。 C ++开发人员可用的抽象级别范围很大,在一个极端我可以重载算术运算符,这样我可以说像 MaterialVolume = DesignSurface - GroundSurface ,同时运行一个数字在特定设备上为我的应用程序最有效地管理内存的不同堆。将它与丰富的免费资源相结合,可以解决几乎所有常见问题,而且你有一种强大的开发语言。

C ++仍然是大多数域中大多数问题的最佳开发解决方案吗?可能不是,虽然在紧要关头它仍然可以用于大多数。它仍然是高效开发高性能应用程序的最佳解决方案吗?恕我直言,毫无疑问。

答案 2 :(得分:29)

在脚下射击。

没有其他语言可以提供如此有创意的工具。指针,多重继承,模板,运算符重载和预处理器。

一种非常强大的语言,也提供了足够的射击机会。

编辑:如果我对幽默的蹩脚尝试冒犯了一些,我道歉。我认为C ++是我曾经使用过的最强大的语言 - 能够在需要时在汇编语言级别进行编码,并在需要时进行高级抽象。自90年代初以来,C ++一直是我的主要语言。

我的回答是基于多年拍摄自己的经验。至少C ++允许我优雅地做到这一点。

答案 3 :(得分:21)

确定性对象破坏导致一些宏伟的设计模式。例如,虽然RAII不像垃圾收集那样通用,但它会带来一些令人印象深刻的功能,而这些功能是GC无法实现的。

C ++也是独一无二的,因为它有一个图灵完备的预处理器。这允许您更喜欢(与推迟相反)许多代码任务来编译时间而不是运行时间。例如,在实际代码中,您可能有一个assert()语句来测试永远不会发生的事情。现实是它迟早会发生......并且在你休假时凌晨3点发生。 C ++预处理器断言在编译时执行相同的测试。编译时断言在上午8:00到下午5:00之间失败,而您坐在电脑前观看代码构建;当你在夏威夷睡着时,运行时断言在凌晨3点失败。很容易看到那里的胜利。

在大多数语言中,策略模式在运行时完成,并在类型不匹配时抛出异常。在C ++中,策略可以在编译时通过预处理器工具完成,并且可以保证类型安全。

答案 4 :(得分:18)

编写内联汇编(MMX,SSE等)。

确定性对象破坏。即真正的破坏者。使管理稀缺资源变得更容易。允许RAII。

更容易访问结构化二进制数据。将内存区域作为结构转换比解析它并将每个值复制到结构中更容易。

多重继承。并非一切都可以通过接口完成。有时您也希望继承实际功能。

答案 5 :(得分:12)

我想我只是赞美C ++能够使用模板捕捉表达式并在需要时懒惰地执行它。对于那些不知道这是什么的人,here就是一个例子。

答案 6 :(得分:9)

模板mixins提供了我在其他地方没见过的重用。使用它们,您可以构建一个具有大量行为的大对象,就像您手动编写了整个内容一样。但是其功能的所有这些小方面都可以重复使用,它对于实现接口(或整个)的部分特别有用,您可以在其中实现许多接口。生成的对象是闪电般快速的,因为它全部内联。

在许多情况下,速度可能并不重要,但是当你编写组件软件时,用户可能会以非常复杂的方式组合组件来做事情,内联和C ++的速度似乎允许更复杂的结构创建

答案 7 :(得分:9)

在需要时绝对控制内存布局,对齐和访问。如果你足够小心,你可以编写一些非常缓存的程序。对于多处理器程序,您还可以消除缓存一致性机制中的大量减速。

(好的,你可以在C语言,程序集中,也可能在Fortran中执行此操作。但C ++允许您在更高级别编写其余程序。)

答案 8 :(得分:6)

这可能不是一个流行的答案,但我认为将C ++与众不同的是它的编译时功能,例如:模板和#define。您可以使用这些功能对程序执行各种文本操作,其中大部分功能已在后面的语言中以简单的名义放弃。对我而言,这比在C ++中更容易或更快的任何低级别的比特更重要。

例如,C#没有真正的宏设施。您不能将另一个文件直接#include到源中,或使用#define将该程序作为文本进行操作。想想任何时候你必须机械地键入重复代码,你知道有更好的方法。您甚至可能已经编写了一个程序来为您生成代码。好吧,C ++预处理器可以自动完成所有这些事情。

与C ++模板相比,C#中的“泛型”工具同样受到限制。 C ++允许您盲目地将点运算符应用于模板类型T,调用(例如)可能不存在的方法,并且只有在模板实际应用于特定类时才应用检查正确性。当发生这种情况时,如果您对T做出的所有假设实际成立,那么您的代码将会编译。 C#不允许这样......类型“T”基本上必须作为一个对象来处理,即只使用可用于所有内容的最低公共分母(赋值,GetHashCode(),Equals())。

C#以简单的名义废除了预处理器和真正的泛型。不幸的是,当我使用C#时,我发现自己正在寻找这些C ++结构的替代品,这些结构不可避免地比C ++方法更加臃肿和分层。例如,我看到程序员以几种臃肿的方式解决缺少#include的问题:动态链接到外部程序集,在几个位置重新定义常量(每个项目一个文件)或从数据库中选择常量等。

正如辛普森所说的Crabapple女士曾经说过的那样,“相当蹩脚,米尔豪斯。”

在计算机科学方面,C ++的这些编译时功能支持诸如逐个名称参数传递之类的东西,已知它比按值调用和按引用调用更强大。

同样,这可能不是流行的答案 - 例如,任何介绍性的C ++文本都会警告你#define。但是多年来我一直在使用各种各样的语言,并且考虑到所有这些背后的理论,我认为很多人都给出了不好的建议。在称为“IT”的稀释子领域中尤其如此。

答案 9 :(得分:5)

从技术上讲,我认为没有,真的!

老实说,我认为C ++无法做到The D Language无法做到的事情。无论C ++具备什么样的能力,它总是比D或任何其他语言更难和更混乱。即使像类声明这样简单的事情,在C ++中也比其他语言更难和更混乱。

C ++唯一能做的就是与已经用C ++编写的数百万行代码兼容 除了C ++之外,这是唯一没有语言可以做的事情:)

答案 10 :(得分:5)

C#和Java强迫你把'main()'函数放在一个类中。我发现这很奇怪,因为它淡化了一个阶级的意义。

对我来说,类是问题域中的一类对象。程序这样的对象。所以在你的程序中永远不应该有一个名为“Program”的类。这相当于使用符号来表示自身的数学证明 - 证明 - 以及表示数学对象的符号。这将是奇怪和不一致。

幸运的是,与C#和Java不同,C ++允许全局功能。这让你的main()函数存在于外部。因此,C ++提供了一种更简单,更一致,也许更真实的面向对象习惯用法。因此,这是C ++可以做的一件事,但C#和Java不能。

答案 11 :(得分:5)

以最小的开销在进程间传递POD结构。换句话说,它允许我们轻松处理二进制数据的blob。

答案 12 :(得分:3)

我认为运算符重载是一个非常好的功能。当然它可能会被滥用(比如在Boost lambda中)。

答案 13 :(得分:2)

严格控制系统资源(尤其是内存),同时提供强大的抽象机制。在这方面,我所知道的唯一可以接近C ++的语言是Ada。

答案 14 :(得分:2)

C ++提供对内存的完全控制,因此使程序执行流程更加可预测。 您不仅可以准确地说出在何时发生内存分配和释放,您可以定义自己的堆,为不同目的设置多个堆,并准确说出内存数据的分配位置。在嵌入式/实时系统上进行编程时,这通常很有用,例如游戏机,手机,MP3播放器等......,其中:

  1. 对内存有严格的上限,很容易达到(与PC相比,当你的物理内存用完时,它会变慢)
  2. 经常有非同类内存布局。您可能希望在一块物理内存中分配一种类型的对象,而在另一块中分配另一种类型的对象。
  3. 有实时编程限制。意外地在错误的时间调用垃圾收集器可能是灾难性的。
  4. AFAIK,C和C ++是做这类事情的唯一合理选择。

答案 15 :(得分:-1)

老实说,如果你愿意写足够的代码,你可以做任何事情。

所以回答你的问题,不,你不能用C ++不能做的另一种语言做。这只是你有多大的耐心,你是否愿意花费漫长的不眠之夜来让它发挥作用?

有些东西可以让C ++包装器变得容易(因为它们可以读取头文件),比如Office开发。但同样,这是因为有人编写了大量代码,以便在RCW或“Runtime Callable Wrapper”中为您“包装”它

编辑:您也意识到这是一个有问题的问题。