что означает ограничение в сигнатуре функции?

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

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


person q0987    schedule 14.07.2011    source источник
comment
Возможный дубликат Реалистичное использование ключевого слова C99 'restrict'?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 19.03.2017


Ответы (1)


Это что-то введенное в 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;
}
person icktoofay    schedule 14.07.2011
comment
Для получения информации о том, как это полезно, см. страницу в Википедии. - person ughoavgfhw; 14.07.2011
comment
@ugho: очевидно, насколько это выгодно, просто подумайте, как бы вы реализовали memmove() - person ninjalj; 14.07.2011