有什么需要,本地静态变量在编译期间分配内存?

inf*_*oop 0 c c++

我正在学习staticC中的变量,并且知道static变量的内存是在编译时分配的(在编译期间需要分配多少内存并且在编译时计算其虚拟地址,在程序加载时分配实际内存)在任一数据中segment/.bss取决于是否已初始化

我在一些网站帖子中看到,由于对象/变量将采用的大小是基于变量类型预定义的,因此内存在编译时分配.但是,如果局部static变量在函数中定义且其范围仅在函数内,我不理解这种情况的必要性.

请考虑以下代码段:

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()*/
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,函数funcfunc1没有在程序中调用,但是static一旦程序加载(从我学到的)实际上没有使用,就会分配这些函数中的变量的内存.因此,有了这个缺点,为局部static变量分配内存的用途是什么.为什么编译器在通过函数时不能在数据段中为它们分配内存.

我已经经历了关于此的堆栈溢出问题,无法得到确切的答案 请帮助!

Bar*_*mar 5

在编译时分配和初始化存储器意味着程序不必跟踪函数是否已经输入并且变量已经初始化.具有常量初始值的局部静态变量与全局变量基本相同,只是名称仅在该函数的范围内.

这是一个时空权衡 - 在第一次调用期间初始化它需要每次调用函数时都必须执行的代码.在程序加载时初始化它意味着它的初始化是作为从可执行文件段到内存数据段的块复制的一部分以及全局静态完成的.

请参阅C++函数中静态变量的生命周期是多少?对于更复杂的C++本地静态变量的情况.在C++中,我可能会使用静态std::array,我认为在输入函数之前不会对其进行初始化.

如果在一个很少被调用的函数中有一个大数组,并且您不想为它浪费内存,请使用静态指针而不是静态数组,并自己初始化它.

void func1() {
    static int *data;

    if (!data) { // Need to protect this with a mutex if multi-threading
        data = malloc(N * sizeof(int));
        for (int i = 0; i < N; i++) {
            data[i] = i;
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是编译器为了首次初始化数组而必须生成的代码.