C#BigInteger和int如何保存内存?

时间:2011-11-10 16:45:49

标签: c# .net memory types

我正在测试一个矩阵,如果它在每一行都有一个素数。

MR意味着它应该使用Miller Rabin算法。如果它是假的,它只是尝试除数达到sqrt(n)。如果Vansor在每个检查行中找到一个素数,则为真,如果在实际检查的行中找到了素数,则vanoszlop为真。

我的问题是:只有在tryParse为true时才能通过不创建int和BigInteger值来保存内存吗?我的意思是

if (int.tryParse(akt, out new int szam))

这样的事情可能吗? (以及BigInteger未签名时会占用多少内存?)

    akt = Console.ReadLine();
    int szam; BigInteger szambig;

    if (int.TryParse(akt, out szam))
    {
       if (MR)  {
          if (MilRab(szam))
          { vansor = true; vanoszlop = true; } }

          else if (Prim(szam))
          { vansor = true; vanoszlop = true; }
    }
    else if (BigInteger.TryParse(akt, out szambig))
    {
       if (MR) {
          if (MilRab(szam))
          { vansor = true; vanoszlop = true; } }

       else if (Prim(szam))
       { vansor = true; vanoszlop = true; }
    }

2 个答案:

答案 0 :(得分:0)

我不是百分之百地确定.Net IL如何优化内存,但通常是本地"值"类型(而不是"引用"类型)保留在堆栈中。 IE,你只需要通过不实例化它来保存整数占用的~4个字节,并且只保存那个调用的生命周期。退出函数后,堆栈将被清除。

结构是"价值"类型,也放在堆栈上。他们为所有其他价值类型保留记忆。根据需要引用指针。无论是否"签名" BigInteger的大小都是相同的。是真还是假。

我想我真正的问题是:为什么记忆会被困扰?使用您拥有的代码示例,您将占用几十个字节的内存,当方法退出时,这些内存将被释放。

答案 1 :(得分:0)

如果你设法做到了,最多可以节省BigInteger在64位模式下占用的16个字节(我猜)。

我很确定这不值得担心。在这16个字节很重要的情况下:

  1. 你可能不应该使用.Net
  2. 你很可能没有.Net可用