我想通过这个方法来验证 volatile 的作用。但是我的内联汇编代码似乎无法在编译器不知道的情况下修改 i 的值。根据我看的文章,我只需要写汇编代码就好 __asm { mov dword ptr [ebp-4], 20h }
了,我想我写的和他写的一样。
实际输出:
before = 10
after = 123
预期输出:
before = 10
after = 10
文章链接:https ://www.runoob.com/w3cnote/c-volatile-keyword.html
#include <stdio.h>
int main() {
int a, b;
// volatile int i = 10;
int i = 10;
a = i;
printf("before = %d\n", a);
// Change the value of i in memory without letting the compiler know.
// I can't run the following statement here, so I wrote one myself
// mov dword ptr [ebp-4], 20h
asm("movl $123, -12(%rbp)");
b = i;
printf("after = %d\n", b);
}
我想验证
volatile
...的角色
你不能。
如果变量不是volatile
,编译器可能会优化;它不需要这样做。
编译器可能总是将任何变量视为volatile
.
如何在编译器不知道的情况下更改变量的值?
创建第二个写入变量的线程。
例子
以下示例适用于 Linux(在 Windows 下,您需要与 不同的函数pthread_create()
):
#include <stdio.h>
#include <pthread.h>
int testVar;
volatile int waitVar;
void * otherThread(void * dummy)
{
while(waitVar != 2) { /* Wait */ }
testVar = 123;
waitVar = 3;
return NULL;
}
int main()
{
pthread_t pt;
waitVar = 1;
pthread_create(&pt, 0, otherThread, NULL);
testVar = 10;
waitVar = 2;
while(waitVar != 3) { /* Wait */ }
printf("%d\n", testVar - 10);
return 0;
}
如果您使用 进行编译gcc -O0 -o x x.c -lpthread
,编译器不会优化并且像所有变量一样工作volatile
。printf()
打印 113。
如果您使用-O3
而不是编译-O0
,则printf()
打印 0。
如果您替换int testVar
为volatile int testVar
,则printf()
始终打印 113(独立于-O0
/ -O3
)。
(使用 GCC 9.4.0 编译器测试。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句