作者回复: 这是一个好问题!实际上这是由于 SysV 规范要求在函数调用前,栈顶需要在 16 字节的边界对齐(我们曾在第 05 讲中提到过)。因此由于这里在栈中需要存放 6 个元素,需要至少 24 字节的空间。所以为了对齐到 16 字节,rsp 的值要减少至少 32 字节。
作者回复: 感谢指正!你理解的没错,两者之间确实有些差异,我来修改一下表述。
作者回复: 这里不要从 C 代码的形式上扣哈,可以直接看编译器产物的结果。你会发现 3[arr] 与 arr[3] 产生的机器代码是完全一致的。因为编译器在解析 C 代码时可以通过判断括号左侧和括号内的值是不是 Constant Value 来判断当前这个值是应该作为索引,还是数组首地址来使用。
作者回复: 好问题。我们这里讲到的“数组退化到指针”实际上是 C 语言在设计上的一种性质,并不是使用不当或者优化手段。这个性质出现的原因要追溯到 C 语言的前身 B 语言中的类似设计上。在大多数场景下,需要注意问题就是变量性质(数组大小、数组类型)的丢失。
作者回复: 答案正确!
作者回复: 哈哈哈是的,所以正常项目中不要使用哈。