如果我们采用以下代码:
int height = 10;
int width = 5;
printf(
"The memory address of height is: %p\n"
"The memory address of width is: %p\n",
&height, &width
);
我得到以下照片:
The memory address of height is: 0x7ffeed809a78
The memory address of width is: 0x7ffeed809a74
我期望宽度在位置0x7ffee8843a7c
处。换句话说,它正在执行&height - 1
而不是&height + 1
。为什么会这样?
答案 0 :(得分:2)
没有理由要求它们,所以编译器会做最适合自己的事情。
复杂的编译器优化和高效的线性内存布局并不能同时使用,因此牺牲了线性内存布局。
使用散列表时,您将了解最有效的算法如何导致可重复的伪随机输出顺序。编译时将符号名称加载到哈希表中;并且可以通过遍历全局符号表来布局功能存储空间,因此它以任意顺序排列。
通常,您会发现这是对的。每当未指定顺序时,它就会掉下来;而当算法不平凡时,它就不再简单了。
从不依赖于符号在内存布局中的顺序。不允许。