- 浏览: 132652 次
文章分类
最新评论
说明:本文示例摘自《深入理解计算机系统》第五章----优化程序性能。
在程序优化时,对于这样一种现象不得不注意,即存储器别名使用。
那么什么是存储器别名使用呢?
简单来说,就是“两个指针可能同时指向同一个存储地址的情况”。
示例为证,考虑下面的代码序列:
最终t1是多少呢?可能很多人会不假思索就回答3000,然而事实上它是完全有可能等于1000的,这种情况取决于指针p和q是否指向同一个地址,即p是否等于q。
再来看另一个例子:
乍一看,这两个函数似乎相同,其实不然,同样的道理,这样认为的人还是忽视了存储器别名使用的情况,但xp与yp都指向同一片内存时,差异就显示出来了,前者中xp的值会增加4倍,而后者却只增加3倍!
这样的例子还有很多,比如遇到全局变量时,如下例:
此时又如何呢?它们一定会返回同样的结果吗?非也!比如出现这样的情况:
注意此时在func1中f()调用了4次,最终结果为 0+1+2+3= 6, 而func2中却只调用了1次,最终结果为4*0=0!!!
很神奇,不是吗?!所以在优化程序时,知道该注意什么了吧?
存储器别名使用!请深深将其烙印在你脑海中!
在程序优化时,对于这样一种现象不得不注意,即存储器别名使用。
那么什么是存储器别名使用呢?
简单来说,就是“两个指针可能同时指向同一个存储地址的情况”。
示例为证,考虑下面的代码序列:
x = 1000; y = 3000; *q = y; *p = x; t1 = *q;
最终t1是多少呢?可能很多人会不假思索就回答3000,然而事实上它是完全有可能等于1000的,这种情况取决于指针p和q是否指向同一个地址,即p是否等于q。
再来看另一个例子:
void twiddle1(int *xp, int *yp){ *xp += *yp; *xp += *yp; } void twiddle2(int *xp, int *yp){ *xp += 2 * *yp; }
乍一看,这两个函数似乎相同,其实不然,同样的道理,这样认为的人还是忽视了存储器别名使用的情况,但xp与yp都指向同一片内存时,差异就显示出来了,前者中xp的值会增加4倍,而后者却只增加3倍!
这样的例子还有很多,比如遇到全局变量时,如下例:
int f(); int func1(){ return f() + f() + f() + f(); } int func2(){ return 4*f(); }
此时又如何呢?它们一定会返回同样的结果吗?非也!比如出现这样的情况:
int counter = 0; int f(){ return counter++; }
注意此时在func1中f()调用了4次,最终结果为 0+1+2+3= 6, 而func2中却只调用了1次,最终结果为4*0=0!!!
很神奇,不是吗?!所以在优化程序时,知道该注意什么了吧?
存储器别名使用!请深深将其烙印在你脑海中!
发表评论
-
浮点运算指令
2019-05-22 23:13 1502上一节介绍了浮点数与各种数值类型之间的相互转换 ... -
浮点数类型转换指令
2019-05-15 22:37 1585在浮点寄存 ... -
浮点寄存器概述
2019-05-14 22:31 2273本文介绍的浮点寄存器是基于 AVX2(Adva ... -
汇编指令之跳转指令
2019-04-15 00:21 4534正常执行的情况下,指令会按照顺序一条条地执行, ... -
汇编指令之条件码
2019-04-08 21:05 2253在系统底层,除了整数寄存器,CPU 还维护着一 ... -
汇编指令之算术和逻辑操作指令
2019-03-28 22:16 1181下表是 x86-64 ... -
汇编指令之数据传送指令
2019-03-25 21:28 1224在x86-64 中的 ... -
x86-64 中的寄存器与汇编操作数杂述
2019-03-20 21:45 930Intel 中常用 ... -
hello 程序执行背后的故事
2018-12-26 21:48 565源文件 hello. ... -
linux启动服务概述
2017-04-08 02:43 371传统的linux中定义了七个运行级,分别如下: ... -
unix限制
2017-04-04 16:08 533UNIX系统实现定义了很多幻数和常量,其中有很 ... -
linux引导加载程序--GRUB
2017-04-04 04:22 583linux世界里有两种 ... -
存储器映射
2016-06-13 00:12 515注:本文摘自《深入理解计算机操作系统》第九章--虚拟存 ... -
虚拟存储器对存储器管理的作用
2016-06-10 16:00 661注:本文中的大部分内容均是摘录自《深入理解计算机系统》一书,权 ... -
信号处理问题
2016-06-03 08:31 532注:本文摘自《深入理解计算机系统》第8章 --- 异常控制流。 ... -
僵尸进程
2016-05-23 23:57 328在解释僵尸进程的概念之前,我们得先了解这样的一个事实: 一个进 ... -
条件变量基本概念与原理(转载)
2016-05-20 08:54 1518对于条件变量,我一直感到很困惑,搞不清其与互斥锁到底有啥区别, ... -
CPU与磁盘的交互过程
2016-05-19 09:05 1763对于计算机系统底层技术,想必很多人都和我一样不太了解,最近在学 ... -
存储器层次结构中基本的缓存原理
2016-05-19 09:00 624对于操作系统,我们知道,越靠近CPU的存储器,其存储速度就会越 ... -
异常处理
2016-05-19 00:29 389我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们 ...
相关推荐
15.7.4 懒惰函数式程序的优化 239 15.7.5 严格性分析 241 推荐阅读 243 程序设计:编译函数式语言 244 习题 244 第16章 多态类型 246 16.1 参数多态性 246 16.1.1 显式带类型的多态语言 247 16.1.2 多态类型的检查 ...
12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 ...
12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 ...
12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE...
12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法...
12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 ...
12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 ...
12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 ...
12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 ...
在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中...