结构函数指针的编译器处理

时间:2016-03-25 22:22:35

标签: c struct function-pointers

最近,我一直在看到一种在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()。我一直在考虑这种技术,并希望使用它,但想到了一些问题。

  1. 编译器是否可能内联整个结构,以便通过函数指针的调用被函数本身替换?似乎不太可能,因为const实际上并没有声明编译时常量。这也使得无法内联任何命名空间函数。

  2. 这可能存储在哪个可执行部分?如果可能破坏结构,这似乎可能是一个安全问题 并安装不同的函数指针。

1 个答案:

答案 0 :(得分:1)

1)你不在乎,通过分支预测,开销是在纳秒内。

2)通常将consts复制到ram以便更快地访问。但风险似乎与使用符号来解决功能相同。