[英]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;
这就是结构数据的样子。
我不知道dptr
和Candset_t
的大小是多少; 因此,我必须动态分配它们。 仅对 c++ 使用new
和delete
时没有区别。
对于小于 1 MB 且生命周期简单的结构,根本不要使用动态分配。
只需在自动存储中(在堆栈上)创建一个Candset_t
。
自动存储提供 memory 极其高效。
如果你的 object 足够“简单”到 malloc-and-modify,它也可以在自动存储中自由创建。
有些人习惯了 Java 或 C# 这样的语言,而创建 object 本身就很昂贵。
在 C++ 中,创建一个 object 可以完全免费。 它也可能很昂贵。 贵多少取决于object的属性。
因为 C++ 中的对象携带的行李比垃圾收集语言中的少,所以“免费”的情况真的非常免费。
要使 object 有效地免费使用,请确保它在构造时不使用动态分配的 memory,并且要特别确保避免虚函数(有时这些也是免费的)。 接下来,不要使用new
或malloc
来创建它。
这是一个简单的“免费”class:
struct Candset_t {
std::size_t size;
Point_t data[MAXSIZE];
};
只要 MAXSIZE 不是很大,就像在许多 1000 中那样,这将是一个比原始计划更好的计划。
如果这不起作用,那么您可以将Candset_t
的声明向上移动 scope,然后重新使用它。 您不想重新分配dptr
,而是编写代码来清除其中的 memory 。
通常,拨打malloc
或new
电话需要 100 倍或更多的时间,这是典型的 C++ 代码行的时间。 所以要避免它们陷入紧密的循环中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.