c keyword restrict

2024-05-28 06:58
文章标签 keyword restrict

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

轉載自 http://baike.baidu.com/view/3962518.htm

restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针。restrict 的出现是因为 C 语言本身固有的缺陷,C 程序员应当主动地规避这个缺陷,而编译器也会很配合地优化你的代码

 

考虑下面的例子:
int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;
这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。
那么:
for(n=0;n<10;n++)
{
par[n]+=5;
restar[n]+=5;
ar[n]*=2;
par[n]+=3;
restar[n]+=3;
}
因为restar是访问分配的内存的唯一且初始的方式,那么 编译器可以将上述对restar的操作进行优化:
restar[n]+=8;
而par并不是访问 数组ar的唯一方式,因此并不能进行下面的优化:
par[n]+=8;
因为在par[n]+=3前,ar[n]*=2进行了改变。使用了 关键字restrict, 编译器就可以放心地进行优化了。
这个关键字据说来源于古老的FORTRAN。有兴趣的看看这个。
C库中有两个函数可以从一个位置把字节复制到另一个位置。在 C99标准下,它们的原型如下:
void * memcpy(void * restrict s1, const void * restrict s2, size_t n); (我在man page中,看不到restrict這個 keyword,但這不重要,只要理解下面的解釋涵義即可)
void * memmove(void * s1, const void * s2, size_t n);
这两个函数均从s2指向的位置复制n字节数据到s1指向的位置,且均返回s1的值。两者之间的差别由 关键字restrict造成,即memcpy()可以假定两个内存区域没有重叠。memmove()函数则不做这个假定,因此,复制过程类似于首先将所有字节复制到一个临时缓冲区,然后再复制到最终目的地。如果两个区域存在重叠时使用memcpy()会怎样?其行为是不可预知的,既可以正常工作,也可能失败。在不应该使用memcpy()时,编译器不会禁止使用memcpy()。因此,使用memcpy()时,您必须确保没有重叠区域。这是程序员的任务的一部分。[2]
关键字restrict有两个读者。一个是编译器,它告诉 编译器可以自由地做一些有关优化的假定。另一个读者是用户,他告诉用户仅使用满足restrict要求的参数。一般, 编译器无法检查您是否遵循了这一限制,如果您蔑视它也就是在让自己冒险。

这篇关于c keyword restrict的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

《Efficient Batch Processing for Multiple Keyword Queries on Graph Data》——论文笔记

ABSTRACT 目前的关键词查询只关注单个查询。对于查询系统来说,短时间内会接受大批量的关键词查询,往往不同查询包含相同的关键词。 因此本文研究图数据多关键词查询的批处理。为多查询和单个查询找到最优查询计划都是非常复杂的。我们首先提出两个启发式的方法使关键词的重叠最大并优先处理规模小的关键词。然后设计了一个同时考虑了数据统计信息和搜索语义的基于cardinality的成本估计模型。 1.

《BLINKS: Ranked Keyword Searches on Graphs》——论文笔记

ABSTRACT 目前关键词查询的技术缺陷:poor worst-case performance, not taking full advantage of indexes, and high memory requirements. 本文方法:BLINKS, a bi-level indexing and query processing scheme for top-k keyword

RESTful学习笔记 --- TypeError: __init__() got an unexpected keyword argument 'method'

最近在写restful api的时候一直报出如下的错误, 原因是因为methods参数写成了method,因此正确的写法就是加上's',写成methods 如:

如果你也面试 07 restrict

restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。 举例 int pthread_rwlock_init(pthread_rwlock_t * restrict rwlock, const pthread_rwlockattr_t * restrict rwlocka

修改__RESTRICT和__restrict为其他值

ps -e | grep /var 找到AppBinary(二进制文件)路径 把AppBinary复制出二进制编辑器(iHex等)修改__RESTRICT和__restrict为其他值。(比如:__RRRRRRRR 和 __rrrrrrrr。保证长度不变就行啦)【这里长度要保持不变】ldid -S AppBinary 重签名。 【下载后chmod 777 ldid 】Cydia中安装 AppSyn

gRPC小错记录:TypeError: new() got an unexpected keyword argument 'serialized_options

今天调试gRPC报了这个错误:TypeError: new() got an unexpected keyword argument 'serialized_options Google了一下,说是protobuf版本的问题,客户端和服务端的protobuf版本不一样,把客户端的protobuf卸载重新安装跟服务端一样版本后就好了。 protobuf 的版本是 3.6.1  https://

当前 Python 版本中所有保留字keyword.kwlist

【小白从小学Python、C、Java】 【考研初试+复试+毕业设计】 【Python基础+AI+数据分析】 当前 Python 版本中 所有保留字 keyword.kwlist [太阳]选择题 根据给定的Python代码,哪个选项是正确的? import keyword print("【执行】keyword.kwlist") keyword.kwlist A选项:kwlist函数用来判断一

PyTorch 加载模型出现 got an unexpected keyword argument ‘assign‘

PyTorch 加载模型出现 got an unexpected keyword argument ‘assign’ flyfish 错误提示 common\_base_model.py", line 433, in loadmodel.load_state_dict(content["state_dict"], strict=True, assign=True)TypeError: Mod

es版本2.x的string和5.x的keyword,text的区别和联系

一 es2.x和es5.x版本定义字符串类型 2.x版本的es string的类型 全文检索   分词   index=analysis  按单个字符匹配    被称作analyzed字符串 关键词搜索 不分词  index=not_analysis  按照整个文本进行匹配  被称为not-analyzed字符串 index=no  表示不被索引,产生的后果就是不能被检索到 strin

类学习之Use Base keyword to call method in parent class from subclass

使用基础关键字从子类调用父类方法 #include <iostream>using namespace std;class Base {public:void display(void) { cout << "This is the base class" << endl; };};class Derived: public Base {public:void display(void