В чем разница между отдельными аргументами (для функции) или структурой аргументов? - PullRequest
1 голос
/ 19 мая 2019

У меня есть код файлового компрессора / декомпрессора, и я должен изменить код, чтобы сделать его параллельным.У меня есть функция с именем 'worker', которая берет куски из очереди in, запускает их через процесс (сжимает или распаковывает) и отправляет их в очередь out.

Это заголовок функции 'worker' (с отдельными аргументами):

void worker(queue in, queue out, chunk (*process)(chunk));

И это была бы 'рабочая' функция, если бы у меня были аргументы в структуре:

void worker(void *ptr) {
    chunk ch, res;
    struct args *args = ptr;
    while(q_elements(args->in) > 0) {
        ch = q_remove(args->in);

        res = args->process(ch);
        free_chunk(ch);

        q_insert(args->out, res);
    }
}

И структура:

struct args {
    int thread_num;
    queue in;
    queue out;
    chunk (*process) (chunk);
};

Теперь мой вопрос: В чем разница между передачей отдельных аргументов или указателя на структуру аргументов типа?

Стоит ли ожидать какого-либоразница?Когда мне следует выбрать тот или иной вариант?

1 Ответ

1 голос
/ 19 мая 2019

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

Например, если мы посмотрим на pthread_create, его прототип будет:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

Здесь start_routine - рабочая функция, а arg - передаваемые ей аргументы.Было бы почти невозможно создать каркас, который легко использовать без этого метода.

В чем разница между передачей отдельных аргументов или указателя на структуру аргументов типа?Стоит ли ожидать какой-либо разницы?Когда мне следует выбрать тот или иной вариант?

Как вы видели в приведенном выше примере, если вы хотите использовать pthread, вам просто нужно использовать структуры.

Другое использованиеесли вы хотите скрыть детали реализации для программиста.Это как бы имитирует ООП.Подумайте над тем, чтобы иметь этот заголовок:

// foobar.h
struct data;
int getId(struct data *data);
void setId(struct data *data, int id);

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

// foobar.c
struct data {
    int id;
    // More fields
}

int getId(struct data *data) {
    return data->id;
}

void setID(struct data *data, int id) {
    data->id = id;
}

Аналогичные рассуждения можно использовать для рабочей функции.

Третья причина может заключаться в том, что вам нужно передать LOTS или аргументы.Тогда это может улучшить читаемость, вместо этого использовать структуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...