导航:首页 > 编程语言 > c高效编程内存与性能优化

c高效编程内存与性能优化

发布时间:2024-04-06 15:45:20

㈠ C程序性能优化:20个实验与达人技巧

作者将C高效编程的心得浓缩于20个技巧,并将这些技巧通过实验的方式进行讲解,简明易懂,使人印象深刻。《》书中带有大量的代码实例,使读者不仅能够从理论上得以提高,而且还能够轻松地在实践中应用。 ·算法导论(超过50万人阅读的算法圣经!) ·谢谢你离开我(张小娴最新散文)内容简介《》从CPU与编译器的运行机制讲起,带领读者一步步了解程序的执行成本、编译器的优化选项等,总结出许多C程序性能优化的技巧,并以实验的方式进行了讲解,简明易懂,使人印象深刻。书中带有大量的代码实例,使读者不仅能够了解代码优化的原理,还能够轻松地在实践中应用。 《》适合有一定基础的C语言编程人员阅读。作者精通高效编程,其开发的C编译器,不仅适用于16位及32位系统,还能在GPU中对视频数据进行实时编译。作者将C高效编程的心得浓缩于20个技巧,并将这些技巧通过实验的方式进行讲解,简明易懂,使人印象深刻。《》书中带有大量的代码实例,使读者不仅能够从理论上得以提高,而且还能够轻松地在实践中应用。 ·算法导论(超过50万人阅读的算法圣经!) ·谢谢你离开我(张小娴最新散文)内容简介《》从CPU与编译器的运行机制讲起,带领读者一步步了解程序的执行成本、编译器的优化选项等,总结出许多C程序性能优化的技巧,并以实验的方式进行了讲解,简明易懂,使人印象深刻。书中带有大量的代码实例,使读者不仅能够了解代码优化的原理,还能够轻松地在实践中应用。 《》适合有一定基础的C语言编程人员阅读。作者精通高效编程,其开发的C编译器,不仅适用于16位及32位系统,还能在GPU中对视频数据进行实时编译。作者将C高效编程的心得浓缩于20个技巧,并将这些技巧通过实验的方式进行讲解,简明易懂,使人印象深刻。《》书中带有大量的代码实例,使读者不仅能够从理论上得以提高,而且还能够轻松地在实践中应用。 ·算法导论(超过50万人阅读的算法圣经!) ·谢谢你离开我(张小娴最新散文)内容简介《》从CPU与编译器的运行机制讲起,带领读者一步步了解程序的执行成本、编译器的优化选项等,总结出许多C程序性能优化的技巧,并以实验的方式进行了讲解,简明易懂,使人印象深刻。书中带有大量的代码实例,使读者不仅能够了解代码优化的原理,还能够轻松地在实践中应用。 《》适合有一定基础的C语言编程人员阅读。

㈡ C语言中有哪些实用的编程技巧

这篇文章主要介绍了C语言高效编程的几招小技巧,本文讲解了以空间换时间、用数学方法解决问题以及使用位操作等编辑技巧,并给出若干方法和代码实例,需要的朋友可以参考下

引言:

编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。

第1招:以空间换时间

计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招——以空间换时间。

例如:字符串的赋值。

方法A,通常的办法:

代码如下:

#define LEN 32

char string1 [LEN];

memset (string1,0,LEN);

strcpy (string1,“This is a example!!”);

方法B:

代码如下:

const char string2[LEN] =“This is a example!”;

char * cp;

cp = string2 ;

(使用的时候可以直接用指针来操作。)

从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵 活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序 执行的高效率。

如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。

该招数的变招——使用宏函数而不是函数。举例如下:

方法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) << (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) = ((__dst) & ~(BIT_MASK(__bf))) | /

