对volatile修饰的变量使用memset函数
背景
今天面试了一家公司,面试官问了我一个开放性的问题。大致意思是,为什么对volatile修饰的变量调用memset函数,编译的时候会报错。当然,我是不知道为什么啦。之前没有遇到过嘛。不过我还是做了一点分析,我认为问题出在memset函数的实现上。一般情况下volatile关键字修饰的变量在编译的时候会取消编译优化,即每次使用变量时都会访问变量对应的地址,而不是将变量读入寄存器中连续使用。
探索
面试结束后,我写了个简单的代码测试了一下。大致如下
#include <stdio.h>
int main(void)
{
volatile int a;
memset(&a,0,sizeof(int));
}
编译出现了一个警告
warning: passing argument 1 of ‘memset’ discards ‘volatile’ qualifier from pointer target type
我的理解是这个volatile变量传入函数后volatile的特性会被丢掉。
为了研究为什么会这样,接下来我阅读了linux内核中memset的源码。
void *memset(void *pdst, int c, unsigned int plen)
{
/* Now we want the parameters in special registers. Make sure the
compiler does something usable with this. */
register char *return_dst __asm__ ("r10") = pdst;
register int n __asm__ ("r12") = plen;
register int lc __asm__ ("r11") = c;
.....
}
上面这部分源码解答了我的疑惑,原来memset在执行过程中,强制把传入的地址放入了r10寄存器,之后也会直接通过连续操作寄存器来访问变量,这里就和volatile每次都要读取物理地址而不能连续使用寄存器内容的特性冲突了。
对volatile修饰的变量使用memset函数的更多相关文章
- 【转】C++ const成员变量和成员函数(常成员函数)
转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. co ...
- C++ const成员变量和成员函数(常成员函数)
在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只 ...
- 【Java_多线程并发编程】JUC原子类——原子类中的volatile变量和CAS函数
JUC中的原子类是依靠volatile变量和Unsafe类中的CAS函数实现的. 1. volatile变量的特性 内存可见性(当一个线程修改volatile变量的值后,另一个线程就可以实时看到此变量 ...
- volatile 和const 变量的使用
一.volatile定义: 一个定义为volatile的变量是说这变量可能会被意想不到的被改变,这样,有了volatile变量后,就提醒编译器就不会去假设这个变量的值了.精确地说就是,编译中的优化器在 ...
- Java语言基本语法(一)————关键字&标识符(Java语言标识符命名规范&Java语言的包名、类名、接口名、变量名、函数名、常量名命名规则 )
一.关键字 关键字的定义和特点 定义:被Java语言赋予特殊含义,用做专门用途的字符串(单词). 特点:关键字中所有字母均为小写 下面列举一些常用的关键字. 用于定义数据类型的关键字:byte.sho ...
- volatile修饰符
Volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值.而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存.这样在任何时刻,两个不同的线程总是看到某个成 ...
- memset函数详解
语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...
- memset函数具体说明
1.void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c. 2.样例#include void main(){char ...
- C++类中的静态成员变量与静态成员函数
最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态 ...
- 13.C++-静态成员变量、静态成员函数
首先回顾下成员变量 能通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 再来讲讲类的静态成员变量 介绍 静态成员变量属于整个类所有 静态成员变量的生命期 ...
随机推荐
- Nginx基础篇
目录 一.nginx基础篇 1.Nginx开源版本安装 2.Nginx的基础配置 3.虚拟主机与域名解析 4.ServerName匹配规则 5.反向代理 6.动静分离 7.location后符号的匹配 ...
- uniapp获取本机所有应用包名
huoqu(e){ uni.showLoading({ title: '获取中' }); const main = plus.android.runtimeMainActivity(); let pM ...
- TDengine上手笔记
TDengine简介 TDengine 是一款开源.高性能.云原生的时序数据库,且针对物联网.车联网.工业互联网.金融.IT 运维等场景进行了优化.您可以像使用关系型数据库 MySQL 一样来使用它. ...
- 关闭内核Debug_log打印!
echo 0 > /proc/sys/kernel/printk \r
- eNSP报错41解决方法
1.点击右上角的菜单 2.工具>>注册设备,全部勾选,然后注册,就行了.
- c++ 函数篇
1.函数是什么样子: dataType functionName( dataType1 param1, dataType2 param2 ... ){//do something }//形式参数pa ...
- ICPC2021 沈阳站
B-Bitwise Exclusive-OR Sequence 牛客网 题意:对于\(n(n<=1*10^5)\)个数的序列,给定\(m(m<=2*10^5)\)个限制条件,每个限制条件形 ...
- [*]Is L2 Physics-Informed Loss Always Suitable for Training Physics-Informed Neural Network?
NeurIPS 2022 本篇工作对PINN中的物理损失进行了探究,作者认为L2损失并不总是适用于训练PINN.并从PDE解的稳定性角度给出了理论性的说明.读了这篇文章,感觉自己的毕业论文做的十分浅显 ...
- Efficient training of physics-informed neural networks via importance sampling
因为看着作者是英伟达的,便看了一下.总体感觉没有什么新意,改进幅度也很小,但是理论推导可以看一下.可以借鉴一下. 本文通过重要性采样对PINN进行高效计算,本文提出的方法很简单,也很直观,但效果提升有 ...
- notepad++ 编写html代码快捷键切换到浏览器查看
1.右键chrome属性,查看目标C:\Users\duanx\AppData\Local\Google\Chrome\Application\chrome.exe 2.然后notepad运行,输入如 ...