noalias

Microsoft-spezifisch

noalias bedeutet, dass ein Funktionsaufruf sichtbaren globalen Zustand ändert nicht nur den Speicher verweist und ändert sich der zu directly (Zeigerparameter von Dereferenzierungen der obersten Ebene).

Wenn eine Funktion als noaliaskommentiert wird, kann der Optimierer, dass zusätzlich zu den Parametern selbst nur annehmen, Dereferenzierungen der obersten Ebene der Zeiger parametern in der Funktion verwiesen oder geändert werden.Der sichtbare globale Zustände ist die Menge aller Daten, die nicht außerhalb des Bereichs Kompilierung definiert oder verwiesen wird, und ihre Adresse wird nicht übernommen.Der Bereich beträgt alle Quelldateien Kompilierung (/LTCG (Code zur Verknüpfungszeit generieren) Builds) oder eine einzelne Quelldatei (Nicht-/LTCG Build).

Beispiel

Im folgenden Beispiel wird die Verwendung __declspec(restrict) und __declspec(noalias).Normalerweise ist der Speicher, der von malloc zurückgegeben wurde, restrict und noalias , da die CRT-Header entsprechend ergänzt werden.

In diesem Beispiel sind die Zeiger mempool und memptrglobal, damit der Compiler keine Versicherung, dass der Arbeitsspeicher nicht abhängig von Aliasing ist.Die Funktionen ergänzen, die __declspec(restrict) Rückgabezeiger bei dem Compiler mitgeteilt wird, dass der Speicher, der durch den Rückgabewert nicht angezeigt wird, einen Alias besitzt.

Die Funktion im Beispiel ergänzen, das Zugriff auf Speicher mit __declspec(noalias) dem Compiler mitgeteilt wird, dass diese Funktion nicht den globalen Zustand mit Ausnahme von der Zeiger in die Parameterliste behindert.

// 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);
}

Siehe auch

Referenz

__declspec

C++-Schlüsselwörter