在linux中运行c语言(您知道Linux下C语言编程的一些注意事项吗_教育中国)
Comments
开年以来读到的第一篇雄文 ,如饮烈酒 ,甘冽有劲 。
Posted by:
寒流 | (24)
February 27, 2011 01:28 AMstrdup是posix的, 不是c库.呵呵
Posted by:
cc | (23)
August 6, 2010 10:16 PM哈哈 ,我们有共同点语言 ,我大胆地猜测 ,风云大哥一定更喜欢使用写codegen来解决语言的不足 ,而不是去依赖某一语言的特性 。
Posted by:
artizc | (22)
February 14, 2009 03:00 PM方法三稍微修改 ,函数内部静态空间每线程一个 ,与当前线程(ID)捆绑 。实现上以线程ID为key ,在数组或HashMap中存放缓存 ,实现颇为简单 ,性能几乎丝毫不损 ,也可解决文中大部分问题,唯是不可重入 。不过正如云风所说 ,这个问题可能不是问题 。
Posted by:
rich | (21)
January 30, 2009 11:04 AMC 语言标准并没有特别限制返回值不能是什么 ,所以 C 是允许返回struct 作为一种返回复杂数据的方案的 。
不知道被以前看过的哪本书误导,我觉得返回 struct 是 C++ 对 C 的一个扩展 。(其实不是)
感谢指出这个错误的朋友 ,我今天仔细核对了 ISO C90 和 ISO C99 标准 。:D
Posted by:
Cloud | (20)
January 10, 2009 08:01 PM您的语言表达能力有待提高啊 。 。 。
Posted by:
Avin | (19)
January 9, 2009 01:40 PM"这让我想到了 MySQL 的 C 语言接口 。很多初学 C++ 的程序员 ,很喜欢把那些 C 接口“封装 ”成“漂亮 ”的 C++ 接口。直接返回 vector 套 map 的多层模板实例 。不知道有多少人干过?前几年我带实习生的时候反正见过不少 。如果同学你现在醒悟了 ,明白这是件巨傻X 的事情 ,那么握握手 ,我们有共同理念;否则(C++ 封装以后不是很“酷 ”吗?) ,我们暂时没有共同语言了。"
呵呵 ,我也这样干过 。不过 ,没办法 ,谁叫咱 ,那时候刚学会
c++,不管什么东西 ,都要用我的c++这把小斧头试试啊 。
Posted by:
Anonymous | (18)
January 9, 2009 01:14 PMwindows api的调用历来就是这么做的
Posted by:
Anonymous | (17)
January 8, 2009 05:05 PM为什么说C函数不能返回结构?
Posted by:
Anonymous | (16)
January 8, 2009 03:42 PM为什么不看看xdr? sun rpc中的数据序列化方式 ,如果嫌它在线程安全上问题太多,那么看看cdr?C++和java都在用它 。corba的idl和sun rpc的xdr就是两个很好的用DSL定义数据然后交给C语言去解析的例子 。我觉得你所讨论的这些 ,在它们的实现上全有答案 。
至于allocator ,我只在loki中看见它为小对象设计过,专用于小于64bits的小对象的分配 。我觉得这方面是花力未必讨好的事情 。有时间可以做点别的优化 。哦 ,可以借其做内存泄露的调试器 。
至于数据接收区的大小 ,我觉得stl的stringstream以及string/vector这些都做的很好 ,根据需求自动增长 ,还可以让程序员可以灵活的预留空间 。但是可惜没有realloc 。不知道你的应用具体是什么情形 ,如果每次都是delete/new而没有realloc,对于性能影响大不 。
Posted by:
snnn | (15)
January 8, 2009 02:49 PM感觉就是在说fgets嘛
Posted by:
zii | (14)
January 8, 2009 12:09 PM这篇文章提了一个问题:如何用C语言接收被调用函数返回的数据块?
答案是:调用者分配内存 ,然后传指针给调用函数。被调用者往里面填数据 。
简单的说就是:去超市买东西得自备购物袋 。
Posted by:
D.K | (13)
January 8, 2009 10:19 AM当初我以为指针的数值等于指针指向的地址
后来才发现这两是不等的。
我到现在还是没搞清楚这两者的关系 。
只是 知道 指针的数值的地址包含有个指针头数据才到指针真正的数据的地址 。
有没有语法或函数得到一个指针指向数据的长度?
Posted by:
dvaknheo | (12)
January 7, 2009 11:50 PM感觉写得很混乱 ,看得不是很明白 ,说的是对2进制数据的描述?
bioware的很多游戏文件都是2进制描述的 ,比如.tlk ,从博德1开始发展到现在也没淘汰 ,可以描述一段对话的文本(字符串) ,配音文件(字符串),时间轴(浮点) ,颜色什么的 ,实现也简单,像元数据 ,先用一个数据结构描述数据结构的结构 ,然后就是按字节依次填充了
Posted by:
black | (11)
January 7, 2009 08:13 PM我们公司的模块间数据接口多数是这种类似fread的方案 。不过看RADVISON的代码就喜欢传分配器了 。
GLib就有点用C写C++的感觉 。
Posted by:
zelor | (10)
January 7, 2009 06:26 PM传分配器也可以"要求解析器生成的数据结构放在一块连续的内存空间上"啊 ,只不过 ,真的有点怪 ,明明传了个分配器 ,却又约定只能调用一次-_-!或者传一个类似于realloc的分配器?
Posted by:
天堂的隔壁 | (9)
January 7, 2009 05:25 PM呵呵 ,最终的解决办法 省心啊 , 时间真的很宝贵 ,省出的时间可以泡泡妞 ,灌灌水 , 这才叫生活
Posted by:
lbaby | (8)
January 7, 2009 02:35 PMpool 是一个内部解决方案 ,能不暴露出来就不暴露出来 。否则,就需要记住两个东西:1. 结构的地址, 2. pool . 并且要记住两者的关系 。
如果要用的话 ,最好和别的部分正交化 。比如 ,先创建后 pool 传递 buffer 指针进去 。
至于 pool 的伸展能力,在这里不是必须的 。文中已有讲述 。遵循能减则减的原则 ,就可以去掉了 。
其实在堆上还是在栈上的问题 ,即使传分配器 ,也是都可以兼顾到的 :) 只要愿意弄点奇技淫巧的话。
传分配器的大问题是 ,复杂的数据结构是多次分配的 ,而最终需要一次释放 。这限制了分配器的设计(必须设计成 pool 那种 ,而不能是 C 标准的 malloc )
Posted by:
Cloud | (7)
January 7, 2009 01:43 PM虽然内存管理器等方案也不算坏 ,但从KISS上说 ,传内存确实用起来最简单 ,也灵活 。(注意云风多次强调 ,内存可以在堆里分 ,也可以在栈上分 ,似乎要达到这个目地传内存就是唯一的方法了)
Posted by:
天堂的隔壁 | (6)
January 7, 2009 12:45 PM哈哈,新年好 ,特别谢谢上个星期云风大哥帮我抽中的豆浆机 ,豆浆很好喝,呵呵。
平时也一直在用c语言 ,说些我的看法吧:
1 、c是用来做一些底层和性能要求较高的事情 ,如果不是很注重性能的话 ,没必要用它 。
2 、c是可以传结构体的 。c中对于不定的结构体 ,可以用void指针 。
4 、对于像nginx这类代码 ,可以借鉴一下它里面的pool的概念 。也就是对于不同的生存期的对象定义不同的pool ,在对象开始时 ,分配一定的内存 ,在对象存活时 ,可以从这个pool中分配内存 ,不够的话 ,扩大这个pool 。在对象消亡时 ,释放这个对象的pool 。pool底层的实现其实都是malloc来做的 。不过它的特定环境是session这类有特定生存期的对象,与程序的原有设计关系很大 ,如果是通用的内存分配 ,像这类东西就没法做到了 。
Posted by:
yaoweibin | (5)
January 7, 2009 10:43 AMGLib很多模块都是传构造和析构函数指针进去,或者至少传析构指针
Posted by:
Anonymous | (4)
January 7, 2009 09:10 AM至于说的引入析构函数指针的问题 ,一般情况下 ,内存都由内存分配器管理 ,不同生命期的对象使用不同的管理器 ,如果只牵涉的内存的话 ,我觉得要注册析构的情况是很少的
Posted by:
exile | (3)
January 7, 2009 01:40 AM我觉得传入一个内存管理器的方式挺好的啊 ,比如像nginx这样的内存管理 ,有点类似于Apache的apr_pool ,但更适合一般的应用 ,除了性能的提升 ,更重要的是使用起来更简单 ,最终统一释放 ,也不容易产生内存泄露 。
Posted by:
exile | (2)
January 7, 2009 01:28 AM不懂?学习!
Posted by:
xinghang | (1)
January 7, 2009 12:23 AM创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!