Использование функциональных указателей в C при разработке структуры данных - PullRequest
0 голосов
/ 13 декабря 2018

В следующем семестре у меня курс «Алгоритмы», поэтому я погрузился в Си с целью заранее подготовить несколько структур данных.

Когда я узнал об указателях функций, я обнаружил, чтоможет хранить их в structs и создавать объектно-ориентированное использование для моей структуры данных.Вот пример:

#include <stdio.h>


void insert(char * object)
{
    printf("Adding %s to the data structure\n", object);
}


typedef struct data_structure {
    char * obj;
    void (*insert)(char * object);
} data_structure;


int main()
{
    data_structure d;
    d.insert = insert;

    d.insert("bacon");

    return 0;
}

Но действительно ли этот вид процедуры действительно полезен в области изучения структуры данных и алгоритмов на C?Или это просто занимает память на структуре данных?

Я обнаружил, что другие посты говорят о указателях функций, но ни одна из них не посвящена такому подходу.Я думаю, что это может быть полезно для группы любопытных студентов там:)

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Прочитав все ответы, вы поймете, как этот пост собрал информацию об использовании указателей на функции в качестве атрибутов структуры C.

Преимущества:

  • Хорошая практика в некоторой степениуглубленный предмет, если вы студент
  • Обеспечивает инкапсуляцию и объектно-ориентированный код на C
  • . Дает вам лучшее понимание парадигмы объектно-ориентированного программирования, если вы еще не очень хорошо с ней знакомы
  • Может использоваться для реализации VTables

Недостатки:

  • На функциональном уровне вам все равно придется передавать структуру данных в функцию, поскольку она нене имеют доступа к указанной структуре данных
  • Незначительные накладные расходы на производительность

В заключение, использование указателей на функции, как в первоначальном вопросе, действительно будет иметь практическое применение, только если вы захотите исследоватьООП, углубляясь в более продвинутые аспекты C или создавая VTables.

Спасибо всем людям, которыеeplied.

0 голосов
/ 13 декабря 2018

В прошлом я, конечно, видел объекты, сконструированные таким образом, как наборы указателей на функции, эффективно представляющие vtable.Обычно для vtable вы добавляете один дополнительный уровень косвенности, чтобы все объекты данных с одинаковыми характеристиками указывали на один и тот же объект-указатель на функцию.Это снижает стоимость объекта данных, если имеется более 1 функции, но с небольшими затратами на выполнение.

Его также можно использовать в качестве упрощенного способа организации и структурирования объектов обратного вызова function + voiddata, настаивая на том, чтопервый элемент данных является функцией обратного вызова.Конечно, вы не можете определить унаследованные классы с помощью c, но у вас могут быть вложенные структуры, которые можно использовать для той же цели.

...