免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: KBTiller
打印 上一主题 下一主题

特邀专家在线答疑——名不正则言不顺 一网打尽C语言基本概念 [复制链接]

论坛徽章:
0
181 [报告]
发表于 2011-05-10 18:18 |只看该作者
回复  xue-feng

那后半句:不同编译器可以不同的实现,怎么体现呀?
mirnshi 发表于 2011-05-09 23:36



    那只是可以而已,未必会这么做,编译器最方便的实现方式当然是利用系统内存管理api。另一种可能的实现是:假设系统api分配内存,需要切换内核状态,可能速度会慢,crt可以一次申请一大块内存,然后在用户态二次分配。不够了再向系统申请。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
182 [报告]
发表于 2011-05-10 20:30 |只看该作者
那只是可以而已,未必会这么做,编译器最方便的实现方式当然是利用系统内存管理api。另一种可能的 ...
xue-feng 发表于 2011-05-10 18:18


哪种编译器,什么时候准备接替OS管理计算机资源?

论坛徽章:
0
183 [报告]
发表于 2011-05-11 09:37 |只看该作者
以前写程序往往会遇到很多问题,以至于一个strlen和sizeof的区别导致程序运行结果完全错误!

基本概念还是非常非常重要的。

我对回调函数以及函数回调有一些不理解?能给些少许解释么?

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
184 [报告]
发表于 2011-05-11 14:47 |只看该作者
越学越觉得深不可测!

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
185 [报告]
发表于 2011-05-11 15:32 |只看该作者
这和C没关系,只是一类问题的解决方法。

A fork一个进程,调用libA.so
A 与克隆子进程pipe方式通信 ...
mirnshi 发表于 2011-05-09 23:42



   
>> ,我记得MS最后是使用类似这样的方法来做的。
不是编码,解码而已。
但是这个做法也是有问题的。因为你无法确保,memory leak 以后,OS kill A or A's child.
后来我们是加了对A's child的 内存限制。


这和C没关系,只是一类问题的解决方法。

>>如果使用上述方式,可以说和C没关。

回复 165# robin10
    问题的确有趣,不过我想不出用C语言可以解决这样的问题

>>但是,前2天看了这个帖的时候,回忆一下当时尝试的另外一种放松,可能会更加好玩的解决这个问题。
当然,我自己也还没有验证过。这个方式,估计除了C以外,很多语言都是做不到的(当然,其实很多语言我是不了解)。

那么,这和C有关了吧:)
比如说long jump 之类的。

1.不要直接使用libc.so 的 malloc();
2.可以在libA.so and libc.so 之间,加一个 libmyc.so 提供 malloc() and free(),申请内存时,可以直接使用brk()
3.libmyc.so 可以对申请到的内存做一个简单的管理,比如总数大小;
4. A or A's child都有最大内存限制。可以启动的时候设置,也可以单纯的只是DEFINE一个数字 MEM_MAX。
5. 当libmyc.so中 mem_sum >MEM_MAX 时:

  5.1 方式a:如果是A fork()出来了 A1,那么可以kill A1 ,restart A1;
         此方式需要重新启动很多东西,包括窗口等,过程有点漫长,也无需要libmyc.so就可以实现,因为linux已经提供了内存限制的接口。

   5.2 方式b:如果使用long jump,那么需要的时间应该比方式a短,而且,我们可以在适当的位置设置long jump label,
         这样,我们可以在A起来以后,先做一些初始化和计数器,写log等功能,这部分功能如果不会收到long jump的影响,当然是比较好的。
         而具体是所么时候需要 jump,那么可以根据libmyc.so提供的数据而决定,而不是等到了OS kill A以后才做。

简单对比一下 ,(假设方式b是可行的),那么,包括重启A1,包括 A ,A1 的通讯 TIMEOUT,那么应该可以节省3秒以上的时间。
而且方式二可以让A继续去做其他的一些事情。。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
186 [报告]
发表于 2011-05-11 15:41 |只看该作者
2.可以在libA.so and libc.so 之间,加一个 libmyc.so 提供 malloc() and free(),申请内存时,可以直接使用brk()

>>关于这点,引出了另外项目中的一个好玩的问题,就是使用2个lib*.so中,有同样名字的api,开始当然是不知道。。。
结果浪费了一天时间来找这样的问题。

论坛徽章:
0
187 [报告]
发表于 2011-05-11 17:55 |只看该作者
3.7.3
wide character
bit representation that fits in an object of type wchar_t, capable of representing any character in the current locale
宽字符
与wchar_t类型数据对象相匹配的位表示,能够表示当前地域的任何字符。

论坛徽章:
0
188 [报告]
发表于 2011-05-11 19:19 |只看该作者
回复 185# robin10


    你说的也有道理。非常感谢您从很独到的角度发表的见解

论坛徽章:
0
189 [报告]
发表于 2011-05-11 19:33 |只看该作者
本帖最后由 KBTiller 于 2011-05-11 19:35 编辑
我对回调函数以及函数回调有一些不理解?能给些少许解释么?
whyliyi 发表于 2011-05-11 09:37

       抄一段《狂人C》的内容,希望能对您理解“回调”有所帮助

     如表14-7所示,这两个函数最有趣的就是它们的函数原型。

                                                                             表14-7                                查找与排序

函数名用途
void qsort(void *base, size_t nmemb, size_t size , int (*compar)(const void *, const void *));排序
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));查找

      qsort()的前三个参数“void *base, size_t nmemb, size_t size,”实际上是在向函数传递一个数组。由于编写这个函数的人并不知道你要传递一个什么样的数组,所以没有办法把形参写成一个指向数组起始元素的指针类型以及数组元素个数这样的形式。他只能把你传过去的指向数组起始元素的指针作为“void *”类型来接收。

    这样,问题出现了:他不清楚数组元素的类型。因此他又补了一个“size_t size”来了解数组元素所占据的空间。

这个函数的编写者同样不清楚你要求他按照升序还是降序来对数组排序。所以他又增加了一个传递这种比较两个元素“大”、“小”或先后次序的“比较准则”的参数。这个参数是以指向函数的指针形式出现的。这很有趣,对于这个参数,从某种意义上来说,“哥传过去的不是‘数据’,是‘动作’”。

    不仅如此,这个“动作”的定义也是由你指定的。很多情况下你需要亲自定义这个函数。哪怕你只是要求qsort()做一个最简单的int类型元素数组的递增排序,你也得自己定义一个这样的函数:

       int bidaxiao(const void *p_zs1, const void *p_zs2)

       {

         return *(int *) p_zs1 - * (int *) p_zs2 ;

       }

    其中的“(int *)”表示你知道p_zs1p_zs2其实是由两个指向“int”数据的指针转换来的。

    这样,更有趣的事情出现了,qsort()必须借助你定义的函数才能完成工作。在你调用了它之后,它总是要回来调用你定义的函数。这就是所谓的“回调”(Call-Back)
      

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
190 [报告]
发表于 2011-05-11 19:35 |只看该作者
回复 188# KBTiller


    对其他语言不熟悉,MS其他比较高级的语言一般都没有short jump/long jump这样的东西吧?
虽然这样的东西,99%的代码都不会使用,也尽可能的不要/少 使用,不过毕竟算是C中一个比较有特色的地方吧。。

既然LZ是要谈C标准,不妨也谈谈jump?

R&K的C 里面 还是 Unix环境高级编程 上面好像也有这个内容,不过MS比较简单,忘记鸟。。。
LZ或者可以谈谈JUMP之前之后的堆盏变化等等。。。我想有人会喜欢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP