【发布时间】:2021-03-08 19:24:12
【问题描述】:
想深入了解CLR是如何维护线程的栈的。 如果我们创建一个基于值的 var1,CLR 直接把这个结构体放在栈顶,然后其他一些对象可以添加到栈顶。
所以问题是如何使用 var1 进行操作。如果我们用新值覆盖这个变量,CRL 应该从栈顶开始(对栈顶的引用应该保存在某个缓存中)并用新的对象更新该对象。所以如果这个变量在栈顶,这个操作理论上应该会更快。差异应该非常小,但它的维护方式很有趣。
int var1 = 10;
var1 += 30;//should be theoretically faster because CLR shouldn't go deeper into the stack to replace value
int var2 = 20;
//other variables
-----------------
int var1 = 10;
int var2 = 20;
//other variables
var1 += 30;//should be theoretically slower because CLR should go deeper into the stack to replace value
我的假设是正确的还是我遗漏了一些细节?
【问题讨论】:
-
您认为变量存储在堆栈中的假设甚至不是一个真实的假设。就是说,the stack is an implementation detail 首先考虑很少有用。当然,如果您想知道您的两个 sn-ps 之间是否存在性能差异,那么请自己测量这两个 sn-ps 的行为,看看是否存在对您来说很重要的差异应用程序。
-
@Servy,它也可以有语义,不管实现。它与变量的生命周期和范围有关。
-
@JoelFan 了解这些变量的范围和生命周期与“堆栈”无关。事实上,在定义这些变量的范围或生命周期时使用术语“堆栈”没有必要也没有好处。了解它们的范围和生命周期对于大多数任何程序都是有用且重要的,了解这些变量的内存在物理机器上的分配位置,而不是那么多。
-
"然后可以将其他一些对象添加到堆栈的顶部。" - 对象从不进入堆栈(在当前实现中,这是一个实现细节),所以...不是吗?
-
@Servy 但重要的是,当“堆栈”的这部分内存进入某些 CPU 缓存以加快对这些地址的访问时。所以不知道为什么 Jit 应该决定将所有内容分配在内存的同一部分(“堆”)中,而不是利用一些缓存策略。