gpt4 book ai didi

c++ - 在 C++ 代码中使用纯 C 库是否会导致性能下降/损失?

转载 作者:IT老高 更新时间:2023-10-28 21:59:28 26 4
gpt4 key购买 nike

我看到了这个链接,但我并不是要求使用“extern”的代码降低性能。我的意思是没有“extern”,在 C++ 中使用 C 库时是否存在“上下文切换”? Are there any problems when using pure C (not class-wrapped) functions in C++ application?

最佳答案

C 和 C++ 都是编程语言规范(用英文编写,参见例如 n1570 以了解 C11 的规范)并且不谈论性能(而是关于程序的行为,即关于semantics)。

但是,您可能会使用 GCC 等编译器。或 Clang这不会带来任何性能损失,因为它为 C 和 C++ 语言构建了相同类型的中间内部表示(例如,用于 GCC 的 GIMPLE 和用于 Clang 的 LLVM),并且因为 C 和 C++ 代码使用兼容的 ABIcalling conventions .

实际上 extern "C" 不会更改任何调用约定,而是禁用 name mangling .但是,它对编译器的确切影响是特定于该编译器的。它可能(或不)禁用 inlining (但请考虑 -flto 用于 GCC 中的链接时间优化)。

一些 C 编译器(例如 tinycc)生成的代码性能不佳。偶GCCClang , 当使用 -O0 或没有 明确 启用 optimization (例如 passing -O1-O2 等...)可能会产生慢代码(并且默认情况下禁用优化)。

顺便说一句,C++ 旨在与 C 互操作(这种强约束解释了 C++ 的大部分缺陷)。

在某些情况下,正版 C++ 代码可能比相应的正版 C 代码快。例如,要对数字数组进行排序,您将使用 std::arraystd::sort在真正的 C++ 中,排序中的比较操作可能会被内联。对于 C 代码,您只需使用 qsort并且每次比较都通过一个间接函数调用(因为编译器没有内联 qsort,即使理论上它可以...)。

在其他一些情况下,真正的 C++ 代码可能会稍微慢一些;例如,::operator new 的几个(但不是全部)实现只是简单地调用 malloc(然后检查失败)但没有内联。

实际上,从 C++ 代码调用 C 代码或从 C 代码调用 C++ 代码不会有任何损失,因为调用约定是兼容的。

C longjmp工具可能比抛出 C++ 异常更快,但它们没有相同的语义(参见 stack unwinding )并且 longjmp 不能很好地混合 C++ 代码。

如果您非常在意性能,那么(用真正的 C 和真正的 C++)编写两倍的代码和基准测试。您可能会观察到 C 和 C++ 之间的微小变化(最多几个百分点),所以我根本不会打扰(您的性能问题实际上是不合理的)。


Context switch是一个与 operating system 相关的概念和 multitasking发生在 processes运行 machine code preemption期间可执行.怎么样executable获得(来自 C 编译器、来自 C++ 编译器、来自 Go 编译器、来自 SBCL 编译器,或者是 Perl 或字节码 Python 等其他语言的解释器)是完全不相关的(因为上下文切换可能发生在任何 < em>machine 指令,在 interrupts 期间)。阅读一些书籍,例如 Operating Systems: Three Eeasy Pieces .

关于c++ - 在 C++ 代码中使用纯 C 库是否会导致性能下降/损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48030393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com