gpt4 book ai didi

C - 头文件与函数

转载 作者:行者123 更新时间:2023-11-30 20:50:52 25 4
gpt4 key购买 nike

将所有内容都放入一个文件中的优点和缺点是什么:

void function(void) {
code...
}

与为函数创建一个全新的文件相比:

#include <stdio.h>
#include "header.h"

其中一个更快吗?更轻量?我处于需要速度和便携性的情况。

我可以补充一下,这都是基于 C 的。

最佳答案

如果你关心速度,你首先应该编写一个正确的程序,关心高效的算法(阅读Introduction to Algorithms),基准测试和profile它(可能使用 gprof 和/或 oprofile ),并将您的精力主要集中在对性能至关重要的少数几个源代码上。

您最好将公共(public)包含头文件中的这些小关键函数定义为静态内联函数。然后编译器将能够inline如果需要的话,每次调用它们(并且它需要访问要内联的函数的定义)。

一般来说,小的内联函数通常会运行得更快,因为编译后的机器代码中没有调用开销;有时,它可能会稍微慢一些,因为内联会增加机器代码大小,这对CPU cache不利。效率(阅读 locality of reference )。此外,包含许多静态内联函数的头文件需要更多时间来编译。

<小时/>

作为一个具体的例子,我的 Linux 系统有一个头文件 /usr/include/glib-2.0/glib/gstring.h (来自 GTK 中的 Glib)包含

/* -- optimize g_string_append_c --- */
#ifdef G_CAN_INLINE
static inline GString*
g_string_append_c_inline (GString *gstring,
gchar c)
{
if (gstring->len + 1 < gstring->allocated_len)
{
gstring->str[gstring->len++] = c;
gstring->str[gstring->len] = 0;
}
else
g_string_insert_c (gstring, -1, c);
return gstring;
}
#define g_string_append_c(gstr,c) g_string_append_c_inline (gstr, c)
#endif /* G_CAN_INLINE */

G_CAN_INLINE 预处理器标志已由某些先前包含的头文件启用。

这是inline函数的一个很好的例子:它很短(十几行),它可以快速运行自己的代码(不包括调用g_string_insert_c)的时间>),因此值得定义为静态内联

不值得将一个单独运行很长时间的短函数定义为内联。例如,内联矩阵乘法是没有意义的(相对于进行 100x100 或 8x8 矩阵乘法的时间来说,调用开销微不足道)。因此,请仔细选择要内联的函数。

<小时/>

您应该信任编译器,并启用它的 optimizations (特别是在基准测试或分析时)。对于 GCC ,这意味着使用 gcc -O3 -mcpu=native 进行编译(我还推荐 -Wall -Wextra 以获得有用的警告)。您可以通过使用 gcc -flto -O3 -mcpu=native

进行编译 和链接来使用链接时间优化

关于C - 头文件与函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38025140/

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