最近,我一直在看到一种在C中实现显式命名空间模拟的有趣方法。这是通过使用struct
来存储const
函数指针来实现的,如下所示:
foo.h中:
extern const struct foo_namespace {
void (* const bar)(int a, int b);
int (* const baz)();
char *(* const qux)(const char *str);
} Foo;
foo.c的:
#include "foo.h"
const struct foo_namespace Foo = {
.bar = /* some function */,
.baz = ... ,
.qux = ...
};
这允许人们将函数调用为Foo.bar()
,类似于C ++的Foo::bar()
。我一直在考虑这种技术,并希望使用它,但想到了一些问题。
编译器是否可能内联整个结构,以便通过函数指针的调用被函数本身替换?似乎不太可能,因为const
实际上并没有声明编译时常量。这也使得无法内联任何命名空间函数。
这可能存储在哪个可执行部分?如果可能破坏结构,这似乎可能是一个安全问题 并安装不同的函数指针。
答案 0 :(得分:1)
1)你不在乎,通过分支预测,开销是在纳秒内。
2)通常将consts复制到ram以便更快地访问。但风险似乎与使用符号来解决功能相同。