我已经阅读了C vs C ++的内容以及为什么C比C ++更受欢迎,但是编写用C ++编译器编译的C代码并在嵌入式程序中使用会产生什么影响,标准定义(如空指针等)可能会有所不同
为了更清楚,如果我只使用c代码编写embedded.cpp并使用c ++编译器进行编译,那么生成的代码将与embedded.c代码一样高效。我的猜测是C编译器经过高度优化并生成优化代码。这就是全部的原因吗?
答案 0 :(得分:7)
任何比较只有在您查看特定编译器时才有意义。一些领先的编译器对C ++和C使用完全相同的后端,并且库选择(影响磁盘占用空间,内存占用,启动时间以及几乎所有其他内容)的确定非常自由且比C vs.更精细。 C ++,假设你真的很在乎。
所以在这种情况下答案是,不,文件扩展名无关紧要。但是,调用C程序C非常有利于您决定将产品限制为C以便在团队中理解。
请注意,嵌入式开发中反对C ++的许多争论来自十年或更久以前的时代,当时C ++编译器正在努力正确地实现语言,有时以牺牲可预测的性能或运行时大小为代价。今天所有关于嵌入式发展的实用语言战争都是在C ++和C#之间进行的,C很少被记住。
答案 1 :(得分:2)
如果使用c ++编译器编译代码,则需要从环境中运行c ++运行时,包括堆栈展开,ctor / dtor条目的处理等,这些可能不存在。
C需要更简单的运行时环境(crt0和干净的初始状态),并且应该在几乎所有平台上都可以使用。
只有您正在(或开发)一个对操作系统,libstdc ++或工具链提供有限c ++支持的平台时,该决定才有意义。
顺便说一下,我相信现代C和C ++编译器可以在大多数情况下生成同样优化的代码。
答案 2 :(得分:1)
如果使用C ++编译器编译代码,那么该代码根据定义是C ++代码而不是C,即使它也是有效的C代码。
某些有效的C代码不是有效的C ++代码,尤其是C99特定功能,并且一些在两者中都有效的代码可能具有稍微不同的语义 - 例如const
的含义。但是,在大多数情况下,这对生成的代码或其性能几乎没有影响。
对于使用相同编译器套件的相同代码的C和C ++编译,您通常看不到实际可测量的性能差异。 C ++的运行时启动略有不同,因此必须在main()之前调用全局静态对象的构造函数;但是,如果你的C ++代码也是有效的C,那么就没有构造函数,所以没有开销。
C ++具有更严格的类型协议要求,以及更强的错误检查 - 它对于什么是有效代码不太宽容;通常,如果您的C代码编译为C ++而没有错误或警告,那么它可能是更好/更清晰的代码。有一些例外,例如在C中,一般是discouraged from explicitly casting the return from malloc()
,但在C ++中没有选择,并且因为不需要隐式函数声明,所以在C中不这样做的参数不成立。因此,在这种情况下,为了使您的C代码有效C ++,您必须以在C中有效的方式编写它,有些人可能会考虑不好的做法。就个人而言,如果你压制或忽略你的C编译器关于缺少原型的警告,那么在任何情况下你都可能得到你应得的东西,所以我认为在任何情况下都要编写你的C代码以实现C ++兼容性。
关于优化,当使用相同的编译器套件时,C编译器中的优化可能与C ++编译器中的优化相同,除非在精确语义不同的少数情况下。
除此之外,使用有效C的C ++代码会错过C ++的许多好处。相反,很少或没有运行时成本可以使用许多C ++特定功能。另一方面,某些功能相对较贵 - 在使用之前,请确保您知道哪些功能适用于您的特定目标和应用程序。我在another question列出了一些可能有用的资源。
答案 3 :(得分:0)
C ++运行时具有很高的启动成本和终止成本。 除非必须使用C ++功能,否则应始终使用C而不是C ++进行构建。
此外,如果您的应用程序只是C代码,您还希望使用throw()修饰您使用的每个函数原型,或者C ++编译器假定您调用的每个函数都可以抛出并生成不太理想的代码。