怎么调可以优化啊,是不是需要改绝地求生硬件优化

1不用软件 自己动手让电脑提速“我刚刚按照高手的推荐新攒了一台主机,为啥性能没有宣称的那么好?”“同样的配置,为啥我的电脑会比别人慢?”& & 上面的这些问题在许多入门用户当中非常常见。当大家费劲千辛万苦,把攒好的机器抱回家的时候,却发现新机器的性能没有想象中的那么出色;或者在与别人的电脑对比的时候,总是要比别人的机器慢。在排除硬件之间的性能差别之外,其实还有一点需要引起重视的,那就是对电脑的优化。& & 优化这个词,笔者相信大家都不会感到陌生。无论是在手机平板还是在笔记本台式机上,都会见到各种优化方法:比如形形色色的优化,或者是系统优化大法,甚至是更加自残的“系统文件删除/修改大法”。而许多人发现在“优化”完成之后,系统的实际性能并没有多少提高。甚至会把系统搞得不稳定甚至崩溃。& & 那么上面所说的都是基于软件的优化方式,毕竟在硬件没有增加性能的前提下,只使用“减少开机启动项”、“删除垃圾文件”这种优化方式甚至有点自欺欺人的意味。大家殊不知,我们攒好的主机很有可能在硬件上还有许多有待挖掘的性能,只是我们不知道如何真正发挥这些硬件的性能。所以在这篇文章中,笔者就来指导大家如何在硬件上“调教”我们的爱机。用软件就能让电脑变快?别闹了……& & 那么在文章的开头,笔者需要指出的是,本文提到的诸多设置可能仅限在DIY组装机上实现。品牌机由于多受限于厂商的设置,不能实现本文提到的一些设置,请用户根据自己的主机自行实践。那么话不多说,让我们一起来开始今天的内容。&|&&2X.M.P.让内存频率爆棚
& & 如果大家经常关注DIY硬件的话,会发现最近内存的变化还是比较大的。这种变化不光是体现在我们直观看到的在价格上,更是在规格上的改变。不知不觉中,我们已经开始脱离DDR3-1333规格的时代了,逐渐地转变到DDR3-1600规格。而在容量上也从2GB、4GB变成了8GB甚至是16GB以上。内存的性能和容量提升上来了,但是我们是否能够真正发挥大容量高频内存的真正实力呢?
64位系统才能够识别大容量内存
& & 既然拥有了大容量内存,那么我们所使用的操作系统就要选择64位系统,这样才能够完全识别内存的所有容量。不过随着64位系统的逐渐普及,越来越多的用户开始接受并习惯64位系统。那么既然容量已经不是非常重要的事情,我们就需要再把目光放到内存频率上。
双通道的内存安装方式需要掌握
& & 另外在安装内存的时候,大家得注意双通道内存的安装方式,否则单通道内存会大大削弱内存性能,导致整机性能下降。如果大家对双通道内存的安装还有疑问的话,可以参考说明上指定的安装方式。
& & 现在内存频率多为1600MHz,有一些能够到1866MHz、2133MHz甚至更高。不过一些用户把内存买回去的时候,会发现这些所谓的高频内存默认频率均为1333MHz,这样的情况会让用户大呼上当。其实对于DDR3规范,并没有包含1600MHz以上的频率,也就是说那些高频内存的频率是不被DDR3规范所规定的,所以只按照规范内的频率让内存运行。如果是在以前,我们想让内存运行在更高的频率上的话,需要手动进行调节,但是现在Intel为了让主板能够更好地支持更高频率的内存,已经推出了X.M.P.规范。
CPU-Z中显示的X.M.P.信息
&主板BIOS可以直接读取X.M.P.信息
& & X.M.P.规范允许内存的SPD信息中包含为内存特别优化的参数。我们只需要在主板BIOS中设置加载相应的信息,便可以将内存频率调节在一个较高的频率下,并且免去了手动逐一调节参数的麻烦。也就是说,有了X.M.P.之后,我们可以在不需要了解内存参数的情况下最大程度地发挥内存的性能。这样普通用户在购买高频内存的时候才能够真正变得有意义。
& & 不过由于X.M.P.是Intel定制的规范,所以目前只能在Intel主板上使用该功能。近日,AMD也推出了相应的规范“AMP”,在原理上基本与X.M.P.保持一致。所以AMD平台想使用这项功能的朋友,可以等一等AMP规范普及后便可以使用了。
3改变磁盘模式释放SSD性能
& & “恭喜您,您的电脑已经打败了全国xx%的电脑!”,这样的比赛每天都会在不少用户的电脑上进行着。我们希望自己的电脑能够开机神速,甚至不惜一切代价都要让电脑开机速度一快再快。于是乎,各种各样的“开机速度优化”的便时兴起来。“删除不必要的开机项”的这种做法虽然会增加少许的启动速度,但是毕竟开机项毕竟早晚都是要启动的,这种拆了东墙补西墙的做法着实不能让笔者接受。
& & 如果说影响着开机速度最大的因素应该就要属硬盘了。如果把时光往前倒几年,我们或许还在会为机械硬盘不成器的性能而苦恼。但是如今,SSD的推出打破了硬盘一直以来的性能瓶颈,将硬盘的传输速度提升到一个新的高度。但是这并不意味着我们购买了SSD就能够完事无忧,还有很多后期的工作需要我们继续完成。&
磁盘是否“4K对齐”一眼便知
& & 首先,由于SSD摒弃了传统硬盘的机械式结构,采用了芯片。Flash芯片的读写机制要求我们的SSD的扇区必须“4K对齐”。这样才能够保证SSD的高性能以及长寿命。为SSD进行4K对齐并不是一件困难的事情,我们在购买新SSD之后,装系统的过程中将SSD进行格式化就能够自动4K对齐,新的Windows 7和Windows 8都支持格式化SSD默认4K对齐,所以不必有太多的担心。&
&& &即使是我们的SSD在存入数据后没有4K对齐也没有关系。我们可以通过第三方软件在不会破坏文件的情况下对SSD进行4K对齐处理。只不过对齐的过程会相对较慢,但是总重新格式化要来的更为方便一些。
磁盘模式直接决定着磁盘性能
& & 另外,无论是SSD还是机械硬盘,我们在连接的SATA接口时要注意安装在SATA3接口上以保证不会出现传输带宽的瓶颈。除了在硬件上确保安装无误,在BIOS中我们还需要对磁盘模式进行设置。这一步在入门主板中尤为重要,因为入门主板的默认磁盘模式多为“IDE模式”,该模式下SSD的性能会受到很大的制约。所以在组装一台新电脑之后,检查磁盘模式是一项非常重要的工作。
& & 有了上面的设置,我们完全就不用理会开机启动项有多少了,磁盘性能的提升才是最根本的提升开机速度的法宝。既对系统软件无害,又能够一劳永逸地保持磁盘性能的高水平发挥。
4节省电力 让供电模块懂得休息
& & 电脑作为一件家用电器,与电视冰箱空调一样,也是必须通电才能够工作的一种产品。既然通电,我们就不得不说一说电脑的耗电。不过对于许多消费者来说,相比于电脑,好像冰箱或者空调的功耗关注的更多一些。虽然现在主流平台的功耗并不算高,但是秉承着节能的理念。笔者认为做好电脑的节能工作还是非常重要的。
& & 但是谈到电脑功耗,我们又会发现一个问题,那就是我们的电脑的功耗往往与性能成正比,也就是说,如果我们想要性能更好的电脑,就需要支付更多的电费。其实笔者也肯定这个观点,但是我们还是可以在不更换硬件的情况下降低整机的功耗,而且你的电脑越高级,可能节省的电费就会更多。
日常应用我们是用不到这么多相供电的
& & 我们所使用的电脑,功耗最大的两大来源是处理器和显卡,其中负责为处理器和显卡供电的部分我们叫做供电模块。现在在高端以及显卡上,厂商往往会布置十余相供电以保证平台的超频性能。但是在实际的使用过程中,我们可能用不到这么多相数的供电。如果我们不进行调节的话,所有供电模块会同时启用。每一项供电都会有相应的电能损耗,从而消耗更多的电能。所以我们需要想办法在日常使用的时候关掉一部分供电模块。
中高端主板的BIOS里可以详细调节供电模块的工作模式
& & 好在对于大多数中高端主板来说,BIOS里面都包含了供电模块的选项。我们可以通过设置手动降低供电模块的工作负载,这样就能够在电脑待机或者小负载应用的情况下“关闭”数相供电,从而降低不必要的功耗。
调整前的整机待机与游戏时的功耗
调整后的整机待机以及游戏时的功耗
& & 在实际的测试中,我们可以清楚地看到,更改供电模块运行模式之后,平台的整体功耗有了明显的下降。另外,供电模块实际使用的相数降低后,不仅降低了整机的运行功耗,同时由于多余的通电模块不会再有任何负载,所以就不会发热,这样供电模块的整体发热量也会降低不少。这样的调节可谓是一举两得。
5点点鼠标 板载声卡也能很精彩
& & 现在的都会板载声卡以及网卡,这种“理所当然”的现状都已经让我们忘掉了是什么时候开始抛弃独立声卡以及显卡了。当然,独立声卡以及网卡仍然在高端市场上有所建树,为需要更好品质的高端用户所选择。
& & 独立声卡和网卡在高端市场上风起云涌,不过也不意味着板载声卡以及网卡一直裹足不前。现在高清多声道板载声卡以及千兆板载网卡已经普遍出现在主流主板产品中。国内的网络限制了千兆网卡的发挥,所以我们更多地会关注声卡的变化。
HD Audio相比AC'97有着很大的改进
& & 从AC'97标准到现在的HD Audio标准,板载声卡的“硬指标”已经有了天翻地覆的改变。现在的板载声卡完全可以和入门级的独立声卡相抗衡。并且也能够提供光纤以及同轴输出。硬指标上去了,板载声卡却没有得到用户相应的肯定。
& & 声音的好坏是一个非常主观的东西,每个人的标准都不一样,所以笔者在这里并不和大家讨论主观听感的东西。如果单看客观测试成绩的话,现在的好多用户都没有真正用好自己的板载声卡。
& & 目前板载声卡的输出指标可以说是非常出色的,主流的产品都可以输出192kHz/24bit这样高指标的声音,可是要想输出这样高指标的声音,我们还需要对板载声卡进行设置。
板载声卡的控制面板中可以选择更高的参数进行设置
& & 首先,正确安装驱动是非常有必要的,只有正确的驱动才能够保证声卡的高品质输出。在安装驱动完成后,我们还需要到系统的控制面板中找到驱动相应设置面板来更改声卡的输出格式。板载声卡的默认设置一般为48kHz/16bit,我们需要手动调高输出格式才能够得到更好的输出指标。
只需要简单修改,得到的指标就会有非常大的提升
& & 从测试结果上看,只需要一个简单的设置,就可以让我们的声卡性能提升一个档次。指标提升后的板载声卡的测试成绩有了明显的提高。这样的成绩可能在听MP3上没有的改变,但是对于蓝光视频那种高清音频的输出,其声音的变化还是可以让用户感受到的。
6一键超频 瞬间让菜鸟变高手
& & 前面我们提到一系列的硬件调整方案。都是尽可能地发挥我们电脑硬件的最大性能。但是不管我们如何优化,都不可能超过硬件本身性能的最大值。所以想要超越硬件性能本身的界限,我们就需要为平台进行超频。
& & 一听超频,不少朋友就会产生恐惧感。其实随着板卡厂商对产品的设计更加人性化,超频的门槛已经降低了很多。我们再也不需要没有安全性的跳线,也不需要调节大量的参数,只需要简单设置就能够完成超频操作。
Intel处理器中只有“K”、“X”为后缀的型号才能超频
& & 现在Intel与AMD的产品在超频限制上是不太一样的。虽然他们的中低端产品都是锁倍频的,但是受限于Intel处理器的架构,Intel处理器的外频能够调整的幅度非常小,AMD处理器则是没有问题。我们的处理器主频=外频*倍频,所以Intel处理器型号中只有以“K”或者“X”为后缀的产品才能支持超频。大家需要看准自己电脑的情况再做出相应的操作。
一键超频在主流中非常常见
& & 比起处理器,显卡的限制要少很多,超频也更加方便。不过无论是显卡还是主板,其产品线中都有包含“一键超频”功能的产品,如果大家对于超频很感兴趣又不会设置的话可以考虑购买这些产品。即使是你对超频有一定了解,也要秉持着“小超怡情,大超伤身,强超灰飞烟灭”的态度,适度超频能够让电脑拥有更好的性能,但是因为超频把硬件弄坏了的话,就得不偿失了。
【总结】:
& & 经以上几步操作,笔者相信你的电脑就会有非常大的性能提升,并且这样的提升应该比优化有效得多。与其将期待托付给优化软件,倒不如自己动手,尝试对自己的硬件平台进行优化。不仅效果显著,并且没有什么副作用。如果用来形容的话,许多人的电脑都是处在亚健康的状态,如何将自己电脑的性能最大化,应该是每一个人应该做到的事情。
& &&其实我们的电脑是很强大的,只不过是你没有挖掘到它真正的实力。而在你挖掘性能的过程中,你不仅能够更加了解自己的电脑,更能够发现其中的乐趣。所以如果你觉得你的电脑不够快的话,赶紧动手试试,或许你就会对自己的电脑有新的感受。
鲁大师祸害各位DIY机油已久,体检了10多回,再跑跑奇葩的显卡性能测试,总觉得自己的新电脑也没之前砖家叫兽说的那么神乎。其实通过一些小技巧就可以让PC性能得到看得见的提升,还不试试?
主芯片组 CPU插槽
投诉欺诈商家:
天津重庆哈尔滨沈阳长春石家庄呼和浩特西安太原兰州乌鲁木齐成都昆明贵阳长沙武汉郑州济南青岛烟台合肥南京杭州东莞南宁南昌福州厦门深圳温州佛山宁波泉州惠州银川
本城市下暂无经销商
4¥6695¥8796¥9997¥6998¥29999¥69910¥669君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
完善改装硬件教学设备实现体育教育资源最优化.doc
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口[优化与硬件] 2k带鱼屏画质调什么选项最科学?
我肯定是想调越高越好, 但是听说某些画质选项越高越坑爹?
我知道守望先锋就是有几个选项调低了后可以去掉草丛之类的反而视野更清楚, 不知道吃鸡有没有这种说法?配置是1080ti+1600现在默认的画质好的时候80左右激烈的时候会降到40~50
稳定60是底线, 80就满足了 100以上显示器也显示不了。说起来1080ti让我失望啊.. 还想着能用3年呢 这第一年就没法开全高了 这游戏画质也没有多好感觉
这游戏吗~~纹理调高~其他调最低才能更好杀人~这游戏真不看画质~的路过
我反正是能调多高调多高,玩游戏画面好肯定是最主要的啊。至于低画质看远处伏地魔,正常情况下你几局都不一定碰的到一个,又不是职业玩家,为了这个牺牲画面感觉没意思啊。
树木 阴影调到最低。(道听途说)
[b]Reply to [pid=]Reply[/pid] Post by [uid=]无有识死啊[/uid] ( 10:57)[/b]视距也要调低么? 会不会看不到远处的人?
树木要调低点 树木高了很茂盛 肯定看不到幻影坦克
[quote][pid=]Reply[/pid] [b]Post by [uid=2311044]预备钥匙[/uid] ( 11:28):[/b][b]Reply to [pid=]Reply[/pid] Post by [uid=]无有识死啊[/uid] ( 10:57)[/b]视距也要调低么? 会不会看不到远处的人?[/quote]我视距调得低吧~纹理调得高~其他全最低~这游戏先看到人太重要
[b]Reply to [pid=]Reply[/pid] Post by [uid=2311044]预备钥匙[/uid] ( 11:28)[/b]视距和看人和载具无关C中的volatile用法(允许随时都会改变的值,且不可优化) - CSDN博客
C中的volatile用法(允许随时都会改变的值,且不可优化)
=================================================&转载一&===========================================================
&volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发(中断服务程序触发),所以经常会写出这样的程序:
void test()
while(flag==0);
& & 这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。变量flag的值由别的程序更改,这个程序可能是某个硬件中断服务程序。例如:如果某个按钮按下的话,就会对DSP产生中断,在按键中断程序中修改flag为1,这样上面的程序就能够得以继续运行。但是,编译器并不知道flag的值会被别的程序修改,因此在它进行优化的时候,可能会把flag的值先读入某个寄存器,然后等待那个寄存器变为1。如果不幸进行了这样的优化,那么while循环就变成了死循环,因为寄存器的内容不可能被中断服务程序修改。为了让程序每次都读取真正flag变量的值,就需要定义为如下形式:
& & 需要注意的是,没有volatile也可能能正常运行,但是可能修改了编译器的优化级别之后就又不能正常运行了。因此经常会出现debug版本正常,但是release版本却不能正常的问题。所以为了安全起见,只要是等待别的程序修改某个变量的话,就加上volatile关键字。
volatile的本意是“易变的”
& & & 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:
static int i=0;
int main(void)
if (i) do_something();
/* Interrupt service routine. */
void ISR_2(void)
& & 程序的本意是希望ISR_2中断产生时,在main当中调用do_something函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致do_something永远也不会被调用。如果变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。
& & 一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
二、volatile 的含义
& & &volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的,它有下面的作用:&
&1 不会在两个操作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile就是告诉编译器这种情况。
2 不做常量合并、常量传播等优化,所以像下面的代码:&
volatile int i = 1;&
if (i & 0) ...&
if的条件不会当作无条件真。&
3 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值操作,然而对Memory Mapped IO的处理是不能这样优化的。&
& & 前面有人说volatile可以保证对内存操作的原子性,这种说法不大准确,其一,x86需要LOCK前缀才能在SMP下保证原子性,其二,RISC根本不能对内存直接运算,要保证原子性得用别的方法,如atomic_inc。&
& & 对于jiffies,它已经声明为volatile变量,我认为直接用jiffies++就可以了,没必要用那种复杂的形式,因为那样也不能保证原子性。&
& & 你可能不知道在Pentium及后续CPU中,下面两组指令&
inc jiffies&
mov jiffies, %eax&
mov %eax, jiffies&
作用相同,但一条指令反而不如三条指令快。
三、编译器优化 → C关键字volatile →
memory破坏描述符zz
& & “memory”比较特殊,可能是内嵌汇编中最难懂部分。为解释清楚它,先介绍一下编译器的优化知识,再看C关键字volatile。最后去看该描述符。&
1、编译器优化介绍&
& & &内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。对常规内存进行优化的时候,这些优化是透明的,而且效率很好。由编译器优化或者硬件重新排序引起的问题的解决办法是在从硬件(或者其他处理器)的角度看必须以特定顺序执行的操作之间设置内存屏障(memory
barrier),linux 提供了一个宏解决编译器的执行顺序问题。&
void Barrier(void)&
& & &这个函数通知编译器插入一个内存屏障,但对硬件无效,编译后的代码会把当前CPU寄存器中的所有修改过的数值存入内存,需要这些数据的时候再重新从内存中读出。&
2、C语言关键字volatile&
& & &C语言关键字volatile(注意它是用来修饰变量而不是上面介绍的__volatile__)表明某个变量的值可能在外部被改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新存取。该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程,例如:&
DWORD __stdcall threadFunc(LPVOID signal)&
int* intSignal=reinterpret_cast&int*&(signal);&
*intSignal=2;&
while(*intSignal!=1)&
sleep(1000);&
return 0;&
& & &该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:&
mov ax,signal&
if(ax!=1)&
goto label&
& & &对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。记住,C 编译器是没有线程概念的!这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:&
mov ax,signal&
if(ax!=1)&
goto label&
3、Memory&
& & & 有了上面的知识就不难理解Memory修改描述符了,Memory描述符告知GCC:&
1)不要将该段内嵌汇编指令与前面的指令重新排序;也就是在执行内嵌汇编代码之前,它前面的指令都执行完毕&
2)不要将变量缓存到寄存器,因为这段代码可能会用到内存变量,而这些内存变量会以不可预知的方式发生改变,因此GCC插入必要的代码先将缓存到寄存器的变量值写回内存,如果后面又访问这些变量,需要重新访问内存。&
& & &如果汇编指令修改了内存,但是GCC 本身却察觉不到,因为在输出部分没有描述,此时就需要在修改描述部分增加“memory”,告诉GCC 内存已经被修改,GCC 得知这个信息后,就会在这段指令之前,插入必要的指令将前面因为优化Cache 到寄存器中的变量值先写回内存,如果以后又要使用这些变量再重新读取。&
& & &使用“volatile”也可以达到这个目的,但是我们在每个变量前增加该关键字,不如使用“memory”方便。
=================================================
转载二 ===========================================================
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。&
volatile int i=10;&
volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。&
而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。
/**********************
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:&
1) 并行设备的硬件寄存器(如:状态寄存器)&
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)&
3) 多线程应用中被几个任务共享的变量&
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。&
1)一个参数既可以是const还可以是volatile吗?解释为什么。&
只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。&
2); 一个指针可以是volatile 吗?解释为什么。&
当一个中服务子程序修该一个指向一个buffer的指针时。&
3); 下面的函数有什么错误:&
int square(volatile int *ptr)&
return *ptr * *&
下面是答案:&
1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。&
2); 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。&
3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:&
int square(volatile int *ptr)&
return a *&
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!
正确的代码如下:&
long square(volatile int *ptr)&
return a *&
位操作(Bit manipulation)
//*********************
嵌入式编程中经常用到 volatile这个关键字,在网上查了下他的用法可以归结为以下两点:
一:告诉compiler不能做任何优化
比如要往某一地址送两指令:&
&& int *ip =...; //设备地址&
&& *ip = 1; //第一个指令&
&& *ip = 2; //第二个指令&
&& 以上程序compiler可能做优化而成:&
&& int *ip = ...;&
&& *ip = 2;&
&& 结果第一个指令丢失。如果用volatile, compiler就不允许做任何的优化,从而保证程序的原意:&
&& volatile int *ip = ...;&
&& *ip = 1;&
&& *ip = 2;&
&& 即使你要compiler做优化,它也不会把两次付值语句间化为一。它只能做其它的优化。这对device driver程序员很有用。
二:表示用volatile定义的变量会在程序外被改变(随时都会有不可见的改变,所以要摆脱C的思维转为嵌入式思维),每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用。
&& 如&&&&&
&&&&&&& a=0;&
&&&&&& while(!a){&
&&&&&& }&&&
&&&&&& doother();&
&& 如果没有 volatile doother()不会被执行
本文已收录于以下专栏:
相关文章推荐
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存...
用volatile关键字防止变量被编译器优化
volatile 是在C ,C++,Java等中语言中的一种修饰关键字。
这个关键字在嵌入式系统中...
C语言的那些小秘密之volatile
/yc_sunniwell/archive//1777432.html
1. 为什么用volatile?
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进...
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而...
/yc_sunniwell/archive//1764231.html
volatile提醒编译器它后面所定义的变量随时都有可...
他的最新文章
讲师:钟钦成
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 数据库硬件优化 的文章

 

随机推荐