2011-11-10 58 views
0

我正在測試一個矩陣,如果它在每一行都有一個素數。C#BigInteger和int如何保存內存?

MR表示它應該使用Miller Rabin算法。如果它的錯誤,它只是試圖除數到sqrt(n)。如果Vansor在每一個檢查過的行中都找到了一個素數,那麼它是真實的,如果vanoszlop在實際檢查過的行中找到了一個素數,則它是真實的。

我的問題是:只有在tryParse爲真時,才能通過不創建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; } 
    } 
+0

更好詢問是否會是明智的。答案是否定的。你正在談論2個局部變量,佔用的空間非常小。 BigInt的大部分只在分配時分配。 –

+3

你爲什麼要儘量節省內存?你有沒有發現這部分代碼消耗了太多的內存? – svick

+0

底部'MilRab()'和'Prim()'不應該使用'szambig'變量嗎? –

回答

0

我不是.Net的IL如何優化內存100%肯定,但一般當地的「值」類型(而不是「參考「類型)保存在堆棧中。 IE,你只能通過不實例化保存一個整數佔用的〜4個字節,並且只保存該一次調用的整個生命週期。一旦你退出該功能,堆棧被清除。

結構是「值」類型,並且也放置在堆棧上。它們根據需要爲所有其他值類型保留內存&引用指針。無論「簽名」是真還是假,BigInteger的大小都是相同的。

我想我真正的問題是:爲什麼記憶困擾?通過你的代碼示例,你將需要幾十個字節的內存,當方法退出時這些內存將全部釋放。

0

如果你設法做到這一點,充其量你最多可以節省16位字節BigInteger佔用64位模式(我猜)。

我很確定這不值得擔心。在這16個字節是重要的情況:

  1. 你可能不應該使用的.Net
  2. 你最有可能沒有.NET中可用反正