C++ 需要什么,本地静态变量在编译时分配内存?

C++ 需要什么,本地静态变量在编译时分配内存?,c++,c,C++,C,我正在学习C语言中的静态变量,并了解到静态变量的内存是在编译时分配的(必须分配多少内存,其虚拟地址是在编译时计算的,实际内存是在程序加载时分配的)在数据段/.bss中,取决于是否初始化 我在一些网站帖子中看到,由于对象/变量的大小是根据变量类型预定义的,所以内存是在编译时分配的。但是我不理解在函数中定义的局部静态变量,其范围仅在函数中时需要这样做 考虑以下代码段: void func() { static int i; /*some logic*/ } void func1(

我正在学习C语言中的
静态
变量,并了解到
静态
变量的内存是在编译时分配的(必须分配多少内存,其虚拟地址是在编译时计算的,实际内存是在程序加载时分配的)在数据段/.bss中,取决于是否初始化

我在一些网站帖子中看到,由于对象/变量的大小是根据变量类型预定义的,所以内存是在编译时分配的。但是我不理解在函数中定义的局部
静态
变量,其范围仅在函数中时需要这样做

考虑以下代码段:

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
,但是一旦程序加载了(从我学到的)实际上没有使用的
静态变量,这些函数中的
内存就会分配。因此,有了这个缺点,为本地
静态
变量分配内存有什么用呢。为什么编译器在执行函数时不能在数据段中为它们分配内存

我已经讨论了有关此问题的堆栈溢出问题,但无法得到确切答案
请帮忙

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

这是一种时空权衡——在第一次调用期间初始化它需要每次调用函数时都必须执行的代码。当程序加载时初始化它意味着它的初始化是作为从可执行文件的文本段到内存的数据段的块拷贝的一部分完成的,同时还有全局静态

<>参见C++本地静态变量的更复杂的情况。在C++中,我可能会使用静态的<代码> STD::数组< /C>,在输入函数之前,我不认为它会被初始化。 如果在一个很少调用的函数中有一个大数组,并且不想为它浪费内存,请使用静态指针而不是静态数组,然后自己初始化它

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;
        }
    }
    ...
}
void func1(){
静态int*数据;
如果(!data){//如果是多线程,则需要使用互斥锁来保护它
数据=malloc(N*sizeof(int));
对于(int i=0;i

这是编译器第一次初始化数组时必须生成的代码。

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

这是一种时空权衡——在第一次调用期间初始化它需要每次调用函数时都必须执行的代码。当程序加载时初始化它意味着它的初始化是作为从可执行文件的文本段到内存的数据段的块拷贝的一部分完成的,同时还有全局静态

<>参见C++本地静态变量的更复杂的情况。在C++中,我可能会使用静态的<代码> STD::数组< /C>,在输入函数之前,我不认为它会被初始化。 如果在一个很少调用的函数中有一个大数组,并且不想为它浪费内存,请使用静态指针而不是静态数组,然后自己初始化它

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;
        }
    }
    ...
}
void func1(){
静态int*数据;
如果(!data){//如果是多线程,则需要使用互斥锁来保护它
数据=malloc(N*sizeof(int));
对于(int i=0;i

这是编译器第一次初始化数组时必须生成的代码。

“有这个缺点”-什么缺点?如果编译器必须按照您的建议执行,那么它必须动态分配变量,这意味着它们需要作为指针来实现。尝试使用优化进行编译,您可能会发现这些分配从未发生过。“我没有优化代码”-当然,这将是浪费。这就是启用编译器优化的全部要点,使其尽可能地消除(内存和操作)浪费
c
c++
?选择一个。@InfiniteLop当人们谈论优化的构建时,他们指的是发布的构建(Visual Studio的术语),而不是调试。它们通常并不意味着告诉您手动调整代码。“有这个缺点”-什么缺点?如果编译器必须按照您的建议执行,那么它必须动态分配变量,这意味着它们需要作为指针来实现。尝试使用优化进行编译,您可能会发现这些分配从未发生过。“我没有优化代码”-当然,这将是浪费。这就是启用编译器优化的全部要点,使其尽可能地消除(内存和操作)浪费
c
c++
?选择一个。@InfiniteLop当人们谈论优化的构建时,他们指的是发布的构建(Visual Studio的术语),而不是调试。它们通常并不意味着告诉您手动调整代码。这就是我所读到的,但是如果这些函数甚至没有被调用,它会带来什么好处呢