что означает ограничение в сигнатуре функции? - PullRequest
25 голосов
/ 14 июля 2011
int pthread_create(pthread_t *restrict thread,
              const pthread_attr_t *restrict attr,
              void *(*start_routine)(void*), void *restrict arg);

Я хотел бы знать, что означает ограничение?

1 Ответ

34 голосов
/ 14 июля 2011

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

В качестве примера рассмотрим эту функцию:

int add(int *a, int *b) {
    return *a + *b;
}

Очевидно, он добавляет два числа изуказатели.Мы можем использовать его следующим образом:

// includes excluded for brevity
int main(int argc, char **argv) {
    int number=4;
    printf("%d\n", add(&number, &number));
    return 0;
}

Очевидно, он выдаст 8;это добавляет 4 к себе.Однако, если мы добавим restrict к add следующим образом:

int add(int *restrict a, int *restrict b) {
    return *a + *b;
}

Тогда предыдущий main теперь недействителен;он передает &number в качестве обоих аргументов.Однако вы можете указывать два указателя в разных местах.

int main(int argc, char **argv) {
    int numberA=4;
    int numberB=4;
    printf("%d\n", add(&numberA, &numberB));
    return 0;
}
...