我在C源代码中看到过以下代码,在Linux上用于gcc(用于计算机):
extern double prices[4000];
void somefunction()
{
//this function is called again after each 5 seconds interval
//some long codes that use prices[]
// ...
int i;
for (i=0; i<4000; i++)
{
asm volatile ("" : : "r" (prices[i]));
}
}
所以我有一些问题:
答案 0 :(得分:2)
volatile关键字告诉编译器不允许移动此程序集块。
asm ("" ::: "memory")
是一个简单的编译器围栏。
来自here:
您可以通过编写来阻止删除asm指令 关键字volatile在asm之后。 [...] volatile关键字表示 指令有重要的副作用。海湾合作委员会不会删除 volatile asm如果可以访问的话。
答案 1 :(得分:0)
asm volatile
强制编译在某个寄存器中加载prices[i]
(对于每个循环执行都是相同的单个寄存器,你仍然会使用一个寄存器执行4000次循环)。
如果你刚编译asm
没有volatile
,编译器可以通过删除(或移动)整个语句来优化,然后删除整个循环,因为它什么都不做。
尝试使用
编译foo.c
代码
gcc -O0 -fverbose-asm -S foo.c -o foo-O0.s
gcc -O1 -fverbose-asm -S foo.c -o foo-O1.s
gcc -O2 -fverbose-asm -S foo.c -o foo-O2.s
gcc -O3 -fverbose-asm -S foo.c -o foo-O3.s
使用foo-O*.s
关键字
less
文件(例如使用编辑器或寻呼机,如volatile
)
答案 2 :(得分:0)
在与编写代码的人讨论后,他说他试图将变量提取到CPU缓存(L1 / L2 / L3)