2014-02-18 73 views
0

代碼摘要:在3d數組中存儲超過1600萬個uint8_t作爲指向那些uint8_t的指針。C++中的手動內存管理

代碼有效,但爲什麼我只使用uint8_t而不是int保存4 KB。我運行這個相同的代碼,它使用330,488K的int,但使用uint8_t它使用330,484。我知道大部分是指針,但不應該(假設每個int使用最小空間)將每個1600萬個整數的大小從2個字節減少到1個字節,節省了超過4k個?我認爲它應該已經保存到接近16 MB了嗎?

通過「運行相同的代碼與整數」我從字面上做一個「查找和替換:uint8_t與int」然後重新編譯。

uint8_t**** num3d; 
num3d = new uint8_t***[256]; 
for(int i=0;i<256;i++){ 
    num3d[i] = new uint8_t**[256]; 
    for(int j=0;j<256;j++){ 
     num3d[i][j] = new uint8_t*[256]; 
    } 
} 

// Initialize 
uint8_t *B; 
for(int lx = 0;lx<256;lx++){ 
    for(int ly= 0;ly<256;ly++){ 
     for(int lz=0;lz<256;lz++){ 

      if(ly == 0 || lx == 0 || lz == 0 || ly == 255 || lx == 255 || lz == 255){ 
       B = new uint8_t(2); 
       num3d[lx][ly][lz] = B; 
       continue; 
      } 
      if(ly < 60){ 
       B = new uint8_t(1); 
       num3d[lx][ly][lz] = B; 
       continue; 
      } 
      B = new uint8_t(0); 
      num3d[lx][ly][lz] = B; 

     } // inner inner loop 

    } // inner loop 

} // outer loop 
+8

我剛看到這個,並且被這個'uint8_t **** num3d;'o_o – Netwave

+1

_'...驚奇,我知道他們必須將內存管理包含在uint8_t未包含的正常整數中。 ...'_你的2個問題中的大多數都是以某種方式寫的,我根本無法推斷出你真正的問題是什麼(我很確定這些問題是你要求的)。 –

+2

兩個字:封裝和抽象。 *那是你必須學習的東西。然後內存管理自己。 –

回答

0

「我的問題是關於int的問題,它允許它使用完整的32位整數工作,並且我將如何複製程序已經使用的整數與8位整數一起使用,我知道它們必須包含內存管理轉換成未包含在uint8_t中的正常整數「。

那麼,int至少 16位,32位甚至沒有保證。但忽略這一點,事實是每個整型都有一定的範圍。 std::numeric_limits<int><uint_8>會告訴你各自的範圍。很明顯,你不能使用8位數字來計數從0到256.你只能計數到255.

此外,沒有內存管理根本沒有int和其他簡單類型如uint_8。編譯器只是說:「名稱爲Foo的整數存儲在這些字節中」就是這樣。不需要管理。有一些小的變化,例如一個結構的成員int被「存儲在結構的這些字節中」等等。

+0

嗯好吧然後有一個記憶洞我失蹤後固定循環? –

+0

對不起,我必須快速編輯一個愚蠢的評論,我在5分鐘之前就做出了評論,所以我選擇了上面的說法。現在由於某種原因,我在運行此代碼時使用了循環的ints和指向uint8_t的指針作爲數組類型,但是當我運行完全相同的代碼時,我有一個內存空洞(我在整個塊上執行「find and replace」並將uint8_t更改爲int)boom:沒有內存孔。 –

+0

Theres現在沒有使用int8_t和int的內存空間,但爲什麼使用int8_t只能在存儲1600萬個int時比int節省4KB?假設每個int只存儲了2個字節,它不應該保存更接近16 MB? –

3

回答問題1)...這個循環去到永遠

for (uint8_t i=0;i<256;i++) 

事實上它可以是由uint8_t表示的數的範圍爲0...255。所以在這裏不要使用uint8_t

在我看來,既然你的計算機正在分配這個循環,它將最終吃掉所有的內存,因此問題2)沒有任何意義。

+2

它也導致大量的內存泄漏(因爲每次迭代都分配內存......永遠不會被刪除,但指向它會在下一次迭代中更改爲新分配)。這是什麼導致他耗盡記憶(我相信這是回答#2)。 –

+0

啊,謝謝!我也想出了最好的辦法是在循環之前定義變量,然後刪除它,而不是循環創建它。問題1解決了。 –