C 中的 register 关键字
本文将讨论 C 编程语言中的 register 关键字。
C语言中register关键字概述
C 程序中的所有变量都保存到内存中,每个变量都有其内存地址。 但是,如果将 register 关键字与变量一起使用,编译器更有可能将变量保存在 CPU 寄存器中而不是内存中。
如果您不知道,处理器具有有限数量的通用寄存器,中央处理器 (CPU) 负责在对数据执行算术或逻辑运算之前将所有变量加载到各自的寄存器中。
寄存器比内存快得多,CPU 的访问定时器相应地更短。
因此,我们将寄存器关键字与在整个程序中出现频率最高的变量配对。 register 关键字告诉编译器所讨论的变量应该存储在处理器寄存器中,以便可以在尽可能短的时间内检索到它。
但是,由编译器决定是否将该变量存储在内存或处理器寄存器中。
让我们看看可以在程序中使用 register 关键字的多个场景。
C语言中register关键字的使用
下面是 C 编程语言中使用的 register 关键字的一个简单示例。
#include <stdio.h>
int main() {
register char a = 'S';
register double b = 10;
register int c = 8;
printf("The value of register variable a: %c\n",a);
printf("The value of register variable b: %f\n", b);
printf("The value of register variable c: %d", c);
return 0;
}
输出:
The value of register variable a: S
The value of register variable b: 10.000000
The value of register variable c: 8
在 C 中获取寄存器变量的地址
假设您将 register 关键字与变量一起放置。 在这种情况下,即使编译器决定将变量存储在内存中而不是 CPU 寄存器中,您也无法使用一元地址运算符访问变量的地址。
这是一个需要牢记的重要事实。
如果将地址运算符 & 与寄存器变量结合使用,您使用的编译器将给您警告或错误。 您收到的消息将取决于它是哪一个。
因为当你对变量使用 register 关键字时,变量的值可以放在处理器寄存器中而不是内存中,而处理器寄存器没有任何地址。 让我们举个例子。
#include <stdio.h>
int main()
{
register int registerVariable = 22;
int* ptr = ®isterVariable;
printf("%d", *ptr);
return 0;
}
输出:
main.c: In function ‘main’:
main.c:5:5: error: address of register variable ‘registerVariable’ requested
5 | int* ptr = ®isterVariable;
| ^~~
在 C 中将 register 关键字与指针变量一起使用
register 关键字可以与指针一起使用。 它可以具有内存位置的地址。
下面是在 C 编程语言中与指针变量一起使用的 register 关键字的示例。
#include<stdio.h>
int main()
{
int value = 15;
register int* pointerVariable = &value;
printf("The value of the pointer is: %d", *pointerVariable);
return 0;
}
输出:
The value of the pointer is: 15
在 C 中使用带有 register 关键字的存储类
C 编程语言不允许对单个变量使用各种存储类说明符。 寄存器是一个存储类。
因此,您不能将寄存器与 static、auto 和 extern 结合使用。
#include<stdio.h>
int main()
{
auto register int value = 15;
printf("The value of the pointer is: %d", value);
return 0;
}
输出:
main.c: In function ‘main’:
main.c:5:5: error: multiple storage classes in declaration specifiers
5 | auto register int value = 15;
| ^~~~
C 语言中寄存器变量的作用域
只能将 register 关键字与局部变量结合使用; 不可能将寄存器与具有全局范围的变量一起使用。
#include<stdio.h>
register int value = 22;
int main()
{
printf("%d", value);
return 0;
}
输出:
main.c:3:14: error: register name not specified for ‘value’
3 | register int value = 22;
|
相关文章
在 C 语言中使用 typedef enum
发布时间:2023/05/07 浏览次数:181 分类:C语言
-
本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。
C 语言中的 extern 关键字
发布时间:2023/05/07 浏览次数:114 分类:C语言
-
本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量
C 语言中的 #ifndef
发布时间:2023/05/07 浏览次数:186 分类:C语言
-
本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。