【问题标题】:Better way to allocate memory for flexibility and handle更好的方式来分配内存以获得灵活性和处理
【发布时间】:2018-10-13 02:05:30
【问题描述】:

不同的程序员有不同的编码风格。 我和同事正在研究图像数据处理,我们有 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++,有什么好的方法吗?

【问题讨论】:

  • 你发布的是C代码。你是用 C++ 编译器编译这个吗? Edit您标记为仅使用正确的语言,因为两种语言的答案会有所不同。
  • 1) 避免在colleague2_way() 中使用全局data 2) 检查分配是否成功。 3) 使用信息更丰富的函数名称。 4) 分配函数 colleagueN_way() 值得释放配对函数 colleagueN_unway() 5) 避免用应用程序细节填充 main() 6) 考虑使用 codereview 对更多扩展代码进行此类审查。

标签: c memory-management coding-style


【解决方案1】:

我不知道为什么你想要堆内存但堆栈更快的细节。您的示例代码使您的程序看起来很小,所以我会这样做:

#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和3在堆栈上有char *,2在数据段中有char *,它们本质上是相同的。你问是否有更好的方法,让内存在堆栈上分配在速度方面更好。希望这会有所帮助。
  • 从我的许多编程老师那里,他们避免以静态方式分配如此连续和大的区域。 (该程序的图像大小将来可能会变大)对于小区域,您的方式是直截了当的。
  • @okeyla 为什么?我不明白为什么堆栈上的 2MB 是不好的。你不会用堆内存“获得”内存,因为程序无论如何都存在于 ram 中,我在这里看不到收益。
  • @JohnKugelman 感谢约翰的链接,读起来很有趣。我仍然不明白为什么人们认为它会增加堆栈溢出的机会。我脑子里有这个内存模型codingfreak.blogspot.com/2012/03/…,这让我认为堆栈/堆在 ram 中使用相同的内存。我的意思是,如果你把它放在堆栈上而不是堆上的 2MB,那么实际剩下的内存(直到它们发生冲突)是一样的,对吧?如果您有 8MB 堆栈并分配 2MB 堆,从堆栈内存中减去它,现在您有 6MB 堆栈,对吗?
【解决方案2】:

首先说一下“Colleague2”方式:char指针data全局声明

在真正需要之前,您应该避免全局声明变量。在这里,我看不出有任何理由在全局范围内声明 data 指针。由于它对其他函数可见,因此它的范围增加了,并且可能会被其他不希望的代码部分意外修改。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多