1

我已经阅读了 C 与 C++ 的内容,以及为什么 C 优于 C++,但是编写用 C++ 编译器编译的 C 代码并在嵌入式程序中使用会产生什么影响,标准定义可能存在一些差异,如空指针等。

更清楚地说,如果我只用 c 代码编写一个 embedded.cpp 并使用 c++ 编译器进行编译,那么生成的代码是否会与 Embedded.c 代码一样高效。我的猜测是 C 编译器已经高度优化并生成优化的代码。这就是全部原因吗?

4

4 回答 4

7

只有在查看特定编译器时,任何比较才有意义。一些领先的编译器对 C++ 和 C 使用完全相同的后端,并且库选择(影响磁盘占用、内存占用、启动时间和几乎所有其他内容)是相当自由地确定的,并且以比仅 C 与 C 更精细的方式确定。 C++,假设你真的很在乎。

所以在那种情况下,答案是,不,文件扩展名无关紧要。但是调用 C 程序 C 非常有助于您决定将产品限制为 C 以在您的团队中被理解。

请注意,嵌入式开发中反对 C++ 的许多论据来自十年或更早的一个时代,当时 C++ 编译器努力正确地实现该语言,有时以牺牲可预测的性能或运行时大小为代价。今天所有与我亲近的嵌入式开发实际语言战争都倾向于在 C++ 和 C# 之间进行,而 C 甚至很少被记住。

于 2012-05-13T21:47:07.483 回答
2

如果您使用 c++ 编译器编译您的代码,则环境需要 c++ 运行时,包括堆栈展开、处理 ctor/dtor 条目等,这些可能不存在。

C 需要一个更简单的运行时环境(crt0 和一个干净的初始状态),并且应该在几乎所有平台上都准备就绪。

仅当您正在开发(或开发)操作系统、libstdc++ 或工具链对 c++ 支持有限的平台时,该决定才重要。

顺便说一句,我相信现代 C 和 C++ 编译器可以在大多数情况下生成同样优化的代码。

于 2012-05-13T23:35:18.353 回答
1

如果您使用 C++ 编译器编译代码,那么根据定义,该代码是 C++ 代码而不是 C,即使它也是有效的 C 代码。

一些有效的 C 代码不是有效的 C++ 代码,尤其是 C99 特定功能,一些在两者中都有效的代码可能具有稍微不同的语义——const例如的含义。但是,在大多数情况下,这对生成的代码或其性能几乎没有影响。

您通常会发现使用相同编译器套件对相同代码进行 C 和 C++ 编译之间没有实际可测量的性能差异。C++ 的运行时启动略有不同,它必须在 main() 之前调用全局静态对象的构造函数;但是,如果您的 C++ 代码也是有效的 C,则不会有构造函数,因此不会产生开销。

C++ 有更严格的类型协议要求和更强大的错误检查——它对什么是有效代码的宽容度有所降低;通常,如果您的 C 代码编译为 C++ 而没有错误或警告,那么它可能是更好/更干净的代码。有一些例外,例如在 C 中,通常不鼓励显式转换从malloc(),但在 C++ 中,人们别无选择,并且因为不需要隐式函数声明,所以在 C 中不这样做的论点不成立。因此,在这种情况下,要使您的 C 代码有效 C++,您必须以一种在 C 中有效的方式编写它,但有些人可能会认为这是不好的做法。就个人而言,如果您抑制或忽略 C 编译器关于缺少原型的警告,那么无论如何您都可能得到您应得的,所以我认为无论如何都要编写 C 代码以实现 C++ 兼容性。

关于优化,当使用相同的编译器套件时,C 编译器中的优化可能与 C++ 编译器中的优化相同,除了可能在精确语义不同的少数情况下。

Beyond that, to use C++ code that is valid C is to miss many of the benefits of C++. Rather a lot of C++ specific features are available to you at little or no runtime cost. Some features on the other hand are relatively expensive - be sure you know which are viable on your particular target and application before using them. I have listed some resources that may help with that in another question.

于 2012-05-14T14:44:51.933 回答
0

C++ 运行时具有沉重的启动成本和终止成本。除非您必须使用 C++ 功能,否则您应该始终使用 C 而不是 C++ 构建。

此外,如果您的应用程序只是 C 代码,您还希望使用 throw() 装饰您使用的每个函数原型,或者 C++ 编译器假定您调用的每个函数都可以抛出并生成不是最优的代码。

于 2012-05-14T08:36:59.367 回答