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

标签 c linux multithreading ubuntu-10.04

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

我想知道restrict是什么意思?

最佳答案

这是在 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;
}

关于c - 函数签名中的 restrict 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6688113/

相关文章:

linux - 如何在具有 Windows (PE) 目标的 Linux 机器上交叉编译 haskell 程序?

c# - 多个 Parallel.ForEach 调用,MemoryBarrier?

objective-c - 无法使用类型为 'void *' 的右值初始化类型为 'void *const *' 的变量

c - 了解类型转换

linux - 升级到 Jessie 后无法通过主机名 ssh 到树莓派

python - 不使用 sudo 运行特定进程

c++ - C/C++ 和 Fortran 写入同一个文件

c - C 中的类型声明(概念)

Java让线程更新变量

c++ - 带线程的质数