Bagikan melalui


batasi

Khusus Microsoft

Saat diterapkan ke deklarasi fungsi atau definisi yang mengembalikan jenis penunjuk, restrict memberi tahu pengkompilasi bahwa fungsi mengembalikan objek yang tidak diberi alias, yaitu, direferensikan oleh pointer lain. Ini memungkinkan pengkompilasi untuk melakukan pengoptimalan tambahan.

Sintaks

__declspec(restrict) pointer_return_typefunction();

Keterangan

Pengkompilasi __declspec(restrict)menyebar . Misalnya, fungsi CRT malloc memiliki __declspec(restrict) dekorasi, dan oleh karena itu, pengkompilasi mengasumsikan bahwa pointer yang diinisialisasi ke lokasi malloc memori juga tidak dinamai oleh pointer yang ada sebelumnya.

Pengkompilasi tidak memeriksa bahwa pointer yang dikembalikan tidak benar-benar alias. Adalah tanggung jawab pengembang untuk memastikan program tidak alias penunjuk yang ditandai dengan pengubah batas __declspec .

Untuk semantik serupa pada variabel, lihat __restrict.

Untuk anotasi lain yang berlaku untuk alias dalam fungsi, lihat __declspec(noalias).

Untuk informasi tentang restrict kata kunci yang merupakan bagian dari C++ AMP, lihat membatasi (C++ AMP).

Contoh

Sampel berikut menunjukkan penggunaan __declspec(restrict).

Ketika __declspec(restrict) diterapkan ke fungsi yang mengembalikan penunjuk, ini memberi tahu pengkompilasi bahwa memori yang ditunjukkan oleh nilai yang dikembalikan tidak alias. Dalam contoh ini, pointer mempool dan memptr bersifat global, sehingga pengkompilasi tidak dapat yakin bahwa memori yang mereka rujuk tidak alias. Namun, mereka digunakan di dalam ma dan pemanggilnya init dengan cara yang mengembalikan memori yang tidak dirujuk oleh program, sehingga __decslpec(batas) digunakan untuk membantu pengoptimal. Ini mirip dengan bagaimana header CRT menghias fungsi alokasi seperti malloc dengan menggunakan __declspec(restrict) untuk menunjukkan bahwa mereka selalu mengembalikan memori yang tidak dapat dinamai oleh pointer yang ada.

// declspec_restrict.c
// Compile with: cl /W4 declspec_restrict.c
#include <stdio.h>
#include <stdlib.h>

#define M 800
#define N 600
#define P 700

float * mempool, * memptr;

__declspec(restrict) float * ma(int size)
{
    float * retval;
    retval = memptr;
    memptr += size;
    return retval;
}

__declspec(restrict) float * init(int m, int n)
{
    float * a;
    int i, j;
    int k=1;

    a = ma(m * n);
    if (!a) exit(1);
    for (i=0; i<m; i++)
        for (j=0; j<n; j++)
            a[i*n+j] = 0.1f/k++;
    return a;
}

void multiply(float * a, float * b, float * c)
{
    int i, j, k;

    for (j=0; j<P; j++)
        for (i=0; i<M; i++)
            for (k=0; k<N; k++)
                c[i * P + j] =
                          a[i * N + k] *
                          b[k * P + j];
}

int main()
{
    float * a, * b, * c;

    mempool = (float *) malloc(sizeof(float) * (M*N + N*P + M*P));

    if (!mempool)
    {
        puts("ERROR: Malloc returned null");
        exit(1);
    }

    memptr = mempool;
    a = init(M, N);
    b = init(N, P);
    c = init(M, P);

    multiply(a, b, c);
}

END Khusus Microsoft

Lihat juga

Kata kunci
__declspec
__declspec(noalias)