在VS(释放),我运行以下命令:
int main(void)
{
char b[] = "123";
char a[] = "1234567";
printf("%x %x\n", b,a);
return 0;
}
我可以看到,a的MEM地址为b + 3(字符串的长度)。 这表明内存与没有间隙分配。 这保证最少的记忆被使用。 所以,现在我有点相信,所有的编译器将这样做。 我要确保这个猜测这里。 有人可以给我一个更正式的证明或告诉我,我的猜测是植根于一个巧合。
不,它不能保证总是会有数据的完美包装。
例如,我编译和拼命地跑对于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
谁也不能保证什么地址将被选择为每个变量。 不同的处理器可能有对实例变量的取向不同的需求或偏好。
另外,我希望在你的例子有地址之间至少4个字节。 "123"
需要4个字节-额外的字节是为空终止。
尝试扭转声明[]和b []的顺序,和/或增加b的长度。
你所做的关于存储是如何分配的一个非常大的假设。 根据你的编译字符串字面量可能会存储在未在堆栈上的文字池。 然而,一个[]和b []不要占据堆栈上的元素。 因此,另一个测试将是添加int c
和比较这些地址。