C 为什么有数组的调用约定?
我正在读这本书,其中有一部分我无法理解 首先,文件指出: 没有尝试为C以外的语言指定ABI (第10页) 稍后,在第20页,数组被分类为内存、指针等: 聚合(结构和数组)和联合类型的分类是有效的 如下所示:C 为什么有数组的调用约定?,c,arrays,x86-64,calling-convention,C,Arrays,X86 64,Calling Convention,我正在读这本书,其中有一部分我无法理解 首先,文件指出: 没有尝试为C以外的语言指定ABI (第10页) 稍后,在第20页,数组被分类为内存、指针等: 聚合(结构和数组)和联合类型的分类是有效的 如下所示: 然后,该分类用于定义调用约定——它们的值和边界如何传递给函数和从函数返回。如果我正确读取了算法,数组可以分为整数、内存或SSE 但是在C语言中,数组总是作为指针传递和返回。那么,为什么对数组进行分类很有用?在哪种情况下,数组类很重要?我弄明白了:如果数组是结构或联合的一部分,它可能会在寄存
然后,该分类用于定义调用约定——它们的值和边界如何传递给函数和从函数返回。如果我正确读取了算法,数组可以分为整数、内存或SSE
但是在C语言中,数组总是作为指针传递和返回。那么,为什么对数组进行分类很有用?在哪种情况下,数组类很重要?我弄明白了:如果数组是结构或联合的一部分,它可能会在寄存器中传递 这是C代码
#include <stdint.h>
struct somebytes {
uint8_t bytes[8];
};
uint8_t plus(struct somebytes p) {
return p.bytes[3]+p.bytes[5];
}
第一句话本身很容易理解,因为C是Unix世界的核心。至于第二句话,C将数组作为指针传递(或rater让数组衰减为指向其第一个元素的指针)是因为C从一开始就是这样工作的,这也是C规范所说的应该发生的。。
mov %rdi,%rax
shr $0x28,%rdi
shr $0x18,%rax
add %edi,%eax
retq