2016-03-25 2 views
2

В последнее время я видел интересный способ реализовать аналог явного именования в C. Это достигается с помощью struct для хранения const указателей на функции, например:Compiler обработка функции STRUCT указателей

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(), s аналогично C++ Foo::bar(). Я думал об этой технике и хотел ее использовать, но думал о некоторых проблемах.

  1. Является ли компилятор, вероятно, встроить всю структуру таким образом, чтобы вызовы через указатели функций заменялись самими функциями? Кажется маловероятным, поскольку const фактически не объявляет константу времени компиляции. Это также сделало бы невозможным встроенные функции, связанные с именами.

  2. В какой исполняемой секции это может храниться? Кажется возможным, что это может быть проблемой безопасности, если возможно скрыть структуру и установить различные указатели на функции.

+0

Это сильно отличается от пространств имен. Это время выполнения, а пространства имен - время компиляции. В адресе рассматриваются разные вопросы. – Olaf

+0

@Olaf Вот почему я назвал его аналогом, и почему меня интересует способность компилятора выполнять на нем оптимизацию. –

+0

Аналог подразумевает аналогичную семантику для решения аналогичной проблемы. Это не то, что делают две функции. Указатель функции в 'struct' - это более подход OOP в C, чем эмуляция пространств имен. Для пространств имен просто используйте префикс или макрос для создания имен из имени модуля плюс имя функции. – Olaf

ответ

1

1) вам все равно, с предсказанием ветвления накладные расходы в наносекундах.

2) consts обычно копируются в ram для быстрого доступа. Но риск кажется таким же, как использование символов для разрешения функций.

+0

Любая идея, если компилятор может встроить функции так называемым образом? –

+0

Может, вопрос в том, будет ли он. Google о * встроенных указателях функции const * – xvan

+0

Очень маловероятно. Вы (особенно в простой C) не используете очень часто используемую конструкцию. Компилятор C++ может быть более амбициозным в этом отношении. – tofro