【发布时间】:2017-11-23 11:36:01
【问题描述】:
我正在学习 C 中的 static 变量,并知道 static 变量的内存是在编译时分配的(必须分配多少内存,它的虚拟地址在编译时和实际内存中计算在程序加载时分配)在任一数据段/.bss 中取决于是否初始化
我在一些网站帖子中看到,由于对象/变量将采用的大小是根据变量类型预定义的,因此内存是在编译时分配的。但是我不明白在函数中定义的本地 static 变量并且其范围仅在函数内的情况下需要这样做。
考虑以下代码sn-p:
void func()
{
static int i;
/*some logic*/
}
void func1()
{
static int data[10] = {1,2,3,4,5,6,7,8,9,10};
/*some logic*/
}
int main()
{
/*logic not involving func() and func1()*/
}
在这种情况下,函数func 和func1 根本不会在程序中调用,但是这些函数中的static 变量的内存会在程序加载后立即分配(从什么我学到了)实际上没有使用。因此,有了这个缺点,为本地 static 变量分配内存有什么用。为什么编译器在经过函数的时候不能在数据段中为它们分配内存。
我已经解决了有关此问题的堆栈溢出问题,但无法得到确切答案 请帮忙!!!
【问题讨论】:
-
“有这个缺点” - 什么缺点?如果编译器必须按照您的建议进行操作,则必须动态分配变量,这意味着它们需要以指针的形式实现。
-
尝试使用优化进行编译,您可能会发现这些分配永远不会发生。
-
“我没有优化代码”——那当然会很浪费。这就是打开编译器优化的全部意义所在,以使其尽可能多地消除浪费(在内存和操作中)
-
c或c++?选择一个。 -
@infiniteloop 当人们谈论优化构建时,他们指的是为发布(Visual Studio 的术语)而不是调试而构建。它们通常并不是要告诉您手动调整代码。