(2)restrict 作用是让编译器对这个变量做一些优化,让它提高效率。下面的网站有列子。
(3)restrict只用来修饰指针,不能修饰普通变量,它表示只能该指针才能修改它的内容。如用memcpy时,两个内存存在重叠的现象。
(4) (这个网站里面有详细的例子)
(5)memcpy和memmove的区别 void *memcpy( void * restrict dest ,const void * restrict src,sizi_t n);这样它可以优化成memmove原理的方式(当存在重叠时,先复制到一段内存空间,然后再把它复制到目的空间)
7.4、作用域:(1)全局变量起名字一般是 g_a;
(2)名字加前缀表示
7.5、总结:<1>局部变量地址由运行时在栈上分配得到,多次执行时地址不一定相同,函数不能返回该类变量的地址(指针)作为返回值。
<2>为什么要分为数据段和.bbs段?因为当加载到内存重定位时,如果这些数据(包括0)一个一个的复制,会降低效率,为0的变量,直接清内存就可以了,这样提高效率。
<3>在头文件声明全局变量时, extern int a; 声明函数就是 void int max(int a, int b);
<4>写程序尽量避免使用全局变量,尤其是非static类型的全局变量。能确定不会被其他文件引用的全局变量一定要static修饰。(因为全局变量占内存的时间是最长的,要看你的变量是不是需要这么长的时间,这样可以节约内存空)
}
八、一些杂散但值得讨论的问题
{
8.1、操作系统的理解:<1>它是一个管理阶级者,管理所有资源,负责调配优化等操作。这样想象,就像裸机一样的话,要实现LED闪烁的进程、串口传输的进程、蜂鸣器等这些,他们都要抢占一些资源,
这个时候没有操作系统,就乱成一锅粥,当有了OS的时候,它就专门负责资源的调配,让各个任务都能很好的实施,起一个决策者的作用。
<2>如果我们要做一个产品,软件系统到底应该是裸机还是基于操作系统呢?本质上取决于产品本身的复杂度。只有极简单的功能、使用极简单的CPU(譬如单片机)的产品才会选择用裸机开发;
一般的复杂性产品都会选择基于操作系统来开发。
<3>操作系统负责管理和资源调配,应用程序负责具体的直接劳动,他们之间的接口就是API函数。当应用程序需要使用系统资源(譬如内存、譬如CPU、譬如硬件操作)时就通过API向操作系统发出申请,
然后操作系统响应申请帮助应用程序执行功能。
8.2、C库函数和API的关系:<1>从内核的角度看,需要考虑提供哪些有用的API函数,并不需要关注它们如何被使用。故编程时用API函数会感觉到不好用,没有做优化。系统只负责做出一个可以用的API,没有
考虑到用户使用的方便性。所以c库函数对API做了一些优化,让用户使用库函数更容易达到我们想要的目的。
<2>库函数实质还是用的API,或者调用了一个API,也或者调用了更多的API,只不过是做了更多的优化。比如 库函数fopen ,而API是open.
<3>有的库函数没有用到API,比如strcpy函数(复制字符串)和atoi函数(转换ASCII为整数),因为它们并不需要向内核请求任何服务。
8.3、不同平台(windows、linux、裸机)下库函数的差异
(1)不同操作系统API是不同的,但是都能完成所有的任务,只是完成一个任务所调用的API不同。
(2)库函数在不同操作系统下也不同,但是相似性要更高一些。这是人为的,因为人下意识想要屏蔽不同操作系统的差异,因此在封装API成库函数的时候,尽量使用了同一套接口,所以封装出来的库函数挺像的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33816-14.html
谁告诉你北洋没有一发炮弹击穿击穿主装甲
还要我们其它舰开进越南