程序状态的任何变化是否构成可观察的行为?
Does any change in program state constitute observable behavior?
考虑以下两个程序:
程序一个
int main()
{
printf( "hellon" );
}
程序两个
int main()
{
srand( 0 );
if( rand() ) {
printf( "hellon" );
} else {
printf( "hellon" );
}
}
它们是否具有相同的可观察行为?根据c++标准(1.9/6),可观察的行为包括:
- 读写
volatile
数据 库I/O函数
现在srand()
和rand()
可能不是I/O函数(尽管我不知道给定的实现是否使用了一些硬件噪声源),但它们修改了程序的内部状态。他们是否操纵volatile
数据?我不知道。对printf()
的调用显然是I/O操作,其序列在两个程序中是相同的。
上面的两个程序是否具有相同的可观察行为?我如何知道两个给定的程序是否具有相同的可观察行为?
上面的两个程序是否具有相同的可观察行为?
正如你所说,这取决于srand()
和rand()
是否有可观察到的副作用。他们不应该;不能有外部噪声源,因为序列要求对于给定的种子是可重复的,并且没有其他原因执行I/O或访问易失性数据。
如果编译器能够确定它们没有(例如,如果它们在头文件中被内联定义,或者链接器足够聪明以执行额外的优化),那么它将能够忽略它们;否则,它必须假定它们存在,并包含它们。在许多实现中,这些函数将在预编译库中,并且链接器不会那么智能,因此您最终将调用这些函数;然而,一个体面的编译器应该注意到if
的两个分支是相同的,并省略测试。
(更新:如注释所述,对rand()
的调用也只能在编译器确定未来的可观察行为不能依赖于其副作用时才可以省略)
我如何知道两个给定的程序是否具有相同的可观察行为?
一般来说,这是一个非常困难的问题,并且会有一些程序无法判断(原因类似于停止问题)。对于像这样简单的程序,你可以简单地列出可观察操作并比较它们;如果行为以一种非平凡的方式依赖于程序的输入,那么很快就会变得非常困难。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C++11观察者模式(信号、插槽、事件、更改广播器/侦听器,或任何您想称之为的东西)
- 如何使用xlib观察任何窗口移动
- 程序状态的任何变化是否构成可观察的行为?
- 有任何可观察的Qt容器类吗?