内存是如何分配的堆栈变量?(How is memory allocated for stack va

2019-09-28 00:08发布

在VS(释放),我运行以下命令:

int main(void)
{
   char b[] = "123";
   char a[] = "1234567";
   printf("%x  %x\n", b,a);
   return 0;
}

我可以看到,a的MEM地址为b + 3(字符串的长度)。 这表明内存与没有间隙分配。 这保证最少的记忆被使用。 所以,现在我有点相信,所有的编译器将这样做。 我要确保这个猜测这里。 有人可以给我一个更正式的证明或告诉我,我的猜测是植根于一个巧合。

Answer 1:

不,它不能保证总是会有数据的完美包装。

例如,我编译和拼命地跑对于g ++这个代码,所不同的是8。

你可以阅读更多关于此这里 。

TL;博士:编译器可以在内存中对齐对象只解决了一些常数(总是机器字长)整除,以帮助处理器(对他们来说更容易与这些地址有效)

UPD:大约对准一个有趣的例子:

#include <iostream>
using namespace std;

struct A
{
    int a;
    char b;
    int c;
    char d;
};

struct B
{
    int a;
    int c;
    char b;
    char d;
};

int main()
{
    cout << sizeof(A) << " " << sizeof(B) << "\n";
}

对我来说,它打印

16 12


Answer 2:

谁也不能保证什么地址将被选择为每个变量。 不同的处理器可能有对实例变量的取向不同的需求或偏好。

另外,我希望在你的例子有地址之间至少4个字节。 "123"需要4个字节-额外的字节是为空终止。



Answer 3:

尝试扭转声明[]和b []的顺序,和/或增加b的长度。

你所做的关于存储是如何分配的一个非常大的假设。 根据你的编译字符串字面量可能会存储在未在堆栈上的文字池。 然而,一个[]和b []不要占据堆栈上的元素。 因此,另一个测试将是添加int c和比较这些地址。



文章来源: How is memory allocated for stack variables?
标签: c++ c memory stack