(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查 选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要 一些CPU时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函 数的时候,该现象尤其突出。

D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。

第2招:数学方法解决问题

现在我们演绎高效C语言编写的第二招——采用数学方法来解决问题。

数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。

举例如下,求 1~100的和。

方法E

代码如下:

int I , j;

for (I = 1 ;I<=100; I ++){

j += I;

}

方法F

代码如下:

int I;

I = (100 * (1+100)) / 2

这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1 次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。

第3招:使用位操作

实现高效的C语言编写的第三招——使用位操作,减少除法和取模的运算。

在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:

方法G

代码如下:

int I,J;

I = 257 /8;

J = 456 % 32;

方法H

int I,J;

I = 257 >>3;

J = 456 - (456 >> 4 << 4);

在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存 器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。

运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。

第4招:汇编嵌入

高效C语言编程的必杀技,第四招——嵌入汇编。

“在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾”。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法 ——嵌入汇编,混合编程。

举例如下,将数组一赋值给数组二,要求每一字节都相符。

代码如下:

char string1[1024],string2[1024];

方法I

代码如下:

int I;

for (I =0 ;I<1024;I++)

*(string2 + I) = *(string1 + I)

方法J

代码如下:

#ifdef _PC_

int I;

for (I =0 ;I<1024;I++)

*(string2 + I) = *(string1 + I);

#else

#ifdef _ARM_

__asm

{

MOV R0,string1

MOV R1,string2

MOV R2,#0

loop:

LDMIA R0!, [R3-R11]

STMIA R1!, [R3-R11]

ADD R2,R2,#8

CMP R2, #400

BNE loop

}

#endif

方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有 朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个 例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。

虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。切记,切记。

㈢ C语言编程解决最优化问题

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

㈣ 如何写出高效的单片机C语言程序代码

由于单片机的性能同电脑的性能是天渊之别的,无论从空间资源上、内存资源、工作频率,都是无法
与之比较的。PC 机编程基本上不用考虑空间的占用、内存的占用的问题,最终目的就是实现功能就可以了。
对于单片机来说就截然不同了,一般的单片机的Flash 和Ram 的资源是以KB 来衡量的,可想而知,单片
机的资源是少得可怜,为此我们必须想法设法榨尽其所有资源,将它的性能发挥到最佳,程序设计时必须
遵循以下几点进行优化:

1. 使用尽量小的数据类型
能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变
量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变
量后不要超过变量的作用范围,如果超过变量的范围赋值,C 编译器并不报错,但程序运行结果却错了,
而且这样的错误很难发现。

2. 使用自加、自减指令
通常使用自加、自减指令和复合赋值表达式(如a-=1 及a+=1 等)都能够生成高质量的
程序代码,编译器通常都能够生成inc 和dec 之类的指令,而使用a=a+1 或a=a-1 之类
的指令,有很多C 编译器都会生成二到三个字节的指令。

3. 减少运算的强度
可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。
(1) 求余运算
N= N %8 可以改为N = N &7
说明:位操作只需一个指令周期即可完成,而大部分的C 编译器的“%”运算均是调用子程序来
完成,代码长、执行速度慢。通常,只要求是求2n 方的余数,均可使用位操作的方法来代替。
(2) 平方运算
N=Pow(3,2) 可以改为N=3*3
说明:在有内置硬件乘法器的单片机中(如51 系列),乘法运算比求平方运算快得多, 因为浮点数
的求平方是通过调用子程序来实现的,乘法运算的子程序比平方运算的子程序代码短,执行速度快。
(3) 用位移代替乘法除法
N=M*8 可以改为N=M<<3
N=M/8 可以改为N=M>>3
说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。如果乘以2n,都可以生成左移
的代码,而乘以其它的整数或除以任何数,均调用乘除法子程序。用移位的方法得到代码比调用乘除法子
程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果。如N=M*9
可以改为N=(M<<3)+M;
(4) 自加自减的区别
例如我们平时使用的延时函数都是通过采用自加的方式来实现。
void DelayNms(UINT16 t)
{
UINT16 i,j;
for(i=0;i<t;i++)
for(j=0;i<1000;j++)
}
可以改为
void DelayNms(UINT16 t)
{
UINT16 i,j;
for(i=t;i>=0;i--)
for(j=1000;i>=0;j--)
}
说明:两个函数的延时效果相似,但几乎所有的C 编译对后一种函数生成的代码均比前一种代码少1~3
个字节,因为几乎所有的MCU 均有为0 转移的指令,采用后一种方式能够生成这类指令。

4. while 与do...while 的区别
void DelayNus(UINT16 t)
{
while(t--)
{
NOP();
}
}
可以改为
void DelayNus(UINT16 t)
{
do
{
NOP();
}while(--t)
}
说明:使用do…while 循环编译后生成的代码的长度短于while 循环。

5. register 关键字
void UARTPrintfString(INT8 *str)
{
while(*str && str)
{
UARTSendByte(*str++)
}
}
可以改为
void UARTPrintfString(INT8 *str)
{
register INT8 *pstr=str;
while(*pstr && pstr)
{
UARTSendByte(*pstr++)
}
}
说明:在声明局部变量的时候可以使用register 关键字。这就使得编译器把变量放入一个多用途的寄存
器中,而不是在堆栈中,合理使用这种方法可以提高执行速度。函数调用越是频繁,越是可能提高代码的
速度,注意register 关键字只是建议编译器而已。

6. volatile 关键字
volatile 总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在
哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。一般来
说,volatile 关键字只用在以下三种情况:
a) 中断服务函数中修改的供其它程序检测的变量需要加volatile(参考本书高级实验程序)
b) 多任务环境下各任务间共享的标志应该加volatile
c) 存储器映射的硬件寄存器通常也要加volatile 说明,因为每次对它的读写都可能由不同意义
总之,volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素
更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码
就不再进行优化,从而可以提供对特殊地址的稳定访问。

