所以我目前正在閱讀的光線追蹤,想考出了幾件事情我自己,看看我理解的概念。我查了一下如何從http://netpbm.sourceforge.net/doc/ppm.html寫一個簡單的ppm文件。C++動態數組的大小
我使用視覺工作室2015和存儲的RGB值中的2D陣列的每個像素。圖像的分辨率是720p,每個像素有3個整數用於紅色,綠色和藍色,所以我製作的陣列看起來像int[720*1280][3]
。
我計算出內存的總使用量應該是4字節(對於指向2D數組的指針)+ 720 * 1280 *(4 + 3 * 4)字節(對於指向數組的720 * 1280指針有3個整數),大約14mb。
當我檢查在Visual Studio中的內存使用它說,它採用左右的內存60MB。我想問的是額外的36 MB來自哪裏?
的main.cpp
#include <iostream>
#include "PPM.h"
int main(int argc, char **argv)
{
// WIDTH AND HEIGHT OF THE IMAGE
const int width = 1280;
const int height = 720;
// 3 RGB VALUES FOR EACH PIXEL
const int rgb = 3;
// CREATE A BUFFER TO HOLD THE DATA
int **data = allocateBuffer(width, height, rgb);
// FILL IN THE BUFFER
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
data[y*width + x][0] = x %255;
data[y*width + x][1] = y %255;
data[y*width + x][2] = 0;
}
}
// WRITE THE DATA TO A FILE
saveImage("Test.ppm", width, height, data);
// DELETE THE BUFFER
deleteBuffer(data, width*height);
// WAIT FOR INPUT TO EXIT
std::cout << "Press ENTER key to exit\n";
std::getchar();
return 0;
}
PPM.h
#pragma once
// WRITES THE DATA TO THE FILE
extern void saveImage(char *filename, int width, int height, int **data);
// CREATES A BUFFER TO HOLD THE DATA
extern int** allocateBuffer(int width, int height, int rgbAmnt);
// RELEASES THE MEMORY
extern void deleteBuffer(int **buffer, int size);
PPM.cpp
#include "PPM.h"
#include <fstream>
// WRITES THE DATA TO THE FILE
void saveImage(char *filename, int width, int height, int **data)
{
std::ofstream file;
file.open(filename);
file << "P3" << "\n" << width << " " << height << "\n255\n";
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
file << data[y*width + x][0] << " " << data[y*width + x][1] << " " << data[y*width + x][2] << "\n";
}
}
file.close();
}
// CREATES A BUFFER TO HOLD THE DATA
int** allocateBuffer(int width, int height, int rgbAmnt)
{
int size = width * height;
int **data = new int*[size];
for (int i = 0; i < size; i++)
{
data[i] = new int[rgbAmnt];
}
return data;
}
// RELEASE THE MEMORY
void deleteBuffer(int **buffer, int size)
{
for (int i = 0; i < size; i++)
{
delete[] buffer[i];
}
delete[] buffer;
}
我非常懷疑你的程序只聲明一個變量。其次,您的計算不包括用於調試內存損壞和任何可能發生的填充字節的「guard字節」之類的任何額外開銷。 – PaulMcKenzie
註釋掉數組聲明,然後查看內存使用情況。 – Barmar
在考慮我的計算後,我覺得內存使用量應該低得多(應該是1280 * 720 * 16)+ 4,大概是14mb。該計劃非常小巧,只有4個函數,聲明瞭幾個int和一個c-string。我有一個主函數,1個函數分配數組和一個函數來刪除它。最後一個函數只是將數據寫入文件using和ofstream。我試着看看我是否可以添加代碼。 –