1

在 VS(发布)上,我运行以下命令:

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

我可以看到,a的mem地址是b+3(字符串的长度)。这表明内存分配没有间隙。这保证了使用最少的内存。所以,我现在有点相信所有编译器都会这样做。我想在这里确定这个猜测。有人可以给我一个更正式的证据,或者告诉我我的猜测是基于巧合。

4

3 回答 3

2

无法保证将为每个变量选择什么地址。例如,不同的处理器可能对变量的对齐有不同的要求或偏好。

另外,我希望您的示例中的地址之间至少有 4 个字节。 "123"需要 4 个字节 - 额外的字节用于空终止符。

于 2013-08-12T07:27:10.280 回答
2

不,不能保证总是有完美的数据打包。

比如我在g++上编译运行这段代码,相差8。

您可以在此处阅读有关此内容的更多信息。

tl;dr:编译器可以将内存中的对象对齐到仅可被某个常数(总是机器字长)整除的地址,以帮助处理器(对他们来说,使用这些地址更容易)

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
于 2013-08-12T07:31:03.167 回答
1

尝试颠倒声明 a[] 和 b[] 的顺序,和/或增加 b 的长度。

您正在对如何分配存储做出非常大的假设。根据您的编译器,字符串文字可能会存储在不在堆栈上的文字池中。然而 a[] 和 b[] 确实占据了堆栈上的元素。因此,另一个测试是添加int c和比较这些地址。

于 2013-08-12T07:29:13.663 回答