>假设我有一个分配内存块的程序
char* get_date() {
char* date = malloc(100);
return date;
}
我想在主函数中调用该函数相当多的次数。
int main() {
int i;
for (i = 0; i < 10000; i++) {
char *c = get_date();
//do something
free(c);
}
return 1;
}
如何减少分配新内存块的次数,只分配一个内存块并在之后覆盖它?有人告诉我这样的事情:
char *date = malloc(100);
for (i = 0; i < 10000; i++) {
char *c = get_date(date):
//do something
}
free(date);
但我不确定新功能、get_date应该是什么样子以及为什么它应该工作。
与其让get_date
返回一个指向包含函数生成的数据的缓冲区的指针,不如让它采用一个指向将写入数据的缓冲区的指针。 即get_date
的原型可以是这样的
void get_date(char *buf);
但是,对于 get_date() 来说,不仅能够告诉缓冲区的起始地址,而且能够告诉缓冲区的大小可能很有用。那边 该函数可以判断给定的缓冲区是否太小(然后返回例如指示错误代码的int
)。因此,原型
int get_date(char *buf, size_t len);
在实践中可能更有用。
在呼叫者端,您可以使用例如
char date[100];
for (i = 0; i < 10000; i++) {
// return value 0 means success
if (get_date(date, sizeof date) == 0) {
//do something
}
}
也就是说,在这种情况下,您根本不需要malloc
或free
。
您正在尝试节省 10,000 个 malloc/免费电话?
在更改代码之前,请测量所需的时间。如果你懒得测量它,那么速度并不重要,所以不要改变它。
100 字节? 你为什么要使用malloc()
?
for (i = 0; i < 10000; i++) {
char c[100]:
//do something
}
如果你有一个返回临时固定大小内存的函数,则内存可以是静态的:
thread_local char get_date_buffer [100];
char* get_date() {
// change get_date_buffer...
return get_date_buffer;
};
不能释放返回值,必须在重用和调用函数时复制数据。许多 API 函数都使用这种技术,例如 glGetString
.