C ++中的堆栈或堆的全局内存管理?

如果我在C ++应用程序中全局声明数据结构,它会消耗堆栈内存还是堆内存?

例如

struct AAA
{

.../.../.
../../..
}arr[59652323];

由于我对答案不满意,并希望同一个karjatkar想要学习的不仅仅是一个简单的是/否的答案,在这里你去。

通常一个进程分配了5个不同的内存区域

  • 代码 - 文本段
  • 初始化数据 - 数据段
  • 未初始化的数据 - bss段
  • 如果你真的想知道什么是保存在哪里然后阅读和书签这些:

    编译器,汇编器,链接器和装载器:简要说明(请参阅表w.5)

    记忆中的程序剖析

    替代文字http://www.tenouk.com/ModuleW_files/ccompilerlinker006.png


    问题在于这个问题。 假设你已经有了一个小C(++以及它们以相同的方式处理)程序如下:

    /* my.c */
    
    char * str = "Your dog has fleas.";  /* 1 */
    char * buf0 ;                         /* 2 */
    
    int main(){
        char * str2 = "Don't make fun of my dog." ;  /* 3 */
        static char * str3 = str;         /* 4 */
        char * buf1 ;                     /* 5 */
        buf0 = malloc(BUFSIZ);            /* 6 */
        buf1 = malloc(BUFSIZ);            /* 7 */
    
        return 0;
    }
    
  • 这不是在堆上的NOR堆中分配的。 相反,它被分配为静态数据,并将其放入大多数现代机器的内存段中。 实际的字符串也被分配为静态数据,并放入正确思维机器中的只读段。
  • 只是一个静态分配的指针; 一个地址的空间,静态数据。
  • 将指针分配在堆栈上,并在main返回时有效地释放。 该字符串,因为它是一个常量,所以与其他字符串一起被分配在静态数据空间中。
  • 实际上的分配方式与2完全相同。 static关键字告诉你它不会被分配到堆栈上。
  • ...但buf1在堆栈上,并且
  • ... malloc的缓冲空间在堆上。
  • 顺便说一句,孩子们不要在家里尝试。 malloc具有感兴趣的返回值; 你应该总是检查返回值。
  • 例如:

    char * bfr;
    if((bfr = malloc(SIZE)) == NULL){
       /* malloc failed OMG */
       exit(-1);
    }
    

    通常它不会消耗。 它试图将它们分配到一个内存段中,该段很可能在程序执行时保持不变。 它可能是bss,堆栈,堆或数据。

    链接地址: http://www.djcxy.com/p/79079.html

    上一篇: Global memory management in C++ in stack or heap?

    下一篇: Android Paint stroke width positioning