使用常量预定义大小(如缓冲区)存储运行时数据的最佳位置是:堆(malloc),堆栈(例如char buf[BUFSIZE]在函数内部)还是bss部分(char buf[BUFSIZE]在全局区域中)?
这取决于你想用缓冲区做什么.
通常应该避免全球化,你必须非常小心,不要忽视随之而来的问题.
如果仅在一个函数中需要缓冲区且BUFSIZE不是太大(最多几KB),则可以将其设置为本地缓冲区.但是,随着嵌套调用的加起来,请密切关注总堆栈使用情况.只有当您希望在调用之间保留值时才需要静态本地,从而有效地使其成为具有本地范围的全局.但是当你进行多线程或想要使用递归时,它会给你带来麻烦.
如果缓冲区用于函数调用或BUFSIZE非常大,则使用malloc()/ free().如果经常调用该函数,最好在函数外部分配一次,执行所有函数调用,然后释放它,而不是为每个函数调用分配和释放另一个缓冲区.但这接近于过早优化,因为它不必要地将函数的内部结构与外部调用者耦合.
从更大的角度来看,当你的程序增长时,你想要给它更多的结构并清楚地定义责任,尤其是.对于内存处理,否则你最终会失去跟踪.此缓冲区是具有特定任务的特定模块的工作详细信息.一种典型的方法是使用结构以OOP方式组织数据,使用create和destroy函数来分配和释放这样的对象.然后缓冲区可以是此结构的一部分.
struct s_foo
{
char buf[BUFSIZE];
...
};
struct s_foo *foo_create (...);
void foo_destroy (struct s_foo *foo);
void foo_action (struct s_foo *foo);
Run Code Online (Sandbox Code Playgroud)
这允许您并行拥有任意数量的foos,每个foos都有自己的缓冲区,彼此独立.另外,缓冲区内容保持在调用之间,而没有静态变量的麻烦.