-2

假设下面的代码:

Class test
{
   void foo()
   {
      int i=0;
   }
}

Test t=new Test();
// if many threads call t.foo();

每个线程都有自己的内存来调用 foo 吗?这意味着每个线程都有自己的i

Java/C#在调用函数时如何分配内存?我记得,在 C# 中,每个线程将分配 1M 内存。爪哇呢?

4

2 回答 2

0

单线程和多线程应用程序之间的内存分配基本上没有区别(至少在 .Net/Windows 世界中)。

在堆(普通对象)或堆栈(用于局部变量/局部结构/函数参数)中分配的内存。C# 应用程序(和大多数 Windows 应用程序)的默认堆栈大小是每个线程 1Mb,但堆在所有线程之间共享。

于 2013-03-15T04:13:16.410 回答
0

在您为 C# 描述的场景中会发生什么(不确定 Java,但我相信它的行为会相似)是值 i 将存储在短期存储中(堆栈或寄存器取决于 JIT 想要做什么) . 这是因为它是一个值类型。如果它是一个引用类型,那么它很可能会在堆上。

每次调用函数时(不管线程如何),函数都会获得变量 i 的新实例。因此,哪个线程或多少个线程并不重要,只需要对该函数进行多少次调用。

需要注意的一件事是,您不能总是保证某些东西将被分配到哪里,而且在大多数情况下您不应该关心。只要不影响事件的单线程视图和程序的功能,JIT/CLR 就可以做它想做的任何事情(存在边缘情况,但对于 99% 的代码,此语句是正确的)。

您还可以阅读 Eric Lippert 对这个问题的回答(类字段,它们是存储在堆栈还是堆中?)以及他的博客(http://blogs.msdn.com/b/ericlippert/)以更好地理解并且(http://ericlippert.com/)他已经多次详细讨论过这个问题。

于 2013-03-15T04:34:27.657 回答