Приведение аргумента startthrthine в pthread с помощью макроса - PullRequest
1 голос
/ 20 января 2012

Я пытаюсь понять какой-то код, который мне дали.Он работает аналогично pthread_create: вы передаете ему указатель на функцию start_routine, которая принимает указатель на void arg в качестве единственного аргумента, и сам указатель на аргумент, а затем pthread_create вызывает вашу функцию.

Обычно, если start_routine действительно нужен аргумент, ему не нужен void *, а arg должен быть приведен к указателю на некоторую структуру.Раньше я кодировал свои start_routine вот так:

void *my_start_routine(void *arg)
{
    struct my_struct *p = arg;
    // use p many times
}

Однако я только что получил код, в котором автор устанавливает макрос для выполнения приведения при каждом использовании p:

void *my_start_routine(void *arg)
{
#define p ((struct my_struct *) arg)
    // use p many times

#undef p
}

Мне трудно понять, почему вы хотите это сделать.Но я предполагаю, что это преднамеренно, потому что это кажется более сложным и менее очевидным, чем первый способ, и автор использует подобные идиомы в коде.Есть ли какая-то причина, производительность или нет, отдавать предпочтение макросу здесь?

Ответы [ 2 ]

1 голос
/ 20 января 2012

Ваша идиома предпочтительнее; другой человек с макросом, на мой взгляд, является мерзостью по следующим причинам:

  • p не является lvalue
  • Не очевидно, что изменения в arg влияют на p.
  • Отладчик не будет знать, что такое p.
  • ...
0 голосов
/ 20 января 2012

Единственное возможное различие, которое я видел, было бы то, что в стеке не было бы выделено места для p, но это довольно сомнительная оптимизация, так как это делается только один раз в начале функции, и вполне может быть оптимизировано компилятором любым способом.

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

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