所以我现在正在阅读关于光线追踪的内容,并希望为自己测试一些事情,看看我是否理解这些概念。我查找了如何从http://netpbm.sourceforge.net/doc/ppm.html编写一个简单的ppm文件。
我正在使用visual studio 2015并将每个像素的rgb值存储在2D数组中。图像的分辨率为720p,每个像素有3个整数,分别为红色,绿色和蓝色,因此我制作的数组看起来像double dblQuantitySold;
double dblAmountTotalDue;
double dblPrice = 99;
//Acquire the math.
dblQuantitySold = double.Parse(txtQuantity.Text);
dblAmountTotalDue = dblQuantitySold * dblPrice;
//Create the solution for your if-else statement.
if (dblQuantitySold >= 10)
{
dblAmountTotalDue -= dblQuantitySold * dblPrice * 0.05;
MessageBox.Show("A 5% discount will be given because 10 or more has been sold.");
}
else if (dblQuantitySold >= 20)
{
dblAmountTotalDue -= dblQuantitySold * dblPrice * 0.10;
MessageBox.Show("A 10% discount will be given because 20 or more has been sold.");
}
//Display the results.
lblAmountDueTotal.Text = dblAmountTotalDue.ToString("C");
。
我计算出内存的总使用量应该是4个字节(对于指向2D数组的指针)+ 720 * 1280 *(4 + 3 * 4)个字节(对于720 * 1280个指针,每个指针都指向一个数组3个整数),约为14mb。
当我检查visual studio中的内存使用情况时,它说它使用了大约60mb的内存。我想问的是额外的36 MB来自哪里?
的main.cpp
int[720*1280][3]
PPM.h
#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.cpp
#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);
答案 0 :(得分:0)
简而言之,当你要求一个记忆阻滞时,你通常得到的不仅仅是你所要求的。即使你不知道。
出现这种情况有几个原因。以下是其中一些:第一,对于性能:如果内存块沿某些边界对齐,则几个处理器将运行得更快,这意味着块地址是某个整数的倍数(通常是2的力量);第二,对于粒度,这意味着较低级别的软件(操作系统和您的程序的运行时库)更喜欢管理最小尺寸的块;内存本身的管理是第3位,这意味着较低级别的软件会在您的数据块中添加标题(前缀)和预告片(或后缀)。他们将拥有可以分配和释放这些数据块的信息,也许还有一些验证。
例如,分配的数据块的大小,指向下一个块的指针,以及标题和预告片的校验和,以确保它们不会被粗心或恶意程序损坏。