C明显比C++快

Wil*_*3uk 69 c c++ performance

据我所知,所有脚本语言和核心科学程序通常都是用C语言编写的; 这使得实现变得凌乱,但却直截了当.

我理解这些人希望最大限度地提高他们的表现,但是使用C字符串和C结构来使用C++类之间存在真正的区别; C++似乎以相同的方式工作,除了虚函数之外,它只存储一个类函数,并且该类的每个实例都调用一个函数.

是什么让C更快,并且在像python或sqlite这样的项目中它必须是最快的显着差异?

Pot*_*ter 48

C++通常用于科学计划.在该领域,C的受欢迎程度可能正在减弱.Fortran作为一种"低级"语言仍然很受欢迎.

在C++中,"你只需支付你使用的费用." 因此没有任何东西会使它比C慢.特别是对于科学程序,表达式模板可以使用模板引擎执行一些自定义优化来处理程序语义.

为Python等项目选择C的原因是许多人(相对)完全理解它,因此大型代码库不会混淆许多大量贡献者.

SQLite需要小的可执行代码大小,其中C确实有轻微的优势.明智地使用C++仍允许在嵌入式应用程序中使用,但由于担心不需要的语言功能会不断涌入,因此它不太受欢迎.

  • 请注意,C++确实命名为mangling,而C则没有,这使得其他语言更容易直接与C进行交互.(在创建C++库的python包装之前,swig实际上为您构建了一个C++代码的C接口.) (8认同)
  • @SamP C++有一个禁用名称修改的功能,`extern"C"`.Swig碰巧使用C作为通用语言,但您可以在C++的C兼容子集中实现该包装,并且永远不会调用C编译器. (5认同)
  • @UnslanderMonica 1. C++ 二进制文件具有异常处理表,即使它们为空,也会添加边距。2. SQLite是基于字节码的。C++ 中的编译时查询优化意味着在 constexpr 函数中进行解析和分析,该函数不能使用指针。这表明架构发生了变化,产品将不再是 SQLite。3. 是否有办法保存字节码并从应用程序和库二进制文件中删除文本和解析器?4. 无解析器或“无头”SQLite 可以与 C++ 仅标头字节码生成器/优化器交互。 (2认同)

Dav*_*eas 25

我不认为其原因与性能和互操作性有很大关系.C++语言比C语言更复杂,但从性能的角度来看,两种方式都不应该有明显的区别.一些C++构造比C等价(std::sort比快qsort)更快,并且可能有相反的好例子.

编辑:在互操作性方面......

基本上,C++标准没有定义可能需要的一些东西,以便在使用不同编译器/版本创建的二进制文件之间轻松实现互操作性.这里最值得注意的问题是二进制符号的命名约定.在C中,该语言定义了从代码中的每个符号到二进制符号名称的单个映射.调用的函数my_function将在二进制文件中创建一个名为的符号my_function.另一方面,由于函数重载等功能,C++函数的名称必须被修改(在二进制文件中转换为不同的函数符号,编码参数的类型和返回类型),标准没有定义如何进行修剪.这反过来意味着可以根据编译器将C++中的相同函数编译为不同的符号(除非extern "C"用于强制C++中的那些函数的C互操作性).

在一天结束时,脚本语言和本机代码之间的接口无论如何都必须是C接口,即使它在内部实现的细节可能是C/C++ /任何其他本地语言.

(我故意不想进入语言预防的火焰战争,C++真的很强大,但它也有点可怕,因为它是一种比C更复杂的语言,而一些看似简单的东西可能会对性能)

  • 我想人们可以自信地说,现代的、惯用的 C++ 需要一个智能编译器来充分利用内联、RVO、常量折叠等。这样,重量级的 C++ 结构完全有可能根本不引人注目。机器级别,但是一个好的编译器对于 C++ 来说比对于 C 重要得多。 (3认同)

for*_*ran 7

语言本身并不是更快或更慢,解释器和编译器可能或多或少有效.

除此之外,更高级语言提供通常具有运行时成本的抽象层.如果您没有使用它们,编译器可能足够智能去除它们,但如果语言的语义不允许安全地执行它,那可能是不可能的......如果您需要它们,请自己实现它们较低级别的语言可能比使用"慢"语言慢.

  • 除非你编写真正糟糕的编译代码,否则脚本语言比编译语言慢得多 (19认同)
  • @Chris那么它不会是一种脚本语言; 脚本语言的含义是它的解释或字节码编译.编译后,它不是编译语言 (4认同)
  • @ Will03uk-是什么让您无法编写通常采用脚本语言的编译器? (2认同)
  • @Will03uk严格来说,语言既不是编译器也不是解释器,而是由语法、语义描述以及可能的标准库提供内容的描述组成的抽象实体。这不能快也不能慢。 (2认同)

out*_*ind 7

正如Bjarne在[D&E]中提到的,有效性是C++的主要目标之一.因此,只有当程序员使用"额外"函数(如您提到的虚函数,rtt信息等)时,C++才会变慢

所以我认为这更多是出于心理原因 - 使用C是因为它不允许"缓慢"的C++功能.