现代编译器如何知道操作不会产生副作用?

Mat*_*att 3 compiler-construction

我一直在阅读编译器将优化操作没有副作用.我认为这是非常保守的,但编译器如何知道.它是否有一个副作用免费操作的查找表,或者它是否这样做?

Pau*_*han 5

它在编译期间执行代码的静态分析.

请记住,它知道代码是否仅执行本地计算,并且不执行指针数学运算或使用全局变量或修改以某种方式通过引用传入的数据.它调用的任何函数也必须是非副作用(递归这一点).