- 浏览: 142435 次
文章分类
最新评论
说明:本文示例摘自《深入理解计算机系统》第五章----优化程序性能。
在程序优化时,对于这样一种现象不得不注意,即存储器别名使用。
那么什么是存储器别名使用呢?
简单来说,就是“两个指针可能同时指向同一个存储地址的情况”。
示例为证,考虑下面的代码序列:
最终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 1575上一节介绍了浮点数与各种数值类型之间的相互转换 ... -
浮点数类型转换指令
2019-05-15 22:37 1710在浮点寄存 ... -
浮点寄存器概述
2019-05-14 22:31 2590本文介绍的浮点寄存器是基于 AVX2(Adva ... -
汇编指令之跳转指令
2019-04-15 00:21 4799正常执行的情况下,指令会按照顺序一条条地执行, ... -
汇编指令之条件码
2019-04-08 21:05 2360在系统底层,除了整数寄存器,CPU 还维护着一 ... -
汇编指令之算术和逻辑操作指令
2019-03-28 22:16 1383下表是 x86-64 ... -
汇编指令之数据传送指令
2019-03-25 21:28 1289在x86-64 中的 ... -
x86-64 中的寄存器与汇编操作数杂述
2019-03-20 21:45 993Intel 中常用 ... -
hello 程序执行背后的故事
2018-12-26 21:48 608源文件 hello. ... -
linux启动服务概述
2017-04-08 02:43 399传统的linux中定义了七个运行级,分别如下: ... -
unix限制
2017-04-04 16:08 579UNIX系统实现定义了很多幻数和常量,其中有很 ... -
linux引导加载程序--GRUB
2017-04-04 04:22 625linux世界里有两种 ... -
存储器映射
2016-06-13 00:12 553注:本文摘自《深入理解计算机操作系统》第九章--虚拟存 ... -
虚拟存储器对存储器管理的作用
2016-06-10 16:00 696注:本文中的大部分内容均是摘录自《深入理解计算机系统》一书,权 ... -
信号处理问题
2016-06-03 08:31 562注:本文摘自《深入理解计算机系统》第8章 --- 异常控制流。 ... -
僵尸进程
2016-05-23 23:57 361在解释僵尸进程的概念之前,我们得先了解这样的一个事实: 一个进 ... -
条件变量基本概念与原理(转载)
2016-05-20 08:54 1580对于条件变量,我一直感到很困惑,搞不清其与互斥锁到底有啥区别, ... -
CPU与磁盘的交互过程
2016-05-19 09:05 1840对于计算机系统底层技术,想必很多人都和我一样不太了解,最近在学 ... -
存储器层次结构中基本的缓存原理
2016-05-19 09:00 668对于操作系统,我们知道,越靠近CPU的存储器,其存储速度就会越 ... -
异常处理
2016-05-19 00:29 424我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们 ...
相关推荐
本节将深入探讨该系列微控制器的存储器与总线架构,帮助开发者更好地理解其内部工作原理及优化策略。 #### 二、多层AHB总线矩阵 多层AHB(Advanced High-performance Bus)总线矩阵是STM32F2的一个关键特性,它...
ARM存储器组织和异常中断是嵌入式系统设计中的核心概念,主要涉及到数据的存储方式、存储层次结构、片上存储器的使用以及异常中断的处理机制。在ARM架构中,存储器组织对于系统的性能和效率有着至关重要的影响。 ...
- **程序执行细节**:包括程序的启动流程、如何编译和链接,以及如何使用OpenOCD工具将程序烧录至STM32芯片内部的Flash。 - **程序运行环境**:定义了程序执行时的存储器映射,包括FLASH和RAM的分配情况。 2. **...
Flash存储器控制器的设计旨在简化编程流程,提供了一套完善的控制逻辑。其中包括Flash Protection(FMPRE、FMPPEn)、Flash Timing(USECRL)等功能,使得开发人员能够轻松地进行Flash的编程和保护设置。 ### 四、...
程序存储器、数据存储器、寄存器和I/O端口均位于一个4GB的地址空间内,且按照小端格式编码。嵌入式SRAM包括备份SRAM和系统SRAM,其中备份SRAM在STM32F405xx/07xx和STM32F415xx/17xx上有4KB,系统SRAM则有不同大小的...
**图形用户界面**是一种使用图像和图标与计算机程序交互的方式,使用户能够更容易地使用软件。 ##### HDET (High-power detector) **高功率探测器**是一种能够检测高功率信号的设备。在无线通信测试和监控中具有...
它可以帮助开发者实现对存储器的保护,防止程序运行时出现错误访问存储器的问题。 - MPU支持多个存储器区域的定义,每个区域可以有不同的访问权限。 3. **调试端口(DAP)** - **DAP**是Cortex-M3内核提供的调试...
单片机,又被称为微控制器(Microcontroller)和嵌入式控制器(Embedded Controller),是一种将中央处理器(CPU)、存储器(包括数据存储器和程序存储器)以及输入/输出(I/O)接口通过内部总线集成在单一芯片上的...
对于程序优化,C54x C语言提供了多种技巧,如内联函数、循环展开和存储器访问优化,以充分利用DSP的硬件特性,提高代码执行效率。 在深入学习TMS320C54x DSP的C语言编程时,理解这些基本元素和它们与ANSI C的异同至...
ARM处理器的存储体系结构和异常中断管理对于优化程序执行效率和系统响应至关重要。下面将详细讲解这些知识点。 首先,ARM存储器组织包括多种数据类型和存储格式。有符号数和无符号数分别支持8位、16位和32位的大小...
- **数字IC**:专指使用二进制逻辑的集成电路,包括微处理器、微控制器、存储器等。 这个压缩包中的"数字IC设计流程与工具.pdf"很可能详细阐述了上述过程,并可能包含对具体工具的使用教程和案例分析,对于学习和...
1. **延时函数的优化**:代码中的`delay()`函数过于简单,应使用定时器或其他方法实现更准确的延时,以提高程序的稳定性和可靠性。 2. **错误处理**:增加错误检测机制,例如在读写操作后检查返回状态,确保数据...
符号表是编程中的一种实用工具,它提供了变量和常量的别名,使得程序更易读且更少出错。配置信息则涉及到了硬件配置和系统设置,确保设备与软件匹配。 打印预览和页面设置在生成硬拷贝文档时起着重要作用,它们可以...
STM32采用了统一的4GB线性地址空间,将程序存储器、数据存储器、寄存器和I/O端口组织在一起。此外,STM32还支持位段映射技术,可以通过特定的地址计算公式来实现对单个位的访问: \[ \text{bit_word_addr} = \text{...
"使用类别索引搜索位置.pdf" 这个文件很可能详细介绍了如何在特定的系统或应用程序中实现这一功能,包括可能的算法、优化技巧以及实际操作步骤。对于开发者来说,理解并掌握这种技术能够提升系统的性能,提供更好的...
30. **程序控制指令**:改变程序执行流程,如跳转、子程序调用等。 31-32. **Cache目的**:减少CPU访问主存的时间,提高性能。 33-34. **并行级别**:从指令级到程序级,再到作业级,表示并行处理的粒度逐步增大。...
15.7.4 懒惰函数式程序的优化 239 15.7.5 严格性分析 241 推荐阅读 243 程序设计:编译函数式语言 244 习题 244 第16章 多态类型 246 16.1 参数多态性 246 16.1.1 显式带类型的多态语言 247 16.1.2 多态类型的检查 ...