- 相關(guān)推薦
C語(yǔ)言初始化效率問題及關(guān)鍵字解釋
C語(yǔ)言是一門通用計(jì)算機(jī)編程語(yǔ)言,應(yīng)用廣泛。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。下面是小編整理的C語(yǔ)言初始化效率問題及關(guān)鍵字解釋,希望能夠幫助到大家。
一、初始化效率
1、在靜態(tài)變量的初始化中,我們可以把可執(zhí)行程序文件想要初始化的值放在當(dāng)程序執(zhí)行時(shí)變量將會(huì)使用的位置。當(dāng)可執(zhí)行文件載入到內(nèi)存時(shí),這個(gè)已經(jīng)保存了正確初始值的位置將賦值給那個(gè)變量,完成這個(gè)任務(wù)并不需要額外的時(shí)間,也不需要額外的指令,變量將會(huì)得到正確的值、
2、自動(dòng)變量當(dāng)程序鏈接時(shí)還無(wú)法判斷自動(dòng)變量的存儲(chǔ)位置。事實(shí)上,函數(shù)的局部變量在函數(shù)的每次調(diào)用中可能占據(jù)不同的位置。基于這個(gè)理由,自動(dòng)變量沒有缺省的初始值,而顯示的初始化將在代碼塊的其實(shí)出插入一條隱式的賦值語(yǔ)句。
一句話總結(jié);局部變量的初始化與分開寫毫無(wú)區(qū)別
即什么時(shí)候使用變量什么時(shí)候聲明,盡量重用,不要讓他隱式初始化,浪費(fèi)內(nèi)存static 關(guān)鍵字的修飾。
當(dāng)它用于函數(shù)定義時(shí),或用于代碼塊之外的變量聲明時(shí),static關(guān)鍵字用于修改標(biāo)識(shí)符的鏈接屬性,從external改為internal,但標(biāo)識(shí)符的存儲(chǔ)類型和作用域不受影響。用這種方式聲明的函數(shù)或變量只能在聲明他們的源文件中訪問。
總結(jié):
一下以文件解釋
int a;
//a 變量存儲(chǔ)在靜態(tài)內(nèi)存
特點(diǎn):
在程序運(yùn)行之前創(chuàng)建
可以被其他的C文件訪問以及它的下方函數(shù)使用
初始化值為0
=================
static int a;
特點(diǎn):在程序運(yùn)行之前存在
靜態(tài)內(nèi)存存儲(chǔ)
不能被其他文件訪問
================
代碼塊中的變量
static int a ;
靜態(tài)變量
與int a ;(局部變量)
的區(qū)別是:
一個(gè)存儲(chǔ)在靜態(tài)內(nèi)存 也就是普通內(nèi)存
另一個(gè)是局部變量,也就是運(yùn)行時(shí)堆棧
函數(shù)上添加static的話:
不能被其他的文件訪問該函數(shù)
幾個(gè)關(guān)鍵字的處理
static 靜態(tài)內(nèi)存
auto 運(yùn)行時(shí)堆棧
register 硬件寄存器
external 引用外部文件變量函數(shù)
internal 引用內(nèi)部文件變量函數(shù)
=======================
關(guān)于代碼塊變量被static修飾
保證該函數(shù)多次調(diào)用時(shí),我們?yōu)榱朔乐乖撟兞坎蛔?/p>
進(jìn)行的處理比如我們進(jìn)行了多次的調(diào)用
二、關(guān)鍵字解釋
變量的存儲(chǔ)類型(storage class )是指存儲(chǔ)變量值的內(nèi)存類型。變量的存儲(chǔ)類型決定變量何時(shí)創(chuàng)建、何時(shí)銷毀以及它的值將保持多久。有三個(gè)地方可以用于存儲(chǔ)變量:普通內(nèi)存、運(yùn)行時(shí)堆棧、硬件寄存器。在這三個(gè)地方存儲(chǔ)的變量具有不同的特性。
變量的缺省存儲(chǔ)類型取決于它的聲明位置。凡是在任何代碼塊之外聲明的變量總是存儲(chǔ)于靜態(tài)內(nèi)存中,也就是不屬于堆棧的內(nèi)存,這類變量成為靜態(tài)變量。對(duì)于這類變量,你無(wú)法為他們制定其他存儲(chǔ)類型。
靜態(tài)變量在程序運(yùn)行之前創(chuàng)建,在程序的整個(gè)執(zhí)行期間始終存在。它始終保持原先的值,除非給它賦一個(gè)不同的值或者程序結(jié)束。
在代碼塊內(nèi)部聲明的變量的缺省存儲(chǔ)類型是自動(dòng)的(automatic),也就是說他存儲(chǔ)于堆棧中,成為自動(dòng)變量。有一個(gè)關(guān)鍵字auto就是用修飾這種存儲(chǔ)類型的,但它極少使用,因?yàn)榇a塊中的變量在缺省情況下就是自動(dòng)變量在程序執(zhí)行到聲明自動(dòng)變量的代碼塊時(shí),自動(dòng)變量才被創(chuàng)建,當(dāng)程序的執(zhí)行流離開該代碼時(shí),這些自動(dòng)變量便自行銷毀。如果該代碼塊被數(shù)次執(zhí)行,例如一個(gè)函數(shù)被反復(fù)調(diào)用,這些自動(dòng)變量每次都將重新創(chuàng)建。在代碼塊再次執(zhí)行時(shí),這些自動(dòng)變量在堆棧中所占據(jù)的內(nèi)存位置有可能和原先的位置相同,也可能不同。及時(shí)他們所占據(jù)的位置相同,你也不能保證這塊呢村同時(shí)不會(huì)有其他的用途,因此,我們可以說自動(dòng)變量在代碼塊執(zhí)行完畢后就消失。當(dāng)代碼塊再次執(zhí)行時(shí),他們的值一般并不是上次執(zhí)行時(shí)的值。
對(duì)于在代碼塊內(nèi)部聲明的變量,如果給它加上關(guān)鍵字static,可以使他的存儲(chǔ)類型從自動(dòng)變?yōu)殪o態(tài)。具有靜態(tài)存儲(chǔ)類型的變量在整個(gè)程序執(zhí)行過程中一直存在,而不僅僅在聲明它的代碼塊的執(zhí)行時(shí)存在。注意,修改變量的存儲(chǔ)類型并不標(biāo)示修改該變量的作用域,它任然只能在該代碼塊內(nèi)部按名字訪問。函數(shù)的形式參數(shù)不能聲明。
最后,關(guān)鍵字register可以用于自動(dòng)變量的聲明,提示他們應(yīng)該存儲(chǔ)于機(jī)器的硬件寄存器而不是內(nèi)存中,這類變量稱為寄存器變量。通常,寄存器變量比存儲(chǔ)于內(nèi)存的變量訪問起來(lái)效率更高。但是,編譯器并不一定要理財(cái)register關(guān)鍵字,如果有太多的變量被聲明為register,它只選取前幾個(gè)實(shí)際存儲(chǔ)于寄存器中,其余的就按普通自動(dòng)比那輛處理。如果一個(gè)編譯器自己具有一套寄存器優(yōu)化方法,它可能忽略register關(guān)鍵字,
使用:使用說明,為了加快程序的編譯速度,你希望把使用頻率最高的那些變量聲明為寄存器變量,在有些計(jì)算機(jī)中,如果你把指針聲明為寄存器變量,程序的效率將能得到提高,有其是那些頻繁的執(zhí)行間接訪問操作的指針,你可以把函數(shù)的形式參數(shù)聲明為寄存器變量,編譯器會(huì)在函數(shù)的起始位置生成指令,把這些值從堆棧復(fù)制到寄存器中。但是,完全有可能,這個(gè)優(yōu)化措施所節(jié)省的時(shí)間和控件的開銷還抵不上復(fù)制這幾個(gè)值所用的開銷。
寄存器變量的創(chuàng)建和銷毀時(shí)間和自動(dòng)變量相同,但它需要一些額外的工作。在一個(gè)使用寄存器變量的函數(shù)返回之前,這些寄存器先前存儲(chǔ)的值必須恢復(fù),確保調(diào)用者的寄存器變量未被破壞。許多機(jī)器使用運(yùn)行時(shí)堆棧來(lái)完成這個(gè)任務(wù)。當(dāng)函數(shù)開始執(zhí)行時(shí),它把需要使用的所有寄存器的內(nèi)容都保存到堆棧中,當(dāng)函數(shù)返回時(shí),這些值再?gòu)?fù)制回寄存器中。在許多機(jī)器的硬件實(shí)現(xiàn)中,并不為寄存器指定的地址。同樣由于寄存器值的保存和恢復(fù)某一個(gè)特定的寄存器在不同的時(shí)刻所保存的值不一定相同;谶@些理由,機(jī)器并不像你提供寄存器變量的地址。
拓展:C語(yǔ)言的reduce方法應(yīng)用
一般而言,可以通過reduce方法實(shí)現(xiàn)的邏輯都可以通過forEach方法來(lái)變相的實(shí)現(xiàn),雖然不清楚瀏覽器的js引擎是如何在C++層面實(shí)現(xiàn)這兩個(gè)方法,但是可以肯定的是reduce方法肯定也存在數(shù)組的遍歷,在具體實(shí)現(xiàn)細(xì)節(jié)上是否針對(duì)數(shù)組項(xiàng)的操作和存儲(chǔ)做了什么優(yōu)化,則不得而知。
數(shù)組的reduce方法的應(yīng)用
reduce方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)callback,用于針對(duì)數(shù)組項(xiàng)的操作;第二個(gè)參數(shù)則是傳入的初始值,這個(gè)初始值用于單個(gè)數(shù)組項(xiàng)的操作。需要注意的是,reduce方法返回值并不是數(shù)組,而是形如初始值的經(jīng)過疊加處理后的操作。
reduce方法最常見的場(chǎng)景就是疊加。
var items = [10, 120, 1000];// our reducer functionvar reducer = function add(sumSoFar, item) { return sumSoFar + item; };// do the jobvar total = items.reduce(reducer, 0);console.log(total); // 1130
可以看出,reduce函數(shù)根據(jù)初始值0,不斷的進(jìn)行疊加,完成最簡(jiǎn)單的總和的實(shí)現(xiàn)。
前文中也提到,reduce函數(shù)的返回結(jié)果類型和傳入的初始值相同,上個(gè)實(shí)例中初始值為number類型,同理,初始值也可為object類型。
var items = [10, 120, 1000];// our reducer functionvar reducer = function add(sumSoFar, item) { sumSoFar.sum = sumSoFar.sum + item; return sumSoFar;};// do the jobvar total = items.reduce(reducer, {sum: 0});console.log(total); // {sum:1130}
多重疊加
使用reduce方法可以完成多維度的數(shù)據(jù)疊加。如上例中的初始值{sum: 0} ,這僅僅是一個(gè)維度的操作,如果涉及到了多個(gè)屬性的疊加,如{sum: 0,totalInEuros: 0,totalInYen: 0} ,則需要相應(yīng)的邏輯進(jìn)行處理。
在下面的方法中,采用分而治之的方法,即將reduce函數(shù)第一個(gè)參數(shù)callback封裝為一個(gè)數(shù)組,由數(shù)組中的每一個(gè)函數(shù)單獨(dú)進(jìn)行疊加并完成reduce操作。所有的一切通過一個(gè)manager函數(shù)來(lái)管理流程和傳遞初始參數(shù)。
var manageReducers = function(reducers) { return function(state, item) { return Object.keys(reducers).reduce( function(nextState, key) { reducers[key](state, item); return state; }, {} ); }};
上面就是manager函數(shù)的實(shí)現(xiàn),它需要reducers對(duì)象作為參數(shù),并返回一個(gè)callback類型的函數(shù),作為reduce的第一個(gè)參數(shù)。在該函數(shù)內(nèi)部,則執(zhí)行多維的疊加工作( Object.keys() )。
通過這種分治的思想,可以完成目標(biāo)對(duì)象多個(gè)屬性的同時(shí)疊加,完整代碼如下:
var reducers = { totalInEuros : function(state, item) { return state.euros += item.price * 0.897424392; }, totalInYen : function(state, item) { return state.yens += item.price * 113.852; }};var manageReducers = function(reducers) { return function(state, item) { return Object.keys(reducers).reduce( function(nextState, key) { reducers[key](state, item); return state; }, {} ); }};var bigTotalPriceReducer = manageReducers(reducers);var initialState = {euros:0, yens: 0};var items = [{price: 10}, {price: 120}, {price: 1000}];var totals = items.reduce(bigTotalPriceReducer, initialState);console.log(totals);
總結(jié)
以上就是Javascript中內(nèi)建函數(shù)reduce應(yīng)用的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能有所幫助,如果有疑問大家可以留言交流。
【C語(yǔ)言初始化效率問題及關(guān)鍵字解釋】相關(guān)文章:
C語(yǔ)言關(guān)鍵字及其解釋03-10
C語(yǔ)言關(guān)鍵字RESTRICT介紹10-25
C語(yǔ)言中volatile關(guān)鍵字分析03-30
C語(yǔ)言的關(guān)鍵字和控制語(yǔ)句有哪些01-04
C語(yǔ)言標(biāo)準(zhǔn)定義的32個(gè)關(guān)鍵字11-30
C語(yǔ)言如何提高程序效率04-10
C語(yǔ)言八皇后問題12-04
C語(yǔ)言的可變參數(shù)問題03-20