㈤ 濡备綍寮濮嬩娇鐢–++11镄9涓鐞嗙敱𨱒ヨ幏寰楁ц兘鍜屾晥鐜囩殑鎻愬崌

銮峰缑镐ц兘浼桦娍
鐞嗙敱1锛歮ove璇涔(move semantics)銆傜亩鍗旷殑璇达纴瀹冩槸浼桦寲澶嶅埗镄勪竴绉嶆柟寮忋傛湁镞跺椤嶅埗寰堟樉铹舵槸娴璐圭殑銆傚傛灉浣犱粠涓涓涓存椂镄剆tring瀵硅薄澶嶅埗鍐呭癸纴绠鍗旷殑澶嶅埗鎸囬拡鍒板瓧绗︾紦鍐插尯灏嗘瘆鍒涘缓涓涓鏂扮殑缂揿啿鍖哄啀澶嶅埗瑕侀珮鏁埚缑澶氥备粬涔嬫墍浠ヨ兘宸ヤ綔鏄锲犱负婧愬硅薄瓒呭嚭浜呜寖锲淬
铹惰岋纴鍦ㄨ繖浠ュ墠C++骞舵病链夊垽鏂婧愬硅薄鏄涓嶆槸涓存椂瀵硅薄镄勬満鍒躲俶ove璇涔夐氲繃闄や简澶嶅埗镎崭綔澶栬缮鍏佽镐綘链変竴涓猰ove鏋勯犲嚱鏁(move constructor)鍜屼竴涓猰ove璧嫔艰繍绠(move assignment)绗︽潵鎻愪緵杩欎釜链哄埗銆
浣犵煡阆揿悧锛熷綋浣犲湪Visual Studio 2010涓浣跨敤镙囧嗳搴扑腑镄勭被濡俿tring鎴杤ector镞讹纴瀹冧滑宸茬粡鏀鎸乵ove璇涔変简銆傝繖鍙浠ラ槻姝涓嶅繀瑕佺殑镄勫嶅埗浠庤屾敼锽勬ц兘銆
阃氲繃鍦ㄤ綘镄勭被涓瀹炵幇move璇涔変綘鍙浠ヨ幏寰楅濆栫殑镐ц兘鎻愬崌锛屾瘆濡傚綋浣犳妸瀹冧滑瀛桦偍鍒癝TL瀹瑰櫒涓镞躲傝缮链夛纴move璇涔変笉浠呭彲浠ュ簲鐢ㄥ埌鏋勯犲嚱鏁帮纴杩桦彲浠ュ簲鐢ㄥ埌鏂规硶锛埚倂ector镄刾ush_back鏂规硶锛夈
鐞嗙敱2锛氶氲繃浣跨敤绫诲埆灞炴(type traits,濡俰s_floating_point)鍜屾ā𨱒垮厓缂栫▼(template metaprogramming锛屽俥nable_if template)锛屼綘鍙浠ヤ负镆愪簺鐗瑰畾镄勭被鍨嫔畾鍒舵ā鐗堬纴杩椤彲浠ュ疄鐜颁紭鍖栥
鐞嗙敱3锛氩搱甯岃〃鐜板湪宸茬粡鏄镙囧嗳瀹炵幇镄勪简锛屽畠鎻愪緵镟村揩阃熺殑鎻掑叆銆佸垹闄ゅ拰镆ユ垒锛岃繖鍦ㄥ勭悊澶ч噺鏁版嵁镞跺緢链夌敤銆备綘鐜板湪鍙浠ラ殢渚夸娇鐢╱nordered_map, unordered_multimap, unordered_set 鍜寀nordered_multiset杩椤嚑绉嶆暟鎹缁撴瀯浜嗐
鎻愰珮鏁堢巼
鎻愰珮鏁堢巼涓崭粎閮芥槸鍦ㄤ唬镰佹ц兘鏂归溃锛屽紑鍙戞椂闂翠篃鏄瀹濊吹镄勚侰++ 11鍙浠ヨ╀綘镄勪唬镰佹洿鐭銆佹洿娓呮榈銆佸拰镟存槗浜庨槄璇伙纴杩椤彲浠ヨ╀綘镄勬晥鐜囨洿楂樸
鐞嗙敱4锛歛uto鍏抽敭瀛楀彲浠ヨ嚜锷ㄦ帹鏂绫诲瀷锛屾墍浠ヤ笅闱㈢殑浠g爜锛
vector<vector<MyType>>::const_iterator it = v.begin()

