Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;动态数组大小_C++_Arrays_Memory - Fatal编程技术网

C++ C++;动态数组大小

C++ C++;动态数组大小,c++,arrays,memory,C++,Arrays,Memory,因此,我目前正在阅读有关光线跟踪的内容,并想为自己测试一些东西,看看我是否理解这些概念。我查阅了如何从中编写一个简单的ppm文件 我正在使用visual studio 2015并将每个像素的rgb值存储在2D阵列中。图像的分辨率是720p,每个像素有3个整数表示红、绿和蓝,所以我制作的数组看起来像int[720*1280][3] 我计算出内存的总使用量应该是4字节(对于指向2D数组的指针)+720*1280*(4+3*4)字节(对于每个指向具有3个整数的数组的720*1280指针),大约是14m

因此,我目前正在阅读有关光线跟踪的内容,并想为自己测试一些东西,看看我是否理解这些概念。我查阅了如何从中编写一个简单的ppm文件

我正在使用visual studio 2015并将每个像素的rgb值存储在2D阵列中。图像的分辨率是720p,每个像素有3个整数表示红、绿和蓝,所以我制作的数组看起来像
int[720*1280][3]

我计算出内存的总使用量应该是4字节(对于指向2D数组的指针)+720*1280*(4+3*4)字节(对于每个指向具有3个整数的数组的720*1280指针),大约是14mb

当我在VisualStudio中检查内存使用情况时,它说它使用了大约60mb的内存。我想问的是,额外的36MB是从哪里来的

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;
}
#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;
}
PPM.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;
}
#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;
}
#包括“PPM.h”
#包括
//将数据写入文件
void saveImage(字符*文件名、整数宽度、整数高度、整数**数据)
{
流文件的std::of;
打开(文件名);

简而言之,当你要求一个内存块时,你通常会得到比你要求的更多的东西,即使你不知道

出现这种情况有几个原因。以下是其中的一些原因:第一,性能方面:如果内存块沿某些边界对齐,则几个处理器的运行速度会更快,这意味着块地址是某个整数的倍数(通常是二的幂)第二,对于粒度,意味着较低级别的软件(操作系统和程序的运行库)更喜欢管理最小大小的块;第三,对于内存本身的管理,意味着较低级别的软件将添加头(前缀)和可能的尾(或后缀)到您的数据块。他们将拥有允许分配和释放这些数据块的信息,可能还有一些验证


例如,分配的数据块的大小、指向下一个块的指针以及头和尾的校验和,以确保它们不会被粗心或恶意的程序损坏。

我高度怀疑您的程序只声明一个变量。其次,您的计算不包括任何额外的开销,例如“保护字节”用于调试内存损坏和可能出现的任何填充字节。注释掉数组声明,然后查看内存使用情况。考虑到我的计算后,很抱歉,我认为内存使用情况应该低很多(应该是1280*720*16)+4,约14mb。目前该程序非常小,只有4个函数和几个整数,并声明了一个c字符串。我有一个主函数,一个函数分配数组,一个函数删除数组。最后一个函数只是使用和流将数据写入文件。我试着看看是否可以添加代码。谢谢回答。我有当你分配内存时有一些填充,但是我只希望它的字节数最多。也许它的ME计算是错误的,实际使用的内存量实际上更接近60字节。请考虑你的分配缓冲区程序。你分配了很多3-It数组。这有很多开销,对吧?是填充和标题(可能是拖车)对于每一个。也许你可以将它们转换成更大的内存块,并使用指针算法访问其各个组件。你认为如何?在阅读了你的评论后,我将缓冲区更改为1D数组,现在内存使用量下降到11MB左右。非常感谢。那么建议只使用1D ar吗如果可能的话,因为这会节省内存?我认为这是一个成本效益问题:如果您使用的资源稀缺,尝试另一种策略会有回报,即使是更复杂或费力的策略。否则,您可以选择更简单的方法来做事情。感谢您考虑这个想法。