gpt4 book ai didi

c - C 中堆分配字符串的替代方案(具有较长的生命周期)

转载 作者:太空宇宙 更新时间:2023-11-04 04:50:07 24 4
gpt4 key购买 nike

是否可以在 C 程序中使用“临时字符串对象”?

例如,我有一个相当大的 char * 对象数组(结构的一部分),它们当前正在使用堆分配的内存。我有机会减少我的程序的内存使用量,因为这些名称中的大多数都可以在不使用显式字符数组的情况下确定(尽管并非所有名称都可以)。

在 C++ 中,我将简单地创建一个返回 std::string 对象(按值)的 API 并完成它。在 C 中,我无法想出令我兴奋的解决方案。有什么建议吗?


根据要求,这里有一些代码:

struct FOO {
char *name;
...
};

extern FOO* global_foo_array; /* in .h file */

void setup_foo(void) {
int i;
global_foo_array = (FOO*) malloc ( get_num_foo() * sizeof(FOO) );

for (i = 0; i < get_num_foo_with_complex_name(); ++i) {
global_foo_array.name[i] = malloc ( ... );
}

for (i = get_num_foo_with_complex_name(); i < get_num_foo(); ++i) {
char buf[100];
sprintf( buf, "foo #%d", i );
global_foo_array[i].name = strdup( buf );
}
}

get_num_foo() 比 get_num_foo_with_complex_name() 大约大 100-1000 倍。在大多数情况下,该程序将“global_foo_array[].name”视为只读。

我看到这里节省了不可忽略的内存,我想知道什么是实现这种节省、平衡人力投资的最佳方式。

最佳答案

如果您实际上不需要所有字符串,显而易见的选择是按需创建它们:

struct FOO {
char *name;
...
};

static FOO* global_foo_array; /* NOT in .h file */

void setup_foo(void) {
int i;
global_foo_array = (FOO*) malloc ( get_num_foo() * sizeof(FOO) );
memset(global_foo_array, 0, get_num_foo() * sizeof(FOO) );
}

FOO *get_foo(int i) {
if (i < 0 || i > get_num_foo())
return 0;
if (!global_foo_array[i].name) {
if (i < get_num_foo_with_complex_name()) {
global_foo_array.name[i] = malloc ( ... );
} else {
char buf[32];
sprintf( buf, "foo #%d", i );
global_foo_array[i].name = strdup( buf );
}
}
return &global_foo_array[i];
}

这仍然会浪费您不需要的所有 FOO 对象的空间。如果它们很大,最好使用 static FOO **global_foo_array(额外的间接级别),并按需分配它们。

关于c - C 中堆分配字符串的替代方案(具有较长的生命周期),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16376250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com