堆栈上的分配顺序

Posted

技术标签:

【中文标题】堆栈上的分配顺序【英文标题】:Allocation order on the stack 【发布时间】:2010-12-23 11:04:03 【问题描述】:

我正在运行这个 C 代码

#define STACKSIZE       65536    

            char d[STACKSIZE];
            if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) 
                 Printf ("Stack space reservation failed\n");
                 Exit ();
             

            printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d));

            auto int a = 3;
            printf("Now the stack pointer is on %d\n",&a);

我得到输出 从 -4262832 分配到 -4197296 所以为 65536 字节 现在堆栈指针在 -4262836

这意味着变量“a”在数组之后被放入堆栈。 但是,如果我使用可变长度数组(一个长度在运行时设置的数组),我会得到相反的行为:a 被放在数组之前的堆栈中。

这是代码(它是相同的,但数组的大小是在运行时设置的)

 #define STACKSIZE       65536    

            int i = 1;
            char d[i*STACKSIZE];
            if (((int) &d[STACKSIZE-1]) - ((int) &d[0]) + 1 != STACKSIZE) 
                 Printf ("Stack space reservation failed\n");
                 Exit ();
             

            printf("Allocated from %d to %d so for %d bytes\n", &d, d+sizeof(d), sizeof(d));

            auto int a = 3;
            printf("Now the stack pointer is on %d\n",&a);

这是输出

从 -4262856 分配到 -4197320 所以为 65536 字节 现在堆栈指针在 -4197312

那么,问题出在哪里?我该如何解决它(使用可变长度数组并将变量放在堆栈之后)。

谢谢!

【问题讨论】:

能否请您格式化代码并放入适当的标签以指示哪种语言。如果是 C,则没有带有大写 P 的 Printf - 那么请修复代码以使其更清晰以供其他人阅读? 【参考方案1】:

你不能。而且你不应该关心变量在哪里,编译器无论如何都可以完全优化它们。

尽管它高度依赖于系统,但编译器通常只会在其他所有操作之后分配可变大小的数组,从那时起,它只是增加堆栈以为数组生成 ruum 的问题。如果编译器将变量放在该区域之后,则必须通过动态大小数组的大小间接访问它们。

【讨论】:

以上是关于堆栈上的分配顺序的主要内容,如果未能解决你的问题,请参考以下文章

堆/堆栈上的类成员分配?

C中堆栈上的动态数组分配

为什么我们不能在堆栈上分配动态内存?

在堆栈上分配大缓冲区

为啥堆上的分配比栈上的分配快?

在进行 C 到 Intel x86 程序集转换时,堆栈上的数组分配占用的空间超过了所需的空间 [重复]