C 在iOS中应用寄存器int

C 在iOS中应用寄存器int,c,data-structures,arm,processor,C,Data Structures,Arm,Processor,我学会了注册 样本: 寄存器INTA 指示编译器更快地使用变量在寄存器中保存我的int变量 但如果处理器中没有寄存器,则为我的变量集auto iPhone ARM处理器可以有这种特殊的寄存器吗 任何处理器都有寄存器,除了非常罕见的、现在已经失效的基于堆栈的体系结构。C中的关键字register只是提示编译器将该变量映射到寄存器中,而不是堆栈上。这源于古代,当时将变量映射到寄存器的算法效率不高。如今,这些算法的映射比人类更好,因此实际上不需要使用寄存器提示 我真的不知道iPhone ARM编译器,

我学会了注册

样本:

寄存器INTA

指示编译器更快地使用变量在寄存器中保存我的int变量 但如果处理器中没有寄存器,则为我的变量集auto


iPhone ARM处理器可以有这种特殊的寄存器吗

任何处理器都有寄存器,除了非常罕见的、现在已经失效的基于堆栈的体系结构。C中的关键字register只是提示编译器将该变量映射到寄存器中,而不是堆栈上。这源于古代,当时将变量映射到寄存器的算法效率不高。如今,这些算法的映射比人类更好,因此实际上不需要使用寄存器提示

我真的不知道iPhone ARM编译器,但我真的不认为他们没有使用现代算法将变量映射到寄存器

还要注意,我告诉您的内容对于使用优化标志进行编译是有效的

寄存器是处理器拥有的最快的内存,它位于CPU内部,它们以处理器的速度运行,并且没有访问它的时间限制。然而,寄存器数量有限,从CISC体系结构上的4-6个通用寄存器到RISC体系结构上的10-20个寄存器。编译器将尝试将最常用的访问变量映射到这些寄存器。当寄存器用完时,他必须映射堆栈上的变量,这在RAM中要慢得多,但主要是缓存在缓存L1或L2中。
因此,决定哪些变量映射到寄存器以及哪些变量映射到堆栈对性能有重大影响,但是,正如我所说,如今,编译器在将变量映射到寄存器方面比人类做得更好。

任何处理器都有寄存器,除了非常罕见的、现在已经过时的基于堆栈的体系结构。C中的关键字register只是提示编译器将该变量映射到寄存器中,而不是堆栈上。这源于古代,当时将变量映射到寄存器的算法效率不高。如今,这些算法的映射比人类更好,因此实际上不需要使用寄存器提示

我真的不知道iPhone ARM编译器,但我真的不认为他们没有使用现代算法将变量映射到寄存器

还要注意,我告诉您的内容对于使用优化标志进行编译是有效的

寄存器是处理器拥有的最快的内存,它位于CPU内部,它们以处理器的速度运行,并且没有访问它的时间限制。然而,寄存器数量有限,从CISC体系结构上的4-6个通用寄存器到RISC体系结构上的10-20个寄存器。编译器将尝试将最常用的访问变量映射到这些寄存器。当寄存器用完时,他必须映射堆栈上的变量,这在RAM中要慢得多,但主要是缓存在缓存L1或L2中。 因此,决定哪些变量映射到寄存器以及哪些变量映射到堆栈对性能有很大影响,但是,正如我所说,现在编译器在将变量映射到寄存器方面做得比人类更好。

提供了一个相当好的答案。然而,在寄存器上还有几个附加点

没有指针 首先,您不能获取寄存器变量的地址。在大多数编译器中,自动变量被跟踪并注释为被指针引用,这通常不会产生任何影响。但是,在某些情况下,编译器可能无法确定指针没有别名到变量,在这种情况下,寄存器变量实际上可能更好。由于变量声明为寄存器,因此无法通过指针对其进行别名。有关别名的详细信息,请参见关键字信息

具有讽刺意味的是,这可能会在较低的优化级别上发挥作用

内联汇编程序 如果显式声明一个寄存器以与clang或gcc语法一起使用,则需要

 register unsigned int *stack asm("sp");
需要寄存器才能有一个指向堆栈顶部的变量堆栈。这是对“C”语言的扩展,但与iOS及其通用编译器相关

联络断路器 在一个极其复杂的算法中,使用寄存器可以提示编译器将值保留在内存中,以利于其他变量。通常,与内联一样,最好由编译器决定。除非您已经做了大量的分析,并且发现编译器正在堆栈上保存一个常用的变量

