C语言关键字RESTRICT介绍
2022-03-31 09:59:01 31
学习C语言也有好长时间了,相信大家在学习C语言的过程中也都有所收获,不过,也应该遇到了许多问题。今天小编在这里就帮同学们介绍一下怎么了解restrict这个词。
要理解 restrict,先要知道什么是 Pointer aliasing。
Pointer aliasing 是指两个或以上的指针指向同一数据,例如
int i = 0;
int *a = &i;
int *b = &i;
这样会有什么问题呢?
如果编译器采用最安全的假设,即不理会两个指针会否指向同一数据,那么通过指针读写数据是很直观的。
然而,这种假设会令编译器无法优化,例如:
int foo(int *a,int *b)
{
*a = 5;
*b = 6;
return *a + *b; // 不一定是 11!
}
如果 a 和 b 都指向同一数据,*b = 6 会导致 *a = 6,返回12。所以编译器在做 *a + *b 的时候,需要重新读取 *a 指向的数据:
foo:
movl $5,(%rdi) # 存储 5 至 *a
movl $6,(%rsi) # 存储 6 至 *b
movl (%rdi),%eax # 重新读取 *a (因为有可能被上一行指令造成改变)
addl $6,%eax # 加上 6
ret
如果我们确保两个指针不指向同一数据,就可以用 restrict 修饰指针类型:
int rfoo(int *restrict a,int *restrict b)
{
*a = 5;
*b = 6;
return *a + *b;
}
编译器就可以根据这个信息,做出优化:
rfoo:
movl $11,%eax # 在编译期已计算出 11
movl $5,(%rsi) # 存储 6 至 *b
ret
但如果用了 restrict 去修饰两个指针,而它们在作用域内又指向同一地址,那么是未定义行为。
总括而言,restrict 是为了告诉编译器额外信息(两个指针不指向同一数据),从而生成更优化的.机器码。注意,编译器是无法自行在编译期检测两个指针是否 alias。如使用 restrict,程序员也要遵守契约才能得出正确的代码(指针不能指向相同数据)。
以个人经验而言,编写代码时通常会忽略 pointer aliasing 的问题。更常见是在性能剖测时,通过反编译看到很多冗余的读取指令,才会想到加入 restrict 关键字来提升性能。
- 标签列表
-
- 作文
- 其他类
- 体裁作文
- 节日作文
- 高中作文
- 小学生作文
- 语文
- 美文
- 教育
- 句子
- 阅读
- 古诗文
- 文学赏析
- 大全
- 问答
- 读后感
- 写作指导
- 外语
- 外语课堂
- 名著阅读
- 字数作文
- 祝福语
- 词汇
- 爱好
- 唐代诗人
- 作文素材
- 学历类
- 瑞文网
- 交际礼仪文书
- 歌词
- 高考
- 散文
- 励志
- 观后感
- 古籍
- 计算机类
- 职场
- 造句
- 教案
- 外语类
- 资格证类
- 古诗
- 语录名言
- 阅读答案
- 人物作文
- 书画
- 学科教育
- 句子大全
- 日常行政公文
- 总结
- 课文大全
- 规章制度
- 知识
- 宋代诗人
- 板报大全
- 成语大全
- 近义词
- 诗词
- 工作总结
- 初一作文
- 手抄报
- 诗
- 试题
- 优美句子
- 节日庆典
- 职业技能
- 诗句
- 好词好句
- 诗歌
- 春节
- 现代作家
- 关于什么的作文
- 事务文书
- 名言语录
- 求学指南
- 高校排名
- 素材
- 自然作文
- 教学设计
- 书信函范文
- 词语
- 学生范文
- 大学
- 对联
- 读后感大全
- 演讲稿
- 琴棋
- 初二作文
- 初三作文
- 文艺体育
- 乐谱
- 赏析
- 学习资料
- 语录