news 2026/6/4 9:18:13

C语言存储关键字,volatile和register

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言存储关键字,volatile和register

C语言提供了一些关键字,用于对变量的存储方式进行控制;主要包含register、volatile等。对于函数中的局部变量,如果没有强制指定要求,可能直接优化成寄存器访问;不一定在栈中,具体取决于变量的长度大小和编译器的优化策略。

对于局部变量,优化成寄存器访问,速度会比栈中的变量快很多。这是因为栈中的变量需要通过内存访问,涉及到Cache机制、内存寻址等;而内核中的寄存器可以直接存取,访问速度要快很多。不过优化后并非没有弊端,在调试时优化成寄存器访问的局部变量,很多无法直接通过调试窗口查看。

对于变量的地址,这就涉及到对变量的存储的更精细的控制,包括register和volatile关键字。

register关键字可以要求编译器将局部变量分配到寄存器中,从而提高访问速度;但是不能保证变量一定分配到寄存器中,内部寄存器的数量是有限的(如Cortex-M结构,内部数值寄存器对应的就是r0-r12),对于比较大的结构体变量、数组等,编译器仍然会选择栈中的存储方式。

volatile关键字则正好相反,要求编译器必须访问实际的内存地址,不能优化成内部寄存器访问(这里的内部寄存器指的是Cortex-M结构中的r0-r12数据寄存器,而并非功能性寄存器,如UART配置寄存器)。关于volatile关键字,可以用于如下场景。

并行设备的硬件寄存器(如:模块功能寄存器)。一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)。多线程应用中被几个任务共享的变量

volatile仅保证每次访问变量的最新值,阻止对地址访问的优化;并不能保证其原子性,在多线程环境下,也不能代替锁机制。可以使用C11的_Atomic关键字来实现原子操作。精通volatile的运用,在嵌入式底层中十分重要,也是嵌入式C从业者的基本要求之一。

关于volatile、register、__Atomic关键字,具体示例如下所示。

#include int main(int argc, char *argv[]) { int a1 = 1; // 局部变量,由编译器决定存储方式 register int a2 = 2; // 局部变量,要求编译器将变量分配到寄存器中(对于小的变量一般会优化成寄存器访问) volatile int a3 = 3; // 局部变量,要求每次访问都从内存中读取 _Atomic int a4 = 4; // 局部变量,支持原子操作(底层一般依赖volatile实现) a1 += 1; a2 += 1; a3 += 1; a4 += 1; printf("a1: %d\n", a1); printf("a2: %d\n", a2); printf("a3: %d\n", a3); printf("a4: %d\n", a4); return 0; }

具体的输出结果如下所示。

运行结果表明,对于局部变量,编译器一般会优化成寄存器访问,对于volatile关键字,每次访问都从内存中读取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 9:15:15

小显卡跑大模型:四层显存压缩实现50%显存节省

1. 项目概述:小显卡跑大模型不是玄学,是显存管理的艺术“劲爆:我的小显卡可以跑大模型,可以省一半显存”——这句话刚在技术群刷出来时,我正盯着自己那张RTX 3060 12GB发呆。它既不是A100,也不是4090&#…

作者头像 李华
网站建设 2026/6/4 9:14:24

GPT-5.5 Pro实战指南:工作流原生AI如何重塑工程与知识生产

1. 这不是又一个“更强更快”的模型,而是你工作流里突然多出的第三只手2026年4月24日凌晨,我盯着终端里滚动的日志,看着一行行由GPT-5.5自动生成的单元测试用例精准覆盖了我漏掉的边界条件,心里没起什么波澜——这已经是我今天第7…

作者头像 李华
网站建设 2026/6/4 9:14:11

GLM-5-Coding-Pro深度解析:语法感知与架构融合的代码大模型

1. 项目概述:一次被低估的模型能力跃迁“智谱:GLM Coding Pro已加入GLM-5”——这行看似简短的公告,背后不是简单的功能叠加,而是一次面向真实开发场景的深度能力重构。我第一时间拉取了GLM-5官方文档、Hugging Face模型卡、GitHu…

作者头像 李华
网站建设 2026/6/4 9:11:31

【Redis篇】Redis 事务:原子性与脚本执行机制

文章目录Redis 事务:原子性与脚本执行机制一、前言二、Redis 事务的基本概念2.1 为什么需要 Redis 事务2.2 Redis 事务的三个命令三、事务的完整流程3.1 基本使用示例3.2 放弃事务四、事务中的错误处理4.1 第一类错误:命令语法错误(编译期错误…

作者头像 李华
网站建设 2026/6/4 9:04:41

2026企业协作网盘选型指南:坚果云等5大主流文档协作平台深度横评

一、先说结论:企业文档协作平台怎么选? 企业协作网盘是面向组织文件存储、共享、同步、权限管理和多人协作的企业级文件管理平台。相比个人网盘,企业网盘更强调组织级权限、版本管理、多端同步和核心资产的保护。为了让大家直观了解各平台的…

作者头像 李华