减少 malloc() 调用的次数

  • 本文关键字:调用 malloc 减少 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应该是什么样子以及为什么它应该工作。

与其让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

您正在尝试节省 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 .

最新更新