【问题标题】:Stack manipulation in .net.net 中的堆栈操作
【发布时间】: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 应该决定将所有内容分配在内存的同一部分(“堆”)中,而不是利用一些缓存策略。

标签: c# memory stack


【解决方案1】:

访问堆栈的不同部分没有性能差异。更改值不涉及推送或弹出。直接访问内存位置,即使它位于堆栈上。堆栈只是内存,就像其他任何东西一样。变量与内存地址相关联,该内存地址用于读取或写入值。

【讨论】:

  • "访问堆栈的不同部分没有性能差异。" - 哦,可能有 - 当 CPU 缓存发挥作用时等;但是,问题中的代码不应该是这种情况,尤其是因为我希望当地人能够注册
  • 所以CPU并没有将这部分内存用作“堆栈”,而是直接根据内存地址取值,但是存储在这部分内存中的变量仍然是顺序的,可以帮助删除方法返回后栈顶的变量,对吧?
  • @Oleksandr,正如我所说,“堆栈”在内存寻址方面并不特殊。它只是记忆的另一部分。所有内存都以相同的方式寻址。每个字节都有一个可以直接访问的地址。
猜你喜欢
  • 2012-10-07
  • 2010-10-12
  • 1970-01-01
  • 2011-09-16
  • 2011-05-04
  • 1970-01-01
  • 2012-03-31
  • 2014-05-27
  • 2020-09-26
相关资源
最近更新 更多