
算法级别的显然是最主要的优化,一个平方级算法和一个超线性算法的时间复杂度天差地别。但如果已经达到了算法的下界,那么就只能是针对程序进行优化了。其实编译器干的坏事往往比好事多,尤其是在做并行的时候~另外,先检查下是否需要优化,如果不是瓶颈的地方再优化也没有明显效果,常用的优化手段一般是增大并行度,指令级或者线程级的,还有就是针对内存结构的特殊处理等等。具体可以参考计算机系统结构——量化研究方法,第三版我觉得不错,第四版没看。至于用C的话,比较灵活,比如自己消除递归,循环强度削弱,使用宏函数或者内联函数,内嵌汇编等等都可以,视情况而定了。
1 是这样的,你是对的。
2 x的值是malloc函数的返回值,它是一个确定的内存地址,是系统给你使用的一段内存的首地址,可以放心使用。
3 基本可以这样理解,对于两个相同类型的指针来说,它们的值相同的话,就有相同的作用。
以程序的具体执行过程为例来给你讲解,但愿你能理解:
1程序被打开时,即程序开始运行时,会首先向 *** 作系统请求独占内存空间(一段在程序整个执行过程中都不释放的空间), *** 作系统会应答请求并分配一段逻辑上连续(其实是将零散的内存空间映射为一段连续的空间)的内存空间给该程序,此时程序得到该段空间的逻辑地址信息,根据地址将程序代码段和数据段装入内存,此时程序载入完成。
2程序运行中,当某一过程任务需要更大内存空间时,会再次向 *** 作系统发出请求, *** 作系统会根据请求再次分配内存空间给该程序,当这一过程任务执行完毕后,该内存空间被释放。同时由于 *** 作系统的存储保护,程序在运行过程中只能访问自己所申请的内存空间,不能访问其他程序的内存空间。
3当程序执行完毕或关闭程序后,该程序所占的所有内存空间都被释放。
当你再次打开程序后,重复上面的过程。
下面对你的问题进行针对性回答:
1当程序运行时,会调入内存,不同时间运行,程序放在内存的位置也可能不同:每运行一次程序,程序都会重新向 *** 作系统申请内存空间,这时 *** 作系统会分配一段全新的内存空间给程序,故不同时间运行程序,程序在内存中的位置是不同的。
2使用内存中数据的位置也可能不同:当程序申请内存空间后, *** 作系统会将所申请的内存空间的地址传给程序,尽管数据的位置不同,但程序知道数据的地址,故程序依然可以根据地址来找到所需要的数据。
指针所指对象的数据类型
,和前面的一起说明是指向对象的指针;
第二个是乘法运算;
(指针所指对象对的数据类型
)
这一句就是强制转换成对象的指针;
可以直接写成p=(char
)malloc(9),不过不建议用,推荐用
#define
size
9
……
……
……
p=(char
)malloc(size)
或者
const
int
p
=
9;
……
……
……
p=(char
)malloc(size)
这样你使用多次需要修改的话只用改动一个地点,避免遗漏,这种形式也便于记忆!
上面那个,你貌似不懂耶
看好了
malloc
原型:extern void malloc(unsigned int num_bytes);
用法:#include <alloch>
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
举例:
// mallocc
#include <syslibh>
#include <alloch>
main()
{
char p;
clrscr(); // clear screen
p=(char )malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);
getchar();
return 0;
}
free
原型:extern void free(void p);
用法:#include <alloch>
功能:释放指针p所指向的的内存空间。
说明:p所指向的内存空间必须是用calloc,malloc,realloc所分配的内存。
如果p为NULL或指向不存在的内存块则不做任何 *** 作。
举例:
// freec
#include <syslibh>
#include <alloch>
main()
{
char p;
clrscr(); // clear screen
textmode(0x00);
p=(char )malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
getchar();
free(p); // release memory to reuse it
p=(char )calloc(100,1);
if(p)
printf("Memory Reallocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p); // release memory at program end
getchar();
return 0;
}
为什么很多人不喜欢c,c++,因为管理内存的一部分任何必须由程序员自己管理,不然很容易内存泄露,现在有很多检查内存泄露的软件比较常用的有(boundchecker)有兴趣的可以下个试一下自己的程序,你会发现自己好可怕。malloc free使用一般有几个原则(自己总结的,不一定正确,但很实用)
1 ,malloc free必须配套使用,并且尽可能逆序。
2 ,谁malloc的谁free
3,能够不动态分配的尽量不动态分配,动态分配是很费时间的,而且存在一定的风险。
很多人喜欢这样写程序:
type f()
{
type t = (type)malloc ( sizeof(type));
return t ;
}
这个肯定会出问题,一般象这种情况,一般声明f(type t),谁调用它谁为t分配空间,谁来释放它的空间。不过很有意思的是,在有写系统函数的会这样如(char asctime() ,它返回一个表示时间的字符指针,但是并不要求你释放,你也没有办法释放,但是我可以肯定它这个串肯定不是在堆区分配的)
free的顺序也很重要,很多时候free的时候会出现空指针的引用,不足为齐。有人提议free(t);t = NULL ;这种用法,有一定的道理,当你free一块空间后, *** 作系统不会立即回收,所以在你再次用t的时候可能还是可以用的,t就成了个野指针,而将其t = NULL后,对t的引用会出问题。
C语言中数组的sizeof值等于数组所占用的内存字节数。
C语言中有一个专门用于检测类型或变量或数组在内存中所占有的空间(字节数)的 *** 作符sizeof,用sizeof可以直接检测出数组在内存占有的字节数。
语法规则是:sizeof(x); (识别没有歧义时也可写成sizeof x;)——其中x是类型名、变量名或数组名等,返回x所占字节数(int型)。
扩展资料:
sizeof的使用规则:
1、基本数据类型的sizeof:
这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成麻烦。一般的,在32位编译环境中,sizeof(int)的取值为4。
2、指针变量的sizeof:
指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。
参考资料来源:百度百科-sizeof
以上就是关于C语言写程序提高程序效率减小空间的方法都有哪些全部的内容,包括:C语言写程序提高程序效率减小空间的方法都有哪些、C语言 程序设计 关于 指针空间定义、c语言程序运行时 内存问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)