0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你还记得这个C语言关键字吗?

撞上电子 2023-12-17 08:00 次阅读

当你使用 volatile 关键字时,你告诉编译器该变量的值可能会在程序的执行过程中被外部因素更改,因此编译器不应该对该变量的读写进行优化。下面是一些使用 volatile 的例子,以及对它们的一些文字描述:

1,防止编译器优化

#include int main() { int a = 0; while (a == 0) { // 此处的循环条件可能在外部被修改,使用 volatile 防止编译器优化 } printf("Loop exited!\n"); return 0;}

这个例子中,a 的值可能会在循环外部被修改,但是由于循环内没有对 a 进行修改的语句,编译器可能会认为 a 的值在循环中永远不会变化,进而优化掉整个循环。通过使用 volatile,我们告诉编译器不要对这个变量的读写进行优化。

2. 提醒编译器不要缓存

#include #include #include volatile int flag = 1; // 用于标识是否可以退出循环void *threadFunction(void *arg) { sleep(2); // 模拟一些操作 flag = 0; // 线程中修改 flag 的值 return NULL;}int main() { pthread_t tid; pthread_create(&tid, NULL, threadFunction, NULL); while (flag) { // 在循环中读取 flag 的值,使用 volatile 防止编译器缓存 } printf("Thread signaled exit!\n"); pthread_join(tid, NULL); return 0;}

在这个例子中,flag 的值在另一个线程中被修改。由于涉及多线程,编译器可能会对 flag 进行缓存优化。通过使用 volatile,我们提醒编译器不要对这个变量进行缓存,而是每次都从内存中重新加载。


3. 内存映射的硬件寄存器

#include volatile unsigned int *hardwareRegister = (volatile unsigned int *)0x12345678;int main() { unsigned int value = *hardwareRegister; // 从硬件寄存器读取值 // 对硬件寄存器进行操作... *hardwareRegister = 42; // 将值写入硬件寄存器 return 0;}

在这个例子中,hardwareRegister 是一个指向内存映射硬件寄存器的指针。硬件寄存器的值可能在程序执行期间被硬件修改,因此我们使用 volatile 保证了对硬件寄存器的读写不会被编译器优化,而是每次都从内存中重新加载。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7588

    浏览量

    135737
  • 编译器
    +关注

    关注

    1

    文章

    1614

    浏览量

    49002
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28300
收藏 人收藏

    评论

    相关推荐

    教科书不会讲的C语言关键字volatile用法

    许多程序员都无法正确理解C语言关键字 volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句一带而过,本文将告诉
    发表于 02-02 10:14 467次阅读

    C语言关键字volatile的用法

    许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句一带而过,本文将告诉
    发表于 04-11 09:35 2528次阅读

    C语言关键字const的几种用法

    本期来讲解一个C语言关键字——const。
    发表于 06-21 11:05 1520次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>关键字</b>const的几种用法

    C语言面试最常问的关键字

    大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言面试最常问的三个关键字,希望能对有所帮助。
    发表于 07-11 12:41 365次阅读

    C语言关键字专题

    ,相当于BOOKstruct book .如果觉得懂了,那么下面这个把BOOK,代表的是什么意思呢?此时的BOOK是一个具体的变量 相当于咱们上面的mybook一样的啦四、static关键
    发表于 10-24 16:38

    C语言volatile关键字详解 精选资料分享

    1.volatile和什么有关百度翻译是这样子翻译volatile的:图1-1 百度翻译volatile截图volatile属于C语言关键字,《C Primer Puls》 是这样解
    发表于 07-22 07:20

    C语言volatile关键字之间有什么关系?

    C语言volatile关键字之间有什么关系?
    发表于 11-11 07:01

    标准C语言总共有32个关键字

    标准C语言总共有32个关键字
    发表于 01-12 15:59 0次下载

    C语言32个关键字九种控制语句34种运算符

    C语言32个关键字九种控制语句34种运算符 C语言32个关键字九种控制语句34种运算符
    发表于 05-06 11:47 6次下载

    C语言32个关键字

    C语言32个关键字,感兴趣的小伙伴们可以看看。
    发表于 07-26 16:29 66次下载

    浅析C语言中typedef关键字的作用

    C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。
    的头像 发表于 11-08 08:42 5944次阅读

    C语言32个关键字可以分为这几类

    C语言是一种面向过程、抽象化的通用程序设计语言,广泛应用于嵌入式底层和系统开发。C语言关键字共有
    的头像 发表于 12-31 15:28 4890次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>32个<b class='flag-5'>关键字</b>可以分为这几类

    浅析C语言中的regiseter关键字

    C语言中重要的关键字有很多,static const extern我们之前都讲过,还有一个在面试中出现的频率也比较高:register。
    的头像 发表于 08-25 17:10 1062次阅读
    浅析<b class='flag-5'>C</b><b class='flag-5'>语言</b>中的regiseter<b class='flag-5'>关键字</b>

    快速掌握C语言关键字

    C语言中的32个关键字知道多少个呢?根据关键字的作用分为四类:数据类型关键字、控制语句
    的头像 发表于 07-06 08:04 268次阅读
    快速掌握<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>关键字</b>

    C语言关键字--typedef

    C语言关键字使用方法学习指南!
    的头像 发表于 10-07 12:44 140次阅读