类型限定词volatile

2024-02-09 22:48
文章标签 类型 volatile 限定词

本文主要是介绍类型限定词volatile,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、类型限定词volatile
限定词volatile告诉编译器该变量除了可以被程序改变以外还可被其他代理改变。
它通常被用于硬件地址和与其它并行运行的程序共享的数据。
如:

volatile int locl ;
volatile int * ploc ;

你可能会奇怪为什么ANSI觉得有必要把volatile作为一个关键字。
原因是它可以方便编译器优化。
例如

val1 = x ;
/* 一些不使用x的代码 */
val2 = x ;

一个聪明的编译器可能注意到你使用了两次x,而没有改变它的值。那么,它有可能把x临时存储在一个寄存器中。
接着,当val2需要x时,可以通过从寄存器而非初始的内存位置中读取该值以节省时间。
这个过程被称为缓存(caching)。
通常,缓存是一个好的优化方式,但是如果在两个语句间其他代理改变了x的话就不是这样了。
如果没有规定volatile关键字,那么编译器将无从得知这种改变是否可能发生。
在ANSI中,如果声明中没有volatile关键字,那么编译器就可以假定一个值在使用过程中没有被修改,它就可以试着优

化代码。
一个值可以同时是const 和 volatile。
例如,硬件时钟一般设定为不能由程序改变,这一点使它成为const;
但它被程序以外的代理改变,这使它成为volatile.
那么我们可以这么声明:

volatile const int loc ;
const volatile int * ploc ;

二、类型限定词restrict
关键字restrict用来消除数据间的相关性,编译器从而可以安排语句的并行执行。
它只可以用于指针,并表明指针是访问一个数据对象的唯一且初始的方式。
我们通过一个例子来看看:

int ar [ 10 ] ;
int * par = ar ;
int * restrict restar = ( int * ) malloc ( 10 * sizeof ( int )) ;

注意,指针restar是访问由malloc ()分配的内存的唯一且初始的方式。
因此,它可以由关键字restrict限定。
而指针par既不是初始的,也不是访问数组ar中数据的唯一方式,因此不可以把它限定为restrict。
考虑下面的语句:

for ( n = 0 ; n < 10 ; n ++ )
{
    
par [ n ] += 5 ;
    
restar [ n ] += 5 ;
    
ar [ n ] *= 2 ;
    
par [ n ] += 3 ;
    
restar [ n ] += 3 ;
}

知道了restar是放问它所指向数据块的唯一初始化方式,编译器就可以用具有同样效果的一条语句来代替包含restar的

两个语句。

resatr [ n ] += 8 ;

然而,编译器将两个包含par的语句精简为一个语句将导致计算错误。

par [ n ] += 8 ;

原因是ar[n] *= 2;这条语句在par[n] += 3之前已经改变了par指针所指向数据的值。

restrict的作用:帮助编译器确定使指针进行数值计算时,是否可以进行优化。
可以将关键字restrict作为指针型函数参量的限定词使用。
这意味着编译器可以假定在函数体内没有其它标识符修改指针指向的数据,因而可以试着优化代码,反之则不然。

voie * memcpy ( void * restrict s1 , const void * restrict s2 , size_t n ) ;

关键字restrict有两个读者。
一个是编译器,它告诉编译器可以自由地去做一些有关优化的假定。
一个是用于,它告诉用户仅使用满足restrict要求的参数。

这篇关于类型限定词volatile的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/695509

相关文章

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente