减少malloc()调用的次数

时间:2017-10-08 22:10:56

标签: c

假设我有一个分配一块内存的程序

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 应该是什么样子以及为什么它应该有效。

4 个答案:

答案 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
    }
}

即。在这种情况下,您根本不需要mallocfree

答案 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