繁体   English   中英

重新初始化动态分配 memory

[英]Reinitialize dynamically allocated memory

我在使用的开头动态分配 memory:

Candset_t* emptycandset(void) {
    Candset_t* cset;

    cset = (Candset_t*)malloc(sizeof(Candset_t));
    cset->size = 0;
    cset->maxsize = MAXSIZE;
    cset->dptr = (Point_t*)malloc(MAXSIZE * sizeof(Point_t));

    return cset;
}

其中 Candset 和 Point_t 都是 typedef。 后来我在循环结束时释放了 memory:

void destroycandset(Candset_t* cset) {
    free(cset->dptr);
    free(cset);
}

我这样做的原因是因为我想在循环的所有迭代中重用相同的变量(内存空间)。 这实际上会导致堆碎片化。 因此,性能下降。 我该如何解决这个问题? 是否可以重新启动动态分配的空间? 这对动态 memory 有何影响? 干杯

我正在尝试重用动态分配的 memory。但是,使用 malloc 和免费导致堆碎片。 你知道有什么方法可以避免 memory 碎片吗?

typedef struct point {
    double x, y;
    unsigned int dst;
} Point_t;
    
typedef struct candset {
    unsigned int size;
    unsigned int maxsize;
    Point_t* dptr;
} Candset_t;

这就是结构数据的样子。

我不知道dptrCandset_t的大小是多少; 因此,我必须动态分配它们。 仅对 c++ 使用newdelete时没有区别。

对于小于 1 MB 且生命周期简单的结构,根本不要使用动态分配。

只需在自动存储中(在堆栈上)创建一个Candset_t

自动存储提供 memory 极其高效。

如果你的 object 足够“简单”到 malloc-and-modify,它也可以在自动存储中自由创建。

有些人习惯了 Java 或 C# 这样的语言,而创建 object 本身就很昂贵。

在 C++ 中,创建一个 object 可以完全免费。 它也可能很昂贵。 贵多少取决于object的属性。

因为 C++ 中的对象携带的行李比垃圾收集语言中的少,所以“免费”的情况真的非常免费。

要使 object 有效地免费使用,请确保它在构造时不使用动态分配的 memory,并且要特别确保避免虚函数(有时这些也是免费的)。 接下来,不要使用newmalloc来创建它。

这是一个简单的“免费”class:

struct Candset_t {
  std::size_t size;
  Point_t data[MAXSIZE];
};

只要 MAXSIZE 不是很大,就像在许多 1000 中那样,这将是一个比原始计划更好的计划。

如果这不起作用,那么您可以将Candset_t的声明向上移动 scope,然后重新使用它。 您不想重新分配dptr ,而是编写代码来清除其中的 memory 。

通常,拨打mallocnew电话需要 100 倍或更多的时间,这是典型的 C++ 代码行的时间。 所以要避免它们陷入紧密的循环中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM