volatile کلمه کلیدی برای تعریف متغیر ها هستش وکارش هم اینه که از optimize شدن اون متغیر و حذف توسط کامپایلر جلوگیری میکنه .
مثلا ممکنه متغیر a رو توی کد زیر کامپایلر غیر ضروری تشخیص بده و برای سرعت بیشتر حذفش کنه
void foo(){
int a=22;
//do stuffs without using a
}
ولی اگر volatile تعریف بشه این اتفاق نمیفته
volatile int a=22;
این کد ساده رو فرض کنید :
const int VAR = 5;
int main()
{
int a= VAR;
}
کد اسمبلی که تولید میشه این هست :
; Listing generated by Microsoft (R) Optimizing Compiler Version 18.00.21005.1
TITLE TEST
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB OLDNAMES
END
یعنی قسمت مساوی گذاشتن a و همچنین متغیر const گلوبال کاملا حذف شدن !
ولی اگر volatile استفاده کنیم
const int VAR = 5;
int main()
{
volatile int a= VAR;
}
کد تولیدی اسمبلی این میشه :
; Listing generated by Microsoft (R) Optimizing Compiler Version 18.00.21005.1
TITLE test
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB OLDNAMES
EXTRN @__security_check_cookie@4:PROC
PUBLIC _main
; COMDAT _main
_TEXT SEGMENT
_a$ = -4
_main PROC
; Line 3
push ebp
mov ebp, esp
push ecx
; Line 4
mov DWORD PTR _a$[ebp], 5
; Line 5
xor eax, eax
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
داخل کد بالا متغیر a با این که استفاده نشده ولی باز هم حذف نشده و مقدار گرفته.