迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

C 中的 restrict 关键字

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本篇文章将讨论 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++ 没有明确支持这个关键字。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便