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

    文章

    7534

    浏览量

    128823
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48627
  • 变量
    +关注

    关注

    0

    文章

    596

    浏览量

    28112
收藏 人收藏

    评论

    相关推荐

    C语言关键字专题

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

    c语言中 volatile _Bool 关键字说明

    。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化。如果我去掉 这个关键字,如下图: (在编译是会显示一个警告,temp 定义了但是未使用),且编译器会将这个
    发表于 01-06 10:46

    【视频】C语言知识免费视频教程第2集-C语言关键字-常量-变量(已更新到21集,观看链接已附上)

    语言相关的问题,都可以在帖子下面讨论。C语言教程第一集:认识C语言C
    发表于 03-04 13:24

    【视频】C语言知识免费视频教程-C语言关键字_signed-unsigned-auto-连载视频第3集(视频持续更新……)

    单片机C语言相关的问题,都可以在帖子下面讨论。C语言教程第一集:认识C语言
    发表于 03-12 15:14

    【视频】C语言知识免费视频教程-C语言关键字-static-连载视频第4集(视频持续更新……)

    单片机C语言相关的问题,都可以在帖子下面讨论。C语言教程第一集:认识C语言
    发表于 03-19 13:37

    【视频】C语言知识免费视频教程-C语言关键字-register-连载视频第5集(视频持续更新……)

    单片机C语言相关的问题,都可以在帖子下面讨论。C语言教程第一集:认识C语言
    发表于 03-26 14:29

    【视频】C语言知识免费视频教程-C语言关键字-const-连载视频第6集(视频持续更新……)

    单片机C语言相关的问题,都可以在帖子下面讨论。C语言教程第一集:认识C语言
    发表于 04-06 09:44

    【视频】C语言知识免费视频教程-C语言关键字_volatile-连载视频第7集(视频持续更新……)

    单片机C语言相关的问题,都可以在帖子下面讨论。C语言教程第一集:认识C语言
    发表于 04-12 10:40

    【视频】C语言知识免费视频教程-C语言关键字_typedef-连载视频第8集(视频持续更新……)

    单片机C语言相关的问题,都可以在帖子下面讨论。C语言教程第一集:认识C语言
    发表于 04-19 11:39

    【视频】C语言知识免费视频教程-C语言关键字_extern-连载视频第9集(视频持续更新……)

    单片机C语言相关的问题,都可以在帖子下面讨论。C语言教程第一集:认识C语言
    发表于 04-26 14:04

    【视频】C语言知识免费视频教程-C语言关键字_void-连载视频第10集(视频持续更新……)

    语言教程第二集:C语言关键字-常量-变量C语言教程第三集:C
    发表于 05-13 10:04

    【视频】C语言知识免费视频教程-C语言关键字_sizeof-连载视频第11集(视频持续更新……)

    语言教程第二集:C语言关键字-常量-变量C语言教程第三集:C
    发表于 05-20 09:10

    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语言关键字static的作用是什么

    C语言关键字static的作用是什么?用预处理指令#define 声明一个函数,输入天数得到有多少秒?
    发表于 12-24 06:53