说,我有这个代码:
int f() {
volatile int c;
c=34;
return abc();
}
volatile int c永远不会被读取。但是它被标记为volatile,编译器可以完全消除它吗?我在 Visual C++ 2010 中的测试显示出矛盾的结果。在 VC++ 中,如果我启用优化(最大化速度),上述函数包含一个名为 c 的局部变量(通过查看生成的程序集列表)。但是,我没有使用赋值运算符,而是尝试通过 memset() 之类的编译器内部函数初始化变量(并使用编译器内部函数启用),变量被消除。
int f() {
volatile int c;
memset((void*)&c,34, 1);
return abc();
}
那么根据 C++ 标准,编译器可以消除 volatile int c 吗?我在想 VC++ 中可能存在一些与内在函数如何优化 volatile 变量相关的不一致行为。