最大化 C 中的自动内联
Maximizing automatic inlining in C
我有一个使用联合的变体数据类型。
typedef union {
char *string;
int integer;
...
} vardata_t;
我在 variant.c 中有设置值的函数。其中许多功能都很简单。
void variant_set_integer (variant_t *v, int val) {
assert (v->vartype == vartype_integer);
v->vardata.integer = val;
}
如果我希望执行速度尽可能快并优化速度,我的理解是我应该将函数设为静态并将其放在 header 中。
// variant.h
...
// Source files using this may inline via compiler optimizations
// Source files not using this will strip via compiler optimizations
static void variant_set_integer (variant_t *v, int val) {
assert (v->vartype == vartype_integer);
v->vardata.integer = val;
}
这是优化速度的最佳和正确策略,允许编译器最好地利用它确定内联是最佳解决方案的情况吗?
注意:我正在尝试确定速度的最佳自动内联实践,而不是解决这个具体示例。
如果可以,请使用inline
。我有一种感觉,这就是它的用途。
如果函数可以static
放在一个文件中,那么就这样做。在 header 中制作它们 static
将意味着您会收到有关未使用函数的编译器警告,除非包含 header 的每个文件也使用这些函数中的每一个。
如果您在 header 中将它们设为 static inline
,则 (a) 编译器不会抱怨未使用的函数,并且 (b) 您可以获得内联的最大可用好处。
我假设您的编译器至少支持旧的 (C99) 标准,如果不支持新的 (C11) 标准的话。如果您的编译器仅支持古老的 (C89/C90) 标准(让我们面对现实吧,已有四分之一个世纪的历史),那么您就没有这么简单的选择了——除非有一个 non-standard 编译器扩展这将起到大致相同的作用。
除其他外,另见:
我有一个使用联合的变体数据类型。
typedef union {
char *string;
int integer;
...
} vardata_t;
我在 variant.c 中有设置值的函数。其中许多功能都很简单。
void variant_set_integer (variant_t *v, int val) {
assert (v->vartype == vartype_integer);
v->vardata.integer = val;
}
如果我希望执行速度尽可能快并优化速度,我的理解是我应该将函数设为静态并将其放在 header 中。
// variant.h
...
// Source files using this may inline via compiler optimizations
// Source files not using this will strip via compiler optimizations
static void variant_set_integer (variant_t *v, int val) {
assert (v->vartype == vartype_integer);
v->vardata.integer = val;
}
这是优化速度的最佳和正确策略,允许编译器最好地利用它确定内联是最佳解决方案的情况吗?
注意:我正在尝试确定速度的最佳自动内联实践,而不是解决这个具体示例。
如果可以,请使用inline
。我有一种感觉,这就是它的用途。
如果函数可以static
放在一个文件中,那么就这样做。在 header 中制作它们 static
将意味着您会收到有关未使用函数的编译器警告,除非包含 header 的每个文件也使用这些函数中的每一个。
如果您在 header 中将它们设为 static inline
,则 (a) 编译器不会抱怨未使用的函数,并且 (b) 您可以获得内联的最大可用好处。
我假设您的编译器至少支持旧的 (C99) 标准,如果不支持新的 (C11) 标准的话。如果您的编译器仅支持古老的 (C89/C90) 标准(让我们面对现实吧,已有四分之一个世纪的历史),那么您就没有这么简单的选择了——除非有一个 non-standard 编译器扩展这将起到大致相同的作用。
除其他外,另见: