亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語(yǔ)言

C語(yǔ)言初始化效率問題及關(guān)鍵字解釋

時(shí)間:2024-06-18 20:33:39 曉怡 C語(yǔ)言 我要投稿
  • 相關(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)鍵字12-03

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