我正在阅读有关严格数据构造函数的内容.链接的维基文章指出,
"严格注释会使性能变差[因为]严格注释会强制编译器确保在构建构造函数之前完全评估该字段,如果事实证明该字段已经被评估过,那么这只是浪费的工作".
我不明白为什么如果该字段已经被评估它是浪费的工作,因为无论如何它都需要应用构造函数的值.
是否有一个例子说明了这个问题或其他因严格性而导致的效率损失?
强制一个值,即使它已被评估,但成本很小但却存在.
如果你有一个可能已经或可能没有被评估的东西的指针(一个thunk或一个值),并且你将它包装在一个惰性数据构造函数中,你只需将该地址复制到它在内存中的位置.那很快.
如果您有这样的指针并且想要将其存储在严格的构造函数中,则必须首先对其进行求值.这需要检查指针的最低位以寻找可能的标签(表示评估的技巧).如果没有标签,你实际上跳转到这个指针进入 thunk.在执行此操作之前,必须将返回帧推送到堆栈,以便最终返回执行流程.然后thunk自我评估,将结果放入寄存器并跳转到返回地址.然后你可以把这个结果放到内存中.
因此,即使您指向的内容已经过评估,您仍然需要进行标记检查.而且我相信在某些情况下,评估的东西没有标签(它是可选的),因此所有其他工作可能仍然会发生 - 什么都不做.