C语言进阶教程(volataile是干嘛的?)

举报
yd_274589494 发表于 2023/10/30 10:16:57 2023/10/30
【摘要】 @TOC 前言本篇文章来给大家介绍volataile的意义和具体使用方法,很多同学学习了C语言可能都没有接触过这个关键字,这个关键字看起来是很少使用,但是在嵌入式开发中这个关键字还是比较重要的。 一、volataile意义关键字 volatile 在C和C++语言中使用,它的主要作用是告诉编译器该变量是随时可能发生改变的,以避免编译器优化掉对该变量的访问或操作。当你将一个变量声明为 vola...

@TOC


前言

本篇文章来给大家介绍volataile的意义和具体使用方法,很多同学学习了C语言可能都没有接触过这个关键字,这个关键字看起来是很少使用,但是在嵌入式开发中这个关键字还是比较重要的。

一、volataile意义

关键字 volatile 在C和C++语言中使用,它的主要作用是告诉编译器该变量是随时可能发生改变的,以避免编译器优化掉对该变量的访问或操作。
当你将一个变量声明为 volatile 时,编译器将不会对该变量进行优化,以确保每次访问或操作该变量都是从内存中读取或写入。这是因为 volatile 变量具有可能被外部因素修改的特性,例如多线程/多进程环境下的共享变量、硬件寄存器等。

以下是 volatile 关键字的几个重要意义:

1.可见性:在多线程或多进程环境中,当一个变量被声明为 volatile 时,保证了对该变量的读写都能立即生效,因此可以避免编译器对该变量的优化,确保每次读取或写入都是真实的值。

2.防止优化:编译器在进行优化时,有可能会将某些对变量的读写操作优化掉或进行重排,因为认为这些操作对程序结果没有影响。但对于 volatile 变量,编译器会忽略对其进行的优化,保证操作的执行顺序和预期一致。

3.中断处理:在嵌入式系统或操作系统内核开发中,volatile 通常用于对中断服务例程处理的变量进行声明。由于这些变量会从中断上下文中被修改,需要保证对变量的访问不受编译器的优化影响。

二、volataile和const的火花

1.const表示被修饰的变量不能出现在赋值符号左边
2.volatile表示使用变量时直接从内存中取值
3.const和volatile同时修饰变量的时候并不会互相影响

例子:

这个程序能够编译通过,所以这就印证了我们上面的说法了。

#include <stdio.h>

int main()
{
    const volatile int a = 0;

    int* p = &a;
    *p = &a;

    return 0;
}

总结

总结起来,volatile 关键字用于标识那些可能被外部因素修改的变量,告诉编译器不要对其进行优化,以确保每次访问或操作都从内存中读取或写入变量的值。这对于多线程环境、硬件寄存器以及中断处理等场景非常有用。然而,需要注意,在多线程环境下,volatile 不能保证原子性,还需要结合其他同步机制来确保正确性。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。