一尘不染

函数签名中的restrict是什么意思?

linux

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

我想知道限制的含义是什么?


阅读 323

收藏
2020-06-07

共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。但是,如果我们添加restrictadd像这样:

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;
}
2020-06-07