2

我目前正在开发一些高性能、对稳定性至关重要的框架,这些框架可能会部署在 x86_64、ia64 和潜在的 ARM 平台上。到目前为止,该库是用 C 语言完成的。当前的标准是 C99,尽管我们有兴趣尝试 C11 的特性。

最初,选择避免使用 C++ 是因为我们希望阻止开发人员使用类,因为它们固有的低效率,例如更大的内存占用、vtables 和继承。我们还希望结构没有成员函数。换句话说,故意选择 C ​​而不是 C++,以防止使用 C++ 中的某些功能。

然而,在进一步研究了 C++ 的一些特性之后,我们最近做了一个双重考虑。它当然似乎有一些好处,主要是类型安全和泛型。

我想知道的是:

1-这种类型安全对程序员和编译器究竟意味着什么?

2- C++ 的类型安全有什么好处,我们如何避免使用 C 进行不安全类型的陷阱?

4

3 回答 3

1

1-这种类型安全对程序员和编译器究竟意味着什么?

类型安全保护您免于调试愚蠢的错误,例如将度数和弧度相加或尝试将“字符串”乘以整数。我不会担心对编译器的影响。在使用类型安全语言 (C++) 和非类型安全语言 (PERL,C) 进行编程后,我会说我通常花更少的时间在类型安全语言中调试“计算机内部”的东西(同样,添加字符串和整数)但是花更多的时间来追踪类型值和定义并在它们之间进行转换。

2- C++ 的类型安全有什么好处,我们如何避免使用 C 进行不安全类型的陷阱?

类型安全是一种保护级别,它允许编译器检查您所做的事情是否正常。对于个人而言,这不如在组设置中重要,因为虽然您知道“GetNumberOfStudents”函数输出的是字符串而不是整数,但您的同事可能不会。C++ 相对于 C 的更大优势在于,您可以将存储数据的方式与检索数据的方式分开,这样如果您决定在内部更改数据结构,“GetListOfAllCustomers”就不会更改为使用该函数的人.

简短回答:如果您愿意为性能和紧凑性而牺牲开发人员时间和硬件理解时间,我会倾向于 C。如果您愿意牺牲少量性能并且不受内存限制,以减少开发人员时间,我会倾向于 C++。我使用 C# 进行所有数据分析,使用 C 进行所有嵌入式软件工作。

于 2013-04-26T23:34:13.927 回答
0

感谢大家的贡献,我们团队决定将代码留在 C 中。

为了回答提出的问题,这是我发现的:

1-类型安全意味着在编译时检查类型兼容性。在 C 中,变量大多是类型安全的。C 不被视为类型安全的原因通常是因为va_listC 中许多常见操作,尤其是 stdio 中使用的 不是类型安全的。C 以不安全着称的另一个原因是它允许隐式转换。对于程序员来说,类型安全意味着在编译时捕获类型错误。对于编译器来说,这意味着在编译时检查类型分配和隐式转换,并且比在非类型安全场景中更严格地做出反应。据我所知,它在编译的二进制文件中没有任何真正的区别。

2- C++ 的类型安全主要用于在编译时捕获无效的隐式转换,希望使程序员的生活更轻松。但是,通过使用 gcc 和-Wconversion(我们通常使用-Wall)进行编译,我们会以警告的形式而不是构建失败的形式获得这种反馈,因此只要我们密切关注编译器输出,好处就相对较小。

使用 C,通过良好的编码实践和审查几乎可以消除不安全的打字问题。

于 2013-04-27T00:17:53.503 回答
0

C++ 中的模板可以使编写比 C 中的相同代码产生更好性能的代码变得切实可行。例如,您可以执行诸如生成在编译时调整的展开循环,以使您的问题大小与目标的缓存大小一致。

C 中的指针算术和强制转换可能会导致缓冲区溢出、悬空引用和内存泄漏。诸如智能指针和容器类之类的 C++ 功能可以大大减少此类错误的发生率。

C++ 语言特性直接支持像 RAII 这样的强大惯用语,使正确编写多线程并发等事情变得更加容易,而不会引入竞争条件或死锁。

表示关键数据属性(如单位值和维度)的丰富类型使编译器能够在编译时捕获单位转换错误。可以使用 C 中的结构和 typedef 进行检查转换,但典型的 C 实现只会在运行时捕获许多单元错误(如果有的话),而 C++ 实现可以比用 C 编写的等效功能更安全、更快.

这些只是一些简单的例子,但关于 C 语言的缺陷和局限性,以及 C++ 语言特性可用于编写快速、正确且可灵活更改的代码的方式,还有很多要说的。

于 2013-04-26T23:56:31.390 回答