C 中的 restrict 关键字
本篇文章将讨论 C 中的 restrict 关键字及其在编译器优化中的用途。 因此,我们将首先讨论编译器优化。
接下来,我们将通过代码示例讨论 C 语言中的 restrict 关键字。 最后,我们将在简要讨论 C 中的 restrict 关键字后得出结论。
C 中的编译器优化
编译器的一个重要特性是它的优化工具。 通常,认为并教导编译器将高级语言程序翻译成机器级程序。
然而,现代编译器也执行代码优化。
代码优化最大限度地减少了执行时间、内存使用和功耗。 这个动作类似于一个聪明的翻译,他不仅翻译而且修改句子以使它们更好。
编译器优化是一个非常复杂的过程,包括生成等效代码的优化转换,生成相同的输出但消耗最少的资源:主要是时间和存储。
在这里,我们将通过一个示例来了解编译器优化及其用途。 考虑一个非常简单的程序:
#include <stdio.h>
int main() {
int i;
for (i=1;i<=10;i++)
printf("%d ", i);
return 0;
}
输出:
1 2 3 4 5 6 7 8 9 10
这是一个非常简单的程序; 但是,除了打印从 1 到 10 的计数之外,该程序还执行了一些额外的步骤。 比较和递增步骤至少执行十次; 相反,比较进行了 11 次(即,第 11 次迭代的 10 次正确和错误)。
总共,我们使用了 32 个语句来打印这个计数。 第一条语句是初始化。
十一个比较语句。 十个增量语句和十个打印语句。
编译器可以很容易地判断出上面代码中涉及到的常量,并生成一个等价的代码,类似于下面的代码。
#include <stdio.h>
int main() {
printf("%d ", 1);
printf("%d ", 2);
printf("%d ", 3);
printf("%d ", 4);
printf("%d ", 5);
printf("%d ", 6);
printf("%d ", 7);
printf("%d ", 8);
printf("%d ", 9);
printf("%d ", 10);
return 0;
}
上面的代码与前面的代码具有相同的输出。 即使是单个打印语句也可以产生相同的输出。
这只是一个简单的例子; 然而,现代编译器做了很多复杂的优化以尽可能减少资源。
C 中的 restrict 关键字
C99 标准引入了 restrict 关键字。 此关键字在指针声明中用作类型限定符。
它没有添加任何新功能; 但是,它仅用于通知编译器进行某些优化。
此关键字与指针一起使用,以通知编译器这是使用变量/内存的唯一指针,并且没有其他指针正在访问同一内存。
这似乎是无用的信息; 但是,此编译器被告知没有其他指针正在访问同一内存。 因此,不需要对内存的加载/卸载应用额外的检查。
restrict 关键字语法
restrict 关键字在 *
之后和变量名之前添加一个指针声明。
int * restrict x;
显然,此关键字不会影响代码的功能。 因此,我们举一个例子来说明如何在我们的代码中使用 restrict 关键字。
#include <stdio.h>
void f1(int *a, int * restrict b){
printf ("%d %d\n", *a, *b);
}
int main() {
int x = 100, y = 200;
f1(&x, &y);
return 0;
}
在此代码中,将 restrict 关键字添加为函数 f1 中第二个参数的限定符。
这个关键字告诉编译器这个指针访问的内存是独占的,没有其他指针会访问同一块内存; 因此编译器可以通过保持汇编代码简单来进行优化。
输出:
100 200
同样,即使我们删除了 restrict 关键字,输出也将保持不变。
C++ 中的 restrict 关键字
同样重要的是要注意,令人惊讶的是,C++ 不允许使用 restrict 关键字。
你可以用谷歌搜索; 但是,这并不意味着 C++ 不支持此功能。 C++ 隐含地具有此功能,编译器有一些自动方法来识别这种类型的限制,并相应地执行优化。
总结
编译器添加了一些代码优化以使其资源最优。 restrict 是编译器的一个标志,可以帮助它做出更好的优化决策。
C99 之前的 C 语言不支持 restrict 关键字。 该关键字不添加任何功能; 相反,它通知编译器此内存访问是独占和受限的; 因此,编译器在目标翻译的汇编代码中执行所需的优化。
使用或不使用 restrict 关键字在代码的功能上没有区别。 最后,C++ 没有明确支持这个关键字。
相关文章
在 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 语言中的头文件用于定义同名源文件中实现的函数的接口。