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