C++编译的C代码与嵌入式编程中的纯C代码

C++ compiled C code vs Pure C in embedded programming?

本文关键字:代码 编程 嵌入式 C++ 编译      更新时间:2023-10-16

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

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

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

因此,在这种情况下,答案是不,文件扩展名无关紧要。 但是调用 C 程序 C 非常适合您决定将产品限制为 C 以便在团队中理解。

请注意,许多反对嵌入式开发中C++的论点都来自十年或更久以前C++编译器难以正确实现该语言,有时甚至以牺牲可预测的性能或运行时大小为代价。 今天所有在我身边进行的嵌入式开发的实际语言战争往往都是在C++和C#之间进行的,而C甚至很少被记住。

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

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

只有当你正在开发(或开发(一个平台时,这个决定才重要,这个平台的c++支持有限,来自OS、libstdc++或工具链。

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

如果使用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++编译器中的优化相同,除非在精确语义不同的少数情况下。

除此之外,使用有效的 C 代码C++会错过C++的许多好处。 相反,您可以使用许多特定于C++的功能,而运行时成本很少或没有。 另一方面,某些功能相对昂贵 - 在使用它们之前,请确保您知道哪些功能在您的特定目标和应用程序上可行。 我在另一个问题中列出了一些可能有助于此的资源。

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

此外,如果你的应用只是 C 代码,你还希望修饰你使用 throw(( 的每个函数原型,或者C++编译器假设你调用的每个函数都可以抛出和生成低于最佳代码的代码。