假设我有一个分配一块内存的程序
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 应该是什么样子以及为什么它应该有效。
答案 0 :(得分:1)
您正试图节省10,000个malloc /免费电话?
在更改代码之前,请测量所需的时间。如果你懒得测量它,那么速度并不重要,所以不要改变它。
答案 1 :(得分:1)
不是让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
。
答案 2 :(得分:0)
100个字节?你为什么一直使用for (i = 0; i < 10000; i++) {
char c[100]:
//do something
}
?
plt.plot
答案 3 :(得分:-1)
如果你有一个返回临时固定大小内存的函数,那么内存可以是静态的:
thread_local char get_date_buffer [100];
char* get_date() {
// change get_date_buffer...
return get_date_buffer;
};
您不能释放返回值,并且必须在重新使用数据并调用该功能时复制数据。许多api函数使用这种技术,如glGetString
。