noalias
Microsoft 特定
noalias
表示函式呼叫不會修改或參考可見的全域狀態,而且只會修改指標參數直接指向 的記憶體(第一層間接取值)。
如果函式已標注為 noalias
,則優化器可以假設只有參數本身,而且只有指標參數的第一層間接取值,會在函式內參考或修改。
批 noalias
注僅適用于批註函式主體內。 將函式標示為 __declspec(noalias)
不會影響函式所傳回指標的別名。
如需可能會影響別名的另一個批註,請參閱 __declspec(restrict)
。
範例
下列範例示範 如何使用 __declspec(noalias)
。
當存取記憶體的函 multiply
式加上 __declspec(noalias)
批註時,它會告訴編譯器,此函式不會透過其參數清單中的指標來修改全域狀態。
// declspec_noalias.c
#include <stdio.h>
#include <stdlib.h>
#define M 800
#define N 600
#define P 700
float * mempool, * memptr;
float * ma(int size)
{
float * retval;
retval = memptr;
memptr += size;
return retval;
}
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);
}
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應