数组是否保证在虚拟内存中是连续的?

Dan*_*Dan 0 c

int main() { 
 char a[3] = {1,2,3};
 return sizeof(a);
}
Run Code Online (Sandbox Code Playgroud)

a保证在虚拟内存中连续字节?我知道它在物理内存中可能不是连续的,因为映射是由 MMU 在幕后完成的。

如果编译器注意到我没有获取任何元素的地址,那么是否可以将它们放在内存中的非连续地址上,甚至将它们放在寄存器中?

让我们假设优化器不会在我的示例中完全摆脱它。

Dav*_*rtz 5

是否保证在虚拟内存中的连续字节中?我知道它在物理内存中可能不是连续的,因为映射是由 MMU 在幕后完成的。

您的代码保证表现为数组位于地址空间的连续字节中。

如果编译器注意到我没有获取任何元素的地址,那么是否可以将它们放在内存中的非连续地址上,甚至将它们放在寄存器中?

即使你拿了地址,这样做也是免费的。只要代码不被破坏,编译器就可以以任何它想要的方式编译您的代码。

让我们假设优化器不会在我的示例中完全摆脱它。

好的。但这是允许的。C有一个“假设”的规则,这意味着所有规则都只是你的代码必须遵守的行为,他们不限制如何编译器(或计算机)获得该行为。