如果您没有过度使用关键字,它还可以作为说明变量对性能至关重要的文档;尽管在这种情况下,一条评论可能同样好

要让register关键字在ARMR0-r15上发挥作用,需要一个非常复杂的算法和大型函数体。在thumb模式下,它可能更有用,因为在thumb模式下,可用寄存器更少;对于iOS ARM设备,这不是 pply

通常不需要注册。也可以想象,过度使用实际上会导致代码性能下降。添加这个关键字不应该是一种自动反射,而应该在代码完全正常运行并且优化阶段已经开始之后才进行。

提供了一个相当好的答案。然而,在寄存器上还有几个附加点

没有指针 首先,您不能获取寄存器变量的地址。在大多数编译器中,自动变量被跟踪并注释为被指针引用,这通常不会产生任何影响。但是,在某些情况下,编译器可能无法确定指针没有别名到变量,在这种情况下,寄存器变量实际上可能更好。由于变量声明为寄存器,因此无法通过指针对其进行别名。有关别名的详细信息,请参见关键字信息

具有讽刺意味的是,这可能会在较低的优化级别上发挥作用

内联汇编程序 如果显式声明一个寄存器以与clang或gcc语法一起使用,则需要

 register unsigned int *stack asm("sp");
需要寄存器才能有一个指向堆栈顶部的变量堆栈。这是对“C”语言的扩展,但与iOS及其通用编译器相关

联络断路器 在一个极其复杂的算法中,使用寄存器可以提示编译器将值保留在内存中,以利于其他变量。通常,与内联一样,最好由编译器决定。除非您已经做了大量的分析,并且发现编译器正在堆栈上保存一个常用的变量

如果您没有过度使用关键字,它还可以作为说明变量对性能至关重要的文档;尽管在这种情况下,一条评论可能同样好

要让register关键字在ARMR0-r15上发挥作用,需要一个非常复杂的算法和大型函数体。在thumb模式下,它可能更有用,因为在thumb模式下,可用寄存器更少;对于iOS ARM设备,这不适用


通常不需要注册。也可以想象,过度使用实际上会导致代码性能下降。添加此关键字不应该是自动反射,而应该在代码完全正常运行且优化阶段开始后才能执行。

您认为不能使用register?@ScarX我知道不再需要在C中使用register关键字。如果您愿意,可以使用它,但不太可能实现任何目标。ARM的16个寄存器中有9个或10个可供编译器使用。默认情况下,它将使用寄存器,除非它必须向堆栈中溢出一个临时值bolov@marko这是一个很好的观点。具有讽刺意味的是,我认为未来可能会发生变化。例如,链路时间优化通常会防止发出序言/尾声,以便寄存器始终处于压力之下。就像一个包含许多静态函数的文件可以编译为一个大函数一样;使用编译器来排列变量/函数。因此,即使寄存器限制看起来很大,即使是正常的实用代码也可能会将r4-r12最大化。从LTO的角度来看,最大化寄存器是最优的。你认为不能使用寄存器吗?@ScarX我知道在C中不再需要使用寄存器关键字。如果你愿意,你可以使用它,但它不太可能实现任何目标。ARM的16个寄存器中有9个或10个可供编译器使用。默认情况下,它将使用寄存器,除非它必须向堆栈中溢出一个临时值bolov@marko这是一个很好的观点。具有讽刺意味的是,我认为未来可能会发生变化。例如,链路时间优化通常会防止发出序言/尾声,以便寄存器始终处于压力之下。就像一个包含许多静态函数的文件可以编译为一个大函数一样;使用编译器来排列变量/函数。因此,即使寄存器限制看起来很大,即使是正常的实用代码也可能会将r4-r12最大化。从LTO的角度来看,最大化寄存器是最优的。一个例子是,编译器将所有代码视为相等。例如,与同一中断中的簿记代码相反,最大限度地缩短互斥锁被保持的时间,或在中断中计算硬件FIFO值;例程部分的延迟比总运行时间更重要。当然,即使在2014+中,仍然有一些情况需要使用register,特别是在其他技术中,例如,编译器将所有代码视为平等的情况下使用了tie breaker。例如,与同一中断中的簿记代码相反,最大限度地缩短互斥锁被保持的时间,或在中断中计算硬件FIFO值;例程部分的延迟比总运行时间更重要。当然,即使在2014+年,仍然有一些情况需要使用register,特别是使用其他技术,如