volatile是告诉编译器不要优化引用,这样每次读/写都不会使用存储在寄存器中的值,而是进行实际的内存访问.我可以理解它对一些普通变量有用,但不明白如何volatile影响指针.
volatile int *p = some_addr;
int a = *p; // CPU always has to load the address, then does a memory access anyway, right?
Run Code Online (Sandbox Code Playgroud)
如果它被宣布为有什么区别int *p = some_addr?
问题在于:您的程序暂时使用了一些敏感数据,并希望在不再需要时删除它.使用std::fill()on本身并不总是有用 - 编译器可能会决定以后不访问内存块,因此擦除它是浪费时间并消除擦除代码.
用户ybungalobill建议使用volatile关键字:
{
char buffer[size];
//obtain and use password
std::fill_n( (volatile char*)buffer, size, 0);
}
Run Code Online (Sandbox Code Playgroud)
目的是在看到volatile关键字后,编译器不会尝试消除对该调用的调用std::fill_n().
请问volatile关键字总是会阻止编译器修改代码吗?
这与这个问题相关:有没有一种方法可以在使用完缓冲区后对其进行内存设置(例如出于安全考虑)而不对其进行优化?
尝试将指针强制转换为易失性指针,收到有关将易失性指针发送到不需要易失性的函数的警告。