noalias

Microsoft özel

noaliasbir işlev çağrısı değil değiştirmek veya başvuru görünür genel durumu anlamına gelir ve yalnızca sıralanmasını bellek değiştirir directly işaretçi parametreleri (birinci düzey indirections) tarafından.

Bir işlev olarak açıklama, noalias, en iyi duruma getiricisi parametrelere ek olarak kendilerini, yalnızca birinci düzey indirections işaretçi parametrelerinin başvurulan veya işlevinin içinde değişiklik, kabul edilebilir.Görünür genel durumu değil tanımlı olan veya başvurulan derleme kapsamı dışında tüm veriler kümesidir ve kendi adres değil alınır.Tüm kaynak dosyalarını derleme kapsamdır (/LTCG (Bağlama Zamanı Kodu Üretme) oluşturur) veya tek bir kaynak dosyası (olmayan-/LTCG oluşturma).

Örnek

Aşağıdaki bakılması kullanarak __declspec(restrict) ve __declspec(noalias).Bellek genellikle dönen malloc olan restrict ve noalias crt üstbilgileri uygun şekilde donatılmış olduğundan.

Ancak, bu örnekte, işaretçiler mempool ve memptr derleyici bellek yumuşatma tabi olmayan hiçbir güvencesi bulunmanız geneldir.İşaretçileri ile dönmek işlevleri decorating __declspec(restrict) bellek dönüş değerine göre sıralanmasını derleyicisi takma adlı değildir söyler.

Bellek ile erişen örnek işlev decorating __declspec(noalias) derleyici bu işlev işaretçileri, parametre listesindeki aracılığıyla dışında genel durumu ile etkilemediğinden söyler.

// declspec_noalias.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.1/k++;
    return a;
}

__declspec(noalias) 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);
}

Ayrıca bkz.

Başvuru

__declspec

C++ Anahtar Sözcükleri