什么是"undetectable means",它们如何更改 C/C++ 程序的对象?
What are "undetectable means" and how can they change objects of a C/C++ program?
在ISO/IEC 14882:2003(C++03(中,在7.1.5.1/8的"简历"一节中作了规定:
[注意:易失性是对实现的提示,以避免涉及对象的激进优化,因为对象的值可能会通过实现无法检测到的方式进行更改。有关详细的语义,请参见 1.9。一般来说,易失性的语义在C++中与在C中相同。
这些无法被实现检测到的"手段"也已经成为Nawaz的问答主题。 为什么我们使用易失性关键字:
但是,有时(程序的某些部分(优化可能是不可取的,因为可能是其他人正在更改编译器不知道的程序外部some_int的值,因为它看不到它;但这就是你设计它的方式。在这种情况下,编译器的优化不会产生预期的结果!
但不幸的是,他错过了解释这些"含义",可能会改变程序外部的对象,以及它们如何改变对象。
我的问题:
- 这些"无法检测的手段"的例子是什么,它们如何能够从外部更改程序的内部对象?
内存中的指针可能被同一程序或其他程序的其他部分看到。例如,存在于共享内存中并且可以由另一个程序更改的变量。
编译器无法检测到这一点。
其他示例是基于硬件的内存位置。
通常,需要易失变量的应用通常会处理异步音频等内容,在系统级别处理中断、APIC 等。大多数应用程序不需要它们。
一个虚构的例子:
int v = 0;
// Some thread
SetUpdatesOn(&v);
// Another thread
for(;;)
{
int g = v;
std::cout << g;
}
假设一个虚构的操作系统级函数SetUpdatesOn
定期更改传递给它的变量。如果变量未声明为易失性,编译器可能会优化int g = v
调用或假定v
始终具有相同的值。
如果变量被声明为易失性,编译器将继续在循环中读取它。
请注意,通常很难调试此类编程错误,因为优化可能仅存在于发布版本中。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- 如何在c++程序中找到函数的地址