版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C代碼優(yōu)化方案1、選擇合適的算法和數(shù)據(jù)結(jié)構(gòu)選擇一種合適的數(shù)據(jù)結(jié)構(gòu)很重要,如果在一堆隨機(jī)存放的數(shù)中使用了大量的插入和刪除指令,那使用鏈表要快得多。數(shù)組與指針語句具有十分密切的關(guān)系,一般來說,指針比較靈活簡潔,而數(shù)組則比較直觀,容易理解。對于大部分的編譯器,使用指針比使用數(shù)組生成的代碼更短,執(zhí)行效率更高。在許多種情況下,可以用指針運(yùn)算代替數(shù)組索引,這樣做常常能產(chǎn)生又快又短的代碼。與數(shù)組索引相比,指針一般能使代碼速度更快,占用空間更少。使用多維數(shù)組時差異更明顯。下 面的代碼作用是相同的,但是效率不一樣?數(shù)組索引指針運(yùn)算For(;)p=arrayA=arrayt+; for(;)a=*(p+);ooo
2、ooooooo o o o o o)指針方法的優(yōu)點是,array的地址每次裝入地址p后,在每次循環(huán)中只需對p增量操作。在數(shù)組索引方法中,每次循環(huán)中都必須根據(jù)t值求數(shù)組下標(biāo)的復(fù)雜運(yùn)算。2、使用盡量小的數(shù)據(jù)類型能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來定義;能夠使用整型變量定義的變量就不要用長整型(long int),能不使用浮點型(float)變量就不要使用浮點型變量。當(dāng)然,在定義變量后不要超過變量的作用范圍,如果超過變量的范圍賦值,C編譯器并不報錯,但程序運(yùn)行結(jié)果卻錯了,而且這樣的錯誤很難發(fā)現(xiàn)。在ICCAVR中,可以在 Options 中設(shè)定使用printf 參數(shù),盡
3、量使用基本型參數(shù) (%c、d %x %X %uD%s格式說明符),少用長整型參數(shù)(ld、lu、伙和區(qū)格式說明 符),至于浮點型的參數(shù)(f)則盡量不要使用,其它C編譯器也一樣。在其它條件不變的情況下,使用%f參數(shù),會使生成的代碼的數(shù)量增加很多,執(zhí)行速度降低。3、減少運(yùn)算的強(qiáng)度(1)、查表(游戲程序員必修課)一個聰明的游戲大蝦,基本上不會在自己的主循環(huán)里搞什么運(yùn)算工作,絕對是先計算好了,再到循環(huán)里查表??聪旅娴睦樱号f代碼:long factorial(int i)if (i = 0)return 1;elsereturn i * factorial(i - 1);)新代碼:static long
4、 factorial_table=1, 1 , 2 , 6 , 24 , 120 , 720 /* etc */ ;long factorial(int i)return factorial_tablei; 如果表很大,不好寫,就寫一個init函數(shù),在循環(huán)外臨時生成表格。(2)、求余運(yùn)算a=a%8;可以改為:a=a&7;說明:位操作只需一個指令周期即可完成,而大部分的C編譯器的" %運(yùn)算均是調(diào)用子程序來完成,代碼長、執(zhí)行速度慢。通常,只要求是求 2n方的余數(shù),均可使用位操作的方法 來代替。(3)、平方運(yùn)算a=pow(a,;可以改為:a=a*a;說明:在有內(nèi)置硬件乘法器的單片機(jī)
5、中(如51系列),乘法運(yùn)算比求平方運(yùn)算快得多,因為浮點數(shù)的求平方是通過調(diào)用子程序來實現(xiàn)的,在自帶硬件乘法器的AVR單片機(jī)中,如ATMega163中,乘法運(yùn)算只需2個時鐘周期就可以完成。既使是在沒有內(nèi)置硬件乘法器的AVR單片機(jī)中,乘法運(yùn)算的子程序比平方運(yùn)算的子程序代碼短,執(zhí)行速度快。如果是求3次方,如:a=pow(a, 3。0);更改為:a=a*a*a ;則效率的改善更明顯。(4)、用移位實現(xiàn)乘除法運(yùn)算a=a*4;b=b/4;可以改為:a=a<<2;b=b>>2;通常如果需要乘以或除以2n,都可以用移位的方法代替。在ICCAVR中,如果乘以2n,都可以生成左移的代碼,而乘
6、以其它的整數(shù)或除以任何數(shù),均調(diào)用乘除法子程序。用移位的方法得到代碼比調(diào)用乘除法子程序生成的代碼效率高。實際上,只要是乘以或除以一個整數(shù),均可以用移位的方法得到結(jié)果,如:a=a*9可以改為:a=(a<<3)+a采用運(yùn)算量更小的表達(dá)式替換原來的表達(dá)式,下面是一個經(jīng)典例子 舊代碼:x = w % 8;y = pow(x ,;z = y * 33;for (i = 0;i < MAX;i+) (h = 14 * i;printf("%d" , h);)新代碼:位操作比求余運(yùn)算快*/乘法比平方運(yùn)算快*/位移乘法比乘法快*/加法比乘法快*/x = w & 7;
7、/*y = x * x; /* z = (y << 5) + y; /* for (i = h = 0; i < MAX; i+) (h += 14;/*printf("%d", h);)(5)、避免不必要的整數(shù)除法整數(shù)除法是整數(shù)運(yùn)算中最慢的,所以應(yīng)該盡可能避免。一種可能減少整數(shù)除法的地方是連除, 這里除法可以由乘法代替。這個替換的副作用是有可能在算乘積時會溢出,所以只能在一定范圍的除法中使用。不好的代碼:int i , j , k , m;m = i / j / k ;推薦的代碼:int i , j , k , m;m = i / (j * k) ;(6
8、)、使用增量和減量操作符在使用到加一和減一操作時盡量使用增量和減量操作符,因為增量符語句比賦值語句更快, 原因在于對大多數(shù) CP陰說,對內(nèi)存字的增、減量操作不必明顯地使用取內(nèi)存和寫內(nèi)存的指 令,比如下面這條語句:x=x+1;模仿大多數(shù)微機(jī)匯編語言為例,產(chǎn)生的代碼類似于:move A, x ; 把x從內(nèi)存取出存入累加器 Aadd A, 1; 累加器A加1store x ;把新值存回 x如果使用增量操作符,生成的代碼如下:incr x ;x力口 1顯然,不用取指令和存指令,增、減量操作執(zhí)行的速度加快,同時長度也縮短了。(7)、使用復(fù)合賦值表達(dá)式復(fù)合賦值表達(dá)式(如a-=1及a+=1等)都能夠生成高質(zhì)
9、量的程序代碼。(8)、提取公共的子表達(dá)式在某些情況下,C+編譯器不能從浮點表達(dá)式中提出公共的子表達(dá)式,因為這意味著相當(dāng)于 對表達(dá)式重新排序。需要特別指出的是,編譯器在提取公共子表達(dá)式前不能按照代數(shù)的等價 關(guān)系重新安排表達(dá)式。這時,程序員要手動地提出公共的子表達(dá)式(在里有一項“全局優(yōu)化”選項可以完成此工作,但效果就不得而知了)。不好的代碼:float a ,b,c,d,e,f;e = b * c / d ;f = b / d * a ;推薦的代碼:float a ,b,c,d,e,f;const float t(b / d) ;e = c * t ;f = a * t ;不好的代碼:float
10、a , b , c , e , f ;o o oe = a / c ;f = b / c ;推薦的代碼:float a , b , c , e , f ;const float t(1.0f / c);e = a * t ;f = b * t ;4、結(jié)構(gòu)體成員的布局很多編譯器有“使結(jié)構(gòu)體字,雙字或四字對齊”的選項。但是,還是需要改善結(jié)構(gòu)體成員的對齊,有些編譯器可能分配給結(jié)構(gòu)體成員空間的順序與他們聲明的不同。但是,有些編譯器并不提供這些功能,或者效果不好。所以,要在付出最少代價的情況下實現(xiàn)最好的結(jié)構(gòu)體和 結(jié)構(gòu)體成員對齊,建議采取下列方法:(1)按數(shù)據(jù)類型的長度排序把結(jié)構(gòu)體的成員按照它們的類型長度
11、排序,聲明成員時把長的類型放在短的前面。編譯器要求把長型數(shù)據(jù)類型存放在偶數(shù)地址邊界。在申明一個復(fù)雜的數(shù)據(jù)類型(既有多字節(jié)數(shù)據(jù)又有單字節(jié)數(shù)據(jù))時,應(yīng)該首先存放多字節(jié)數(shù)據(jù),然后再存放單字節(jié)數(shù)據(jù),這樣可以避免內(nèi)存的空洞。編譯器自動地把結(jié)構(gòu)的實例對齊在內(nèi)存的偶數(shù)邊界。(2)把結(jié)構(gòu)體填充成最長類型長度的整倍數(shù)把結(jié)構(gòu)體填充成最長類型長度的整倍數(shù)。照這樣,如果結(jié)構(gòu)體的第一個成員對齊了,所有整個結(jié)構(gòu)體自然也就對齊了。下面的例子演示了如何對結(jié)構(gòu)體成員進(jìn)行重新排序:不好的代碼,普通順序: struct(char a5;long k ;double x ; baz ;推薦的代碼,新的順序并手動填充了幾個字節(jié):str
12、uct(double xlong kchar a5;char pad7; baz這個規(guī)則同樣適用于類的成員的布局。(3)按數(shù)據(jù)類型的長度排序本地變量當(dāng)編譯器分配給本地變量空間時,它們的順序和它們在源代碼中聲明的順序一樣,和上一條規(guī)則一樣,應(yīng)該把長的變量放在短的變量前面。如果第一個變量對齊了,其它變量就會連續(xù)的存放,而且不用填充字節(jié)自然就會對齊。有些編譯器在分配變量時不會自動改變變量順序,有些編譯器不能產(chǎn)生 4字節(jié)對齊的棧,所以4字節(jié)可能不對齊。下面這個例子演示了本地變 量聲明的重新排序:不好的代碼,普通順序short ga , gu , gi ;long foo , bar ;double x
13、 , y , z3;char a , b ;float baz ;推薦的代碼,改進(jìn)的順序double z3;double x , y ;long foo , bar ;float bazshort ga , gu , gi ;(4)把頻繁使用的指針型參數(shù)拷貝到本地變量避免在函數(shù)中頻繁使用指針型參數(shù)指向的值。因為編譯器不知道指針之間是否存在沖突,所以指針型參數(shù)往往不能被編譯器優(yōu)化。這樣數(shù)據(jù)不能被存放在寄存器中,而且明顯地占用了內(nèi)存帶寬。注意,很多編譯器有“假設(shè)不沖突”優(yōu)化開關(guān)(在VC里必須手動添加編譯器命令彳/02或/00),這允許編譯器假設(shè)兩個不同的指針總是有不同的內(nèi)容,這樣就不用把指針型參數(shù)
14、保存到本地變量。否則,請在函數(shù)一開始把指針指向的數(shù)據(jù)保存到本地變量。如果需要的話,在函數(shù)結(jié)束前拷貝回去。不好的代碼:0.0f66M )指針方法的優(yōu)點是,array的地址每次裝入地址 p后,在每次循環(huán)中只需對 p增量操作。在 數(shù)組索引方法中,每次循環(huán)中都必須進(jìn)行基于r值求數(shù)組下標(biāo)的復(fù)雜運(yùn)算。使用宏函數(shù)而不是函數(shù)。例如:#define bwMCDR2_ADDRESS 4#define bsMCDR2_ADDRESS 17#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)#define BIT_MASK(_bf) (1U << (bw # _b
15、f) - 1) << (bs # _bf)#define SET_BITS(_dst, _bf, _val) (_dst) = (_dst) & (BIT_MASK(_bf) | (_val) << (bs # _bf) & (BIT_MASK(_bf)SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber)函數(shù)和宏函數(shù)的區(qū)別就在于,宏函數(shù)占用了大量的空間,而函數(shù)占用了時間。 函數(shù)調(diào)用是要使用系統(tǒng)的棧來保存數(shù)據(jù)的,如果編譯器里有棧檢查選項,一般在函數(shù)的頭會嵌入一些匯編 語句對當(dāng)前棧進(jìn)行檢查;同時,CPU也要在函數(shù)調(diào)用時
16、保存和恢復(fù)當(dāng)前的現(xiàn)場,進(jìn)行壓棧和彈棧操作,所以,函數(shù)調(diào)用需要一些CPU時間。而宏函數(shù)不存在這個問題。宏函數(shù)僅僅作為預(yù)先寫好的代碼嵌入到當(dāng)前程序,不會產(chǎn)生函數(shù)調(diào)用,所以僅僅是占用了空間,在頻繁調(diào)用同一個宏函數(shù)的時候,該現(xiàn)象尤其突出。Data optimization數(shù)據(jù)優(yōu)化比算法優(yōu)化層低一級的是數(shù)據(jù)優(yōu)化層,我們可以通過改變算法使用的數(shù)據(jù)類型來優(yōu)化算法。主要的目的是使處理的數(shù)據(jù)和目標(biāo)結(jié)構(gòu)的特性相一致。這項優(yōu)化不需要大量的代碼重寫,并獨(dú)立于算法優(yōu)化的執(zhí)行而執(zhí)行.例如:確定浮點型變量和表達(dá)式是float 型為了讓編譯器產(chǎn)生更好的代碼,必須確定浮點型變量和表達(dá)式是float 型的。要特別注意的是,以;F
17、;或;f;為后綴(比如:2.718f)的浮點常量才是float 型,否則默認(rèn)是double 型。為了避免float 型參數(shù)自動轉(zhuǎn)化為 double ,請在函數(shù)聲明時使用 float 。使用32位的數(shù)據(jù)類型編譯器有很多種,但它們都包含的典型的 32位類型是:int , signed , signed int , unsigned , unsigned int long signed long long int signed long int unsigned long unsigned long int 。盡量使用32位的數(shù)據(jù)類型,因為它們比 16位的數(shù)據(jù)甚至8位的數(shù)據(jù)更有效率。明智使用有符號整
18、型變量在很多情況下,你需要考慮整型變量是有符號還是無符號類型的。在許多地方,考慮是否使用有符號的變量是必要的。在一些情況下,有符號的運(yùn)算比較快;但在一些情況下卻相反。比如:整型到浮點轉(zhuǎn)化時,使用大于16位的有符號整型比較快。因為 x86構(gòu)架中提供了從有符號整型轉(zhuǎn)化到浮點型的指令, 但沒有提供從無符號整型轉(zhuǎn)化到浮點的指令。在整數(shù)運(yùn)算中計算商和余數(shù)時,使用無符號類型比較快。Instruction flow optimization指令流優(yōu)化第三層優(yōu)化的目標(biāo)是低級指令流。比較常見的技術(shù)是循環(huán)合并(loop merging),循環(huán)展開(unrolling), 軟件流水(software pipelin
19、ing) 。循環(huán)合并如果兩個循環(huán)計數(shù)差不多、循環(huán)執(zhí)行互不相同的操作, 可以把它們合并在一起組成一個循環(huán)。當(dāng)兩個循環(huán)的負(fù)荷都不滿時,這是非常有用的。循環(huán)展開循環(huán)展開就是把循環(huán)計數(shù)小的循環(huán)展開,成為非循環(huán)形式的串行程序,或者把循環(huán)計數(shù)大的循環(huán)部分展開,減少循環(huán)迭代次數(shù), 這樣可以節(jié)省了用于循環(huán)設(shè)置、初始化、增加和校對循 環(huán)計數(shù)器的時間。大多數(shù)編譯器可以自動完成這項工作,手工編譯會出現(xiàn)錯例如:for( int i = 0; i < 3 ; i+ ) arrayi = i ;邏輯上等同于:array0 = 0; array1 = 1, array2 = 2;軟件流水軟件流水是用來安排循環(huán)指令,使
20、這個循環(huán)多次迭代并行執(zhí)行的一種技術(shù)。在嵌套循環(huán)中,編譯器僅對最里面的循環(huán)執(zhí)行軟件流水,因此對執(zhí)行周期很少的內(nèi)循環(huán)作循環(huán)展開,外循環(huán)進(jìn)行軟件流水,這樣可以改進(jìn)C代碼并行執(zhí)行的性能。 使用軟件流水還應(yīng)當(dāng)注意: 盡管軟件 流水循環(huán)可以包含內(nèi)聯(lián)函數(shù),但是不能包含函數(shù)調(diào)用;在循環(huán)中不可以有條件終止指令;在循環(huán)體中不可以修改循環(huán)控制變量。3、總結(jié)語現(xiàn)代的C和C+編譯器都提供了一定程度上的代碼優(yōu)化。然而,大部分由編譯器執(zhí)行的優(yōu)化 僅涉及執(zhí)行速度和代碼大小的一個平衡。你的程序能夠變得更快或者更小,但是不可能又變快又變小。上面介紹的方法主要是為了提高代碼的效率。但是事實上,在使用這些技術(shù)提高代碼運(yùn)行速度的同時會
21、相應(yīng)的產(chǎn)生一些負(fù)面的影響,比如增加代碼的大小、降低程序可讀性等。不過你可以讓C/C+編譯器來進(jìn)行減少代碼大小的優(yōu)化,而手動利用編程來減少代碼的執(zhí)行時間。在嵌入式程序設(shè)計中合理地使用這幾種技術(shù)有時會達(dá)到很好的優(yōu)化效果。C語言高效編程的四大絕招編寫高效簡潔的C語言代碼,是許多軟件工程師追求的目標(biāo)。本文就是針對編程工作中的一些體會和經(jīng)驗 做相關(guān)的闡述。第一招:以空間換時間計算機(jī)程序中最大的矛盾是空間和時間的矛盾,那么,從這個角度出發(fā)逆向思維來考慮程序的效率問題,我們就有了解決問題的第1招-以空間換時間。比如說字符串的賦值:方法A:通常的辦法#define LEN 32char stringl LEN
22、;memset (string1,0,LEN);strcpy (string1,"This is a example!");方法B:const char string2LEN ="This is a example!" char * cp;cp = string2 ;使用的時候可以直接用指針來操作。從上面的例子可以看出,A和B的效率是不能比的。在同樣的存儲空間下,B直接使用指針就可以操作了,而A需要調(diào)用兩個字符函數(shù)才能完成。B的缺點在于靈活性沒有 A好。在需要頻繁更改一個字符串內(nèi)容的時候,A具有更好的靈活性;如果采用方法 B,則需要預(yù)存許多字符串,雖然占
23、用了大量的內(nèi)存,但是 獲得了程序執(zhí)行的高效率。如果系統(tǒng)的實時性要求很高,內(nèi)存還有一些,那我推薦你使用該招數(shù)。該招數(shù)的變招 -使用宏函數(shù)而 不是函數(shù)。舉例如下:方法C:#define bwMCDR2_ADDRESS 4#define bsMCDR2_ADDRESS 17 int BIT_MASK(int _bf) (return (1U << (bw # _bf) - 1)<< (bs # _bf);)void SET_BITS(int _dst, int _bf, int _val) (_dst = (_dst) & (BIT_MASK(_bf) |(_val)
24、 << (bs # _bf)& (BIT_MASK(_bf)SET_BITS(MCDR2, MCDR2_ADDRESS,RegisterNumber);方法D:#define bwMCDR2_ADDRESS 4#define bsMCDR2_ADDRESS 17#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)#define BIT_MASK(_bf)(1U << (bw # _bf) - 1)<< (bs # _bf)#define SET_BITS(_dst, _bf, _val)(_dst) = (_
25、dst) & (BIT_MASK(_bf)| (_val) << (bs # _bf)& (BIT_MASK(_bf)SET_BITS(MCDR2, MCDR2_ADDRESS,RegisterNumber);函數(shù)和宏函數(shù)的區(qū)別就在于,宏函數(shù)占用了大量的空間,而函數(shù)占用了時間。大家要知道的是,函數(shù) 調(diào)用是要使用系統(tǒng)的棧來保存數(shù)據(jù)的,如果編譯器里有棧檢查選項,一般在函數(shù)的頭會嵌入一些匯編語句 對當(dāng)前棧進(jìn)行檢查;同時,CPU&要在函數(shù)調(diào)用時保存和恢復(fù)當(dāng)前的現(xiàn)場,進(jìn)行壓棧和彈棧操作,所以,函數(shù)調(diào)用需要一些CPU時間。而宏函數(shù)不存在這個問題。宏函數(shù)僅僅作為預(yù)先寫好的
26、代碼嵌入到當(dāng)前程序,不會產(chǎn)生函數(shù)調(diào)用,所 以僅僅是占用了空間,在頻繁調(diào)用同一個宏函數(shù)的時候,該現(xiàn)象尤其突出。D方法是我看到的最好的置位操作函數(shù),是ARM公司源碼的一部分,在短短的三行內(nèi)實現(xiàn)了很多功能,幾乎涵蓋了所有的位操作功能。C方法是其變體,其中滋味還需大家仔細(xì)體會。第二招:數(shù)學(xué)方法解決問題現(xiàn)在我們演繹高效 C語言編寫的第二招-采用數(shù)學(xué)方法來解決問題。數(shù)學(xué)是計算機(jī)之母,沒有數(shù)學(xué)的 依據(jù)和基礎(chǔ),就沒有計算機(jī)的發(fā)展,所以在編寫程序的時候,采用一些數(shù)學(xué)方法會對程序的執(zhí)行效率有數(shù) 量級的提高。舉例如下,求 1100的和。方法E:int I , j;for (I = 1 ;I<=100; I +
27、)j += I;)方法F這個例子是我印象最深的一個數(shù)學(xué)用例,是我的計算機(jī)啟蒙老師考我的。當(dāng)時我只有小學(xué)三年級,可惜我當(dāng)時不知道用公式 NX ( N+1) / 2來解決這個問題。方法 E循環(huán)了 100次才解決問題,也就是說最少 用了 100個賦值,100個判斷,200個加法(I和j);而方法F僅僅用了 1個加法,1次乘法,1次除法 效果自然不言而喻。所以,現(xiàn)在我在編程序的時候,更多的是動腦筋找規(guī)律,最大限度地發(fā)揮數(shù)學(xué)的威力 來提高程序運(yùn)行的效率。第三招:使用位操作實現(xiàn)高效的C語言編寫的第三招一一使用位操作。減少除法和取模的運(yùn)算。在計算機(jī)程序中數(shù)據(jù)的位 是可以操作的最小數(shù)據(jù)單位,理論上可以用&qu
28、ot;位運(yùn)算”來完成所有的運(yùn)算和操作。一般的位操作是用來控制硬件的,或者做數(shù)據(jù)變換使用,但是,靈活的位操作可以有效地提高程序運(yùn)行的效率。舉例如下:方法G方法Hint I,J;I = 257 >>3;J = 456 - (456 >> 4 << 4);在字面上好像H比G麻煩了好多,但是,仔細(xì)查看產(chǎn)生的匯編代碼就會明白,方法G調(diào)用了基本的取模函數(shù)和除法函數(shù),既有函數(shù)調(diào)用,還有很多匯編代碼和寄存器參與運(yùn)算;而方法H則僅僅是幾句相關(guān)的匯編,代碼更簡潔,效率更高。當(dāng)然,由于編譯器的不同,可能效率的差距不大,但是,以我目前遇到的 MS C ,ARM C來看,效率的差距還是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《材料加工創(chuàng)新》教學(xué)大綱
- 《電池質(zhì)量管理B》教學(xué)大綱
- 五下語文園地七課件
- 教師的安全認(rèn)識教學(xué)課件教學(xué)課件教學(xué)
- 玉溪師范學(xué)院《小學(xué)科學(xué)課程與教學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 100句經(jīng)典勵志詩詞名句
- 文書模板-工作經(jīng)歷證明
- 國貿(mào)實務(wù)教案
- 幕墻工程質(zhì)量通病及其防治措施
- 2024年社會福利收養(yǎng)服務(wù)項目成效分析報告
- 2020年四川省德陽市高三一診考試地理試卷(Word版,含答案)
- 小升初學(xué)生個人簡歷模板
- UPI大學(xué)生人格問卷ABC等級評定(細(xì)則)
- 建筑工程勘探取樣技術(shù)規(guī)程
- 催眠的引導(dǎo)語最全
- ICS國際標(biāo)準(zhǔn)分類號
- 歐姆龍plc指令講解PPT課件
- 拼音轉(zhuǎn)盤游戲
- 樁基施工臺賬
- 陜西省中小學(xué)學(xué)生休學(xué)復(fù)學(xué)申請表
- 無人機(jī)概述教案
評論
0/150
提交評論