noalias

Microsoft 专用

noalias 意味着函数调用不修改也不引用全局可见状态和仅不修改内存指向 directly 通过指针参数 (第一层间接)。

如果函数说明为 noalias,除了参数外,该优化器可能,假设,,因此,只有指针参数的第一层间接引用或修改在函数内部。该全局可见状态为未定义或引用在生成范围之外的任何数据,因此,它们的地址不会执行。生成范围是所有源文件 (/LTCG(链接时代码生成) 生成) 或单个源文件 (非**/LTCG** 编译)。

示例

下面的示例演示如何使用 __declspec(restrict) 和 __declspec(noalias)。通常,,因为 CRT 头适当,修饰从 malloc 返回的内存是 restrict 和 noalias 。

但是,在此示例中,指针 mempool 和 memptr是全局的,因此编译器没有确保内存不受失真。修饰返回与 __declspec(restrict) 的指针的函数通知编译器内存指向由返回值不抗锯齿。

修饰在该示例中的功能与 __declspec(noalias) 的访问内存通知编译器此功能不干扰。除非将指针的全局状态在其参数列表。

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

请参见

参考

__declspec

C++关键字