鐜板湪鍙浠ュ緢绠鍗旷殑鍐欐垚锛
auto it = v.cbegin()

灏界℃湁浜涗汉浼氲达纴瀹冮殣钘忎简绫诲瀷淇℃伅锛屽湪鎴戠湅𨱒ュ畠鍒╁ぇ浜庡纷锛屽洜涓哄畠鍑忓皯浜呜呜夋贩鎹㈠苟灞旷ず浜嗕唬镰佺殑琛屼负锛岃缮链夊畠鍙浠ヨ╀綘鎴戝皯镓揿緢澶氩瓧锛
鐞嗙敱5锛歀ambda琛ㄨ揪寮忔彁渚涗简涓绉嶆柟娉曟潵瀹氢箟鍖垮悕鏂规硶瀵硅薄锛埚疄闄呬笂鏄闂鍖咃级锛岃繖鏄浠g爜镟村姞绾挎у拰链夎勫緥鍙寰銆傝繖鍦ㄥ拰STL绠楁硶缁揿悎浣跨敤镞跺緢鏂逛究锛
bool is_fuel_level_safe()
{
return all_of(_tanks.begin(), _tanks.end(),
[this](Tank& t) { return t.fuel_level() > _min_fuel_level; });
}

鐞嗙敱6锛氭柊镄勬櫤鑳芥寚阍堬纸smart pointer锛夋浛鎹浜嗘湁闂棰樼殑auto_ptr锛屼綘鍙浠ヤ笉鐢ㄦ媴蹇冨唴瀛樼殑閲婃斁骞剁Щ闄ょ浉鍏抽喷鏀惧唴瀛樼殑浠g爜浜嗐傝繖璁╀唬镰佹洿娓呮榈锛屽苟𨱒灭粷浜嗗唴瀛樻硠闇插拰镆ユ垒鍐呭瓨娉勯湶镄勬椂闂淬
鐞嗙敱7锛氭妸鏂规硶浣滀负first class object鏄涓涓闱炲父寮哄ぇ镄勭壒镐э纴杩栾╀綘镄勪唬镰佸彉寰楁洿𨱔垫椿鍜岄氱敤浜嗐侰++镄剆td::function鎻愪緵浜呜繖鏂归溃镄勫姛鑳姐傛柟娉曟彁渚涗竴绉嶅寘瑁呭拰浼犻掍换浣曞彲璋幂敤镄勪笢瑗-鍑芥暟鎸囬拡, 浠垮嚱鏁帮纸functor锛, lambda琛ㄨ揪寮忕瓑銆
鐞嗙敱8锛氲缮链夎稿氩叾瀹冨皬镄勫姛鑳斤纴濡俹verride銆乫inal鍏抽敭瀛楀拰nullptr璁╀綘镄勪唬镰佹剰锲炬洿鏄庣‘銆傚规垜𨱒ヨ达纴鍑忓皯瑙呜夋贩涔卞拰浠g爜涓鑳藉熸洿娓呮氩湴琛ㄨ揪鎴戠殑镒忓浘镒忓懗镌镟撮珮鍏淬佹洿楂樻晥銆
鍙︿竴涓寮鍙戞晥鐜囩殑鏂归溃鏄阌栾妫娴嬨傚傛灉浣犵殑阌栾鍦ㄨ繍琛屾椂鍙戠敓锛岃繖镒忓懗镌浣犺呖灏戦渶瑕佽繍琛岃蒋浠讹纴骞跺彲鑳藉缑阃氲繃涓绯诲垪姝ラゆ潵閲岖幇阌栾锛岃繖闇瑕佹椂闂淬
C++ 11鎻愪緵浜嗕竴绉嶆柟娉曟潵妫镆ュ厛鍐虫浔浠跺苟灏芥棭镄勫湪鍙鑳界殑镞舵満鎹曡幏阌栾-缂栬疟杩囩▼涓锛屽湪浣犺繍琛屼唬镰佸墠銆傝繖灏辨槸鐞嗙敱9銆
杩欐槸阃氲繃闱欐佹柇瑷(static_assert)鍜岀被鍒灞炴фā鐗埚疄鐜扮殑銆傝繖绉嶆柟娉旷殑鍙︿竴涓濂藉勬槸锛屽畠涓嶉渶瑕佸崰鐢ㄤ换浣旷殑杩愯屾椂寮阌锛屾病链変粈涔堟ц兘鎹熷け锛

阅读全文

与c高效编程内存与性能优化相关的资料

热点内容
plc和单片机哪个好 浏览:535
帝国神话组建云服务器 浏览:827
邓散木pdf 浏览:199
方舟怎么直连服务器图片教程 浏览:563
假相pdf 浏览:336
找对象找程序员怎么找 浏览:976
怎么投诉苹果商店app 浏览:470
华为手机如何看有多少个app 浏览:734
btr如何管理别的服务器 浏览:410
spwm软件算法 浏览:184
70多岁单身程序员 浏览:221
高考考前解压拓展训练 浏览:217
用纸做解压玩具不用浇水 浏览:584
谷轮压缩机序列号 浏览:737
牛顿插值法编程 浏览:366
php多用户留言系统 浏览:731
安卓和苹果如何切换流量 浏览:703
怎么知道dns服务器是多少 浏览:976
5995用什么简便算法脱式计算 浏览:918
电脑上如何上小米云服务器地址 浏览:921