c++中的volatile關(guān)鍵字一直沒有使用過。最近使用了一下。該關(guān)鍵字的意思就是告訴編譯器不要對該變量進行優(yōu)化,使用地址對該變量進行取值而不要直接使用該變量已經(jīng)存在cach/寄存器中的值。
測試代碼如下:
如果編譯器沒有優(yōu)化的話,打印出來的值應(yīng)該是1和16。反之,如果沒有使用volatile,優(yōu)化之后應(yīng)該打印出來的是1和1
我在vc6和vc2008下測試了一下:
-----------------------------------------------------------------------------------------
vc2008
-----------------------------------------------------------------------------------------
沒有關(guān)鍵字volatile
debug下打印的是 1 和 1 ---為什么會被優(yōu)化了呢?我的優(yōu)化編譯選項是disabled的
release下打印的是 1 和 1
有關(guān)鍵字volatile
debug下打印的是 1 和 1 --- 很奇怪!
release下打印的是 1 和 16
我想可能是編譯器對debug下作了特殊處理。而且該程序非常簡單
vc6.0
-----------------------------------------------------------------------------------------
沒有關(guān)鍵字volatile
debug下打印的是 1 和 16
release下打印的是 1 和 1
有關(guān)鍵字volatile
debug下打印的是 1 和 16
release下打印的是 1 和 1 --- 很奇怪!
小結(jié):
在多線程多核的情況下,要防止被編譯器優(yōu)化!
測試代碼如下:
1
// volatile.cpp : Defines the entry point for the console application.
2
//
3
4
#include "stdafx.h"
5
6
7
int _tmain(int argc, _TCHAR* argv[])
8

{
9
//volatile int a = 1;
10
int a = 1;
11
printf ("a = %d\n", a);
12
13
__asm
14
{
15
mov DWORD ptr [ebp-4], 10h // 修改a的值為0x10
16
}
17
18
printf ("a = %d\n", a);
19
20
getchar();
21
22
return 0;
23
}
24
25

2

3

4

5

6

7

8



9

10

11

12

13

14



15

16

17

18

19

20

21

22

23

24

25

如果編譯器沒有優(yōu)化的話,打印出來的值應(yīng)該是1和16。反之,如果沒有使用volatile,優(yōu)化之后應(yīng)該打印出來的是1和1
我在vc6和vc2008下測試了一下:
-----------------------------------------------------------------------------------------
vc2008
-----------------------------------------------------------------------------------------
沒有關(guān)鍵字volatile
debug下打印的是 1 和 1 ---為什么會被優(yōu)化了呢?我的優(yōu)化編譯選項是disabled的
release下打印的是 1 和 1
有關(guān)鍵字volatile
debug下打印的是 1 和 1 --- 很奇怪!
release下打印的是 1 和 16
我想可能是編譯器對debug下作了特殊處理。而且該程序非常簡單
vc6.0
-----------------------------------------------------------------------------------------
沒有關(guān)鍵字volatile
debug下打印的是 1 和 16
release下打印的是 1 和 1
有關(guān)鍵字volatile
debug下打印的是 1 和 16
release下打印的是 1 和 1 --- 很奇怪!
小結(jié):
在多線程多核的情況下,要防止被編譯器優(yōu)化!