例如,假设我们有类似下面的代码,其中d
是一个字典或其他索引非常重要的数据结构:
x = d[a]
y = d[b]
z = (x + y) * (x + y)
return z + d[a]
优化编译器是否可以有效地将最后一行更改为return z + x
?
如果是这样,在存在多个线程时此优化是否无效?当这个线程正在计算z
的值时,如果另一个线程改变d[a]
的值(甚至是类型)会发生什么?
答案 0 :(得分:0)
问题合并多个。
1:主题
在运行时创建。因此,编译器可能不知道存在多少线程。他们假设任何时候都可能存在多个线程。因此,优化集不受程序级别的线程数的影响。但是,它在编译器级别受到影响。编译器必须考虑数据竞争的威胁。至少对于较旧的编程语言。在现代编程语言技术中,这个问题涉及静态类型系统的强度[见Rust] 和functional purity。
2:即使在确保没有线程的情况下,您具体提到的优化类型也很难看。在其完整的通用性[“非平凡索引”]中:它要求优化器识别表达式之间的相等性。我怀疑大多数编译器都没有这样做,因为它的运行时间要求。