関数シグネチャの restrict の意味は何ですか? 質問する

関数シグネチャの restrict の意味は何ですか? 質問する
int pthread_create(pthread_t *restrict thread,
              const pthread_attr_t *restrict attr,
              void *(*start_routine)(void*), void *restrict arg);

制限の意味を知りたいです。

ベストアンサー1

これは C99 で導入されたもので、渡されたポインターが引数内の他のポインターと同じ場所を指していないことをコンパイラーに知らせます。このヒントをコンパイラーに与えると、コードを壊すことなく、より積極的な最適化を行うことができます。

例として、次の関数を考えてみましょう。

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

明らかに、ポインタから 2 つの数値を追加します。必要に応じて、次のように使用できます。

// 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。ただし、異なる場所を指す 2 つのポインターを渡すことはできます。

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

おすすめ記事