Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么有数组的调用约定?_C_Arrays_X86 64_Calling Convention - Fatal编程技术网

C 为什么有数组的调用约定?

C 为什么有数组的调用约定?,c,arrays,x86-64,calling-convention,C,Arrays,X86 64,Calling Convention,我正在读这本书,其中有一部分我无法理解 首先,文件指出: 没有尝试为C以外的语言指定ABI (第10页) 稍后,在第20页,数组被分类为内存、指针等: 聚合(结构和数组)和联合类型的分类是有效的 如下所示: 然后,该分类用于定义调用约定——它们的值和边界如何传递给函数和从函数返回。如果我正确读取了算法,数组可以分为整数、内存或SSE 但是在C语言中,数组总是作为指针传递和返回。那么,为什么对数组进行分类很有用?在哪种情况下,数组类很重要?我弄明白了:如果数组是结构或联合的一部分,它可能会在寄存

我正在读这本书,其中有一部分我无法理解

首先,文件指出:

没有尝试为C以外的语言指定ABI

(第10页)

稍后,在第20页,数组被分类为内存、指针等:

聚合(结构和数组)和联合类型的分类是有效的 如下所示:

然后,该分类用于定义调用约定——它们的值和边界如何传递给函数和从函数返回。如果我正确读取了算法,数组可以分为整数、内存或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