更好地分配内存以提高灵活性和处理能力的方法

时间:2018-10-13 02:05:30

标签: c memory-management coding-style

不同的程序员有不同的编码风格。 我和同事们都在进行图像数据处理,我们有3种不同的方式。

同事1:

int IMAGE_WIDTH=1280;
int IMAGE_HEIGHT=800;

char* colleague1_way() //just allocate when he wants
{
char* mem = malloc(IMAGE_WIDTH*IMAGE_HEIGHT*2);
return mem;
}

int main(void)
{ 
    char* data;

    data=colleague1_way();
    function1(data); //pass by pointer
    function2(data); //pass by pointer
    function3(data); //pass by pointer

    free(data);
}

同事2:

int IMAGE_WIDTH=1280;
int IMAGE_HEIGHT=800;
char* data;    //set it as global memory

void colleague2_way()
{
data = malloc(IMAGE_WIDTH*IMAGE_HEIGHT*2);
}

int main(void)
{
    colleague2_way();

    function1(); //void input, proceed data inside function
    function2(); //void input, proceed data inside function
    function3(); //void input, proceed data inside function

    free(data);        
}

我:

int IMAGE_WIDTH=1280;
int IMAGE_HEIGHT=800;

int main(void)
{
    char* data = malloc(IMAGE_WIDTH*IMAGE_HEIGHT*2);

    function1(data); //pass by reference 
    function2(data); //pass by reference
    function3(data); //pass by reference

    free(data);        
}

我的想法是

  1. 我可以清楚地看到分配的内存,并在main()的末尾释放它。
  2. function1〜3可能在另一个cpp文件中,因此很容易处理。

任何人都可以给我评论,还有什么更好的方法吗? 另外,如果使用C ++,有什么好的方法吗?

2 个答案:

答案 0 :(得分:0)

我不知道为什么要堆内存但堆栈速度更快的细节。您的示例代码使您的程序看起来很小,所以我会做类似的事情:

#define IMAGE_WIDTH 1280
#define IMAGE_HEIGHT 800
#define PIXEL_DEPTH 2

int main(void)
{
    char data[IMAGE_WIDTH][IMAGE_HEIGHT][PIXEL_DEPTH] = {0};

    function1(data); //pass by reference 
    function2(data); //pass by reference
    function3(data); //pass by reference

}

这就像您的解决方案,但是您不必担心释放内存,并且可以更快地进行写入。就像您说的那样,不同的程序员有不同的解决方案,仅这就是我的两分钱。

答案 1 :(得分:0)

首先让我们谈谈“同事2”的方式:char指针data全局声明

在真正需要变量之前,应避免全局声明变量。在这里,我看不到任何全局声明data指针的原因。由于它对其他功能可见,因此它的范围扩大了,并且可能被其他不希望的代码部分意外地修改。

“同事1”和“我”的方式:
通过这两种方式,data指针的范围是有限的。但是,以“ Colleague1”方式,内存分配操作是另一个功能的一部分,这实际上很好,因为您可以在一个地方进行内存分配错误处理(在所有3方式中都缺少) 。考虑一种情况,您需要在代码的其他部分分配相同大小的内存,然后只需要调用此函数即可,而不必再次执行malloc。如果您确定不再需要分配相同大小的内存,则在这种情况下,“ Me”方式也可以。因此,从这两种方式中选择哪种方式都合适,但是请确保执行所需的错误处理。