终于有了间茅草棚

——我走时,会否有随风飘散的痕迹?

外面的风好大,雨也淅淅沥沥的。

世间种种的诱惑不惊不扰我清梦,山高路远不绝我追踪你绝美的笑容,登高一呼时才懂始终在为你心痛,俯首对花影摇动都是东风在捉弄

世间种种的迷惑都是因你而猜错,水光月光又交融描述这朗朗的夜空,生死到头的相从似狂花落叶般从容,当一切泯灭如梦就在远山被绝
随笔 - 39, 文章 - 2, 评论 - 257, 引用 - 3

导航

<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

留言簿(11)

随笔档案

文章档案

收藏夹

其它的我

友情连接

网页连接

搜索

最新评论

  • 1. re: 关于质数(素数)的算法
  • 1121=19*59
  • --李圆欢
  • 2. re: void *几用
  • 方法都不错
  • --员工生日礼物
  • 3. re: void *几用
  • to oshj:
    最近才悟道这个用法,没想到你都用了很多了。

    to brent:
    不是为了玩才玩,这里每种用法在特定的情况下,都有他相应的好处。不过,我是做为自己记录的,指不定什么时候就忘记了,还可以这么用。
    1. 可以使得头文件简单,而且出于实现保密的需要,还是很有用处的。
    2. 很多时候对象本身应该简洁,但往往应对不同的需要,通常需要数据对应。举个例子,比如玩家在哪个房间,在哪个房间最好不要直接记在玩家身上,用数据注入的方式,能够很快的获得该信息。
    3. 因为是做为库暴露头文件的,使用者并不关心void *的实际意义,而且能够加快编译速度。真正要关心时,就Graphics.h这个头文件是不够的,通常会需要了解整底层个实现,才能较好的扩充。
  • --清风雨
  • 4. re: void *几用
  • 还在玩C++语言,你这玩法, 又不是用在导弹导航上...
    别人看不懂的代码,都不是好代码,分数为0

    int sub(any) { any; return TRUE;}
    (void)sub(any);

  • --brent
  • 5. re: void *几用
  • 个人用3 的情况比较多
  • --oshj
  • 6. re: 简要记录sizeof和内存对齐
  • 很清楚,受教了
  • --rdeam
  • 7. re: 局部变量
  • 我不用ATL,一般都是用标准c++支持的和平台API。
    crt里的wcs和mbs转换的函数,ms的实现是不完整的,在它的实现代码里有一段说明;而且还要设置local,比较烦琐。
  • --清风雨
  • 8. re: 简单字符串转换
  • win下,atl中有CT2CA, CW2CA等一系列转换类。
    crt中有wcstombs和mbstowcs
  • --局部变量
  • 9. re: 一个奇怪但可能有用的缓存
  • vc资料站:http://www.vcmsdn.com/     对学习很有帮助的,可以上去

    看看,或加群46138350,里面有高手可以请教的。
  • --maggie
  • 10. #progma整理
  • #pragma整理
  • --hi_wyl
  • 11. re: hpho
  • 缓冲在一等程度上是临时性的,而且实际上如果保持std::vector的iterator下次使用,也会有问题。

    所以,这个问题也就是使用时不允许这样用。
  • --清风雨
  • 12. re: 一个奇怪但可能有用的缓存
  • 如果有指针引用着arrange()所调整的那块内存,那就乱了.
  • --hpho
  • 13. re: 一个奇怪但可能有用的缓存
  • 用std::string不就行了?
  • --金庆
  • 14. re: ZiDing
  • 鉴于你的建议,前段时间我看了下boost的内存对象池,没有过于深入,
    判断下来属于做法类似,性能应该相当,甚至可能我这个略好一点。

    因为编写测试是一件相当麻烦,而且要求也很高的事,而要全面又很难。

    boost的代码我看起来比较难读,维护、调试起来对我来说是一个大麻烦。所以,我一般不选择boost。
  • --清风雨
  • 15. re: 简单内存对象池
  • 和boost的对比过没有?
  • --ZiDing

阅读排行榜

评论排行榜

偷别人的内存管理

    哈哈,题目都说了,偷别人的内存管理。俺就坏人了^_^
      很多时候,为了获得较好的内存性能,需要重载一下new。自己由于考虑服务器内存的问题,希望有较好的性能,和较少的碎片(服务器要长期运行的),又不喜欢太野蛮(一把申请一大堆内存,以后在里面分配。在微软XBOX小组组长的主页上,有几个定制的内存适配器,其中有静态分配就是这种方式,实际运行下来,发现效果并不理想。遗憾的是,这里不能给大家提供连接,机器重装把网址搞丢了,就记下了这个结论),自己写?还真不一定写的怎么好。幸好有别人的肩膀可以借用一下——SGI版STL实现的内存管理(对内存碎片和管理性能进行了严格考虑,而且事实证明非常有效)。
    俺用的是STLport。具体的就偷它了:

    .h头文件
    #include <vector>

    struct __impl_
    {
        void *operator new( size_t size )
        {
            return alloc.allocate( size );
        }
        void operator delete( void *obj, size_t size )
        {
            alloc.deallocate( static_cast< char * >( obj ),size );
        }
        static std::allocator< char > alloc;
    };

    .cpp实现文件
    std::allocator< char > __impl_::alloc

    以后,只要继承__impl_就可以了。而且不用当心兼容问题,stl的allocator是C++标准。
      不过,需要说明的是,STLport现在的做法是会特意泄漏内存的,如果你检测到内存泄漏,不要奇怪和大惊。经过讨论,STLport采用了特意不回收收集的小块内存,而借助现代操作系统的自动回收能力(应用程序退出时会收回分配给进程的内存)的做法,以减少内存印记、获得较好的再分配能力和性能。具体的详细解释,可以读源码,上STLport的交流论坛,或者看《STL源码剖析》——里面有关于SGI内存适配器(也是STLport所采用的)的解析。


/////////////////////////////////以下内容于 2006-2-25 添加/////////////////////////////////

      最近一直在思考,如何隐藏线程(这里就是想提供线程安全的版本)。今天,突然想到重载的new的线程安全,原始的new和malloc显然在多线程环境下是安全的,但是被重载的就不一定了。去看了STLport的源码。比较可惜的是,这个allocator是多线程不安全的,必需借助内部实现,我的STLport5.0只能用__multithreaded_alloc了。


/////////////////////////////////以下内容于 2006-3-6 添加/////////////////////////////////

      可以不用直接访问内部的__multithreaded_alloc,只要采用多线程方式编译代码,编译器会根据宏开关自动选择线程安全版本(STLport的宏还真麻烦^_^)。

posted on 2005-06-02 21:21 终于有了间茅草棚 阅读(2826) 评论(12)  编辑 收藏

评论

# re: 偷别人的内存管理

看到调试器里显示内存泄漏,我的心就哇凉哇凉的。
2005-06-03 10:45 | me

# re: 偷别人的内存管理

嘻嘻,有时我用LOKI的
2005-06-03 11:29 | netsin

# 有效内存泄漏多好啊!^_^

LOKI,还不知道是什么(大脑里似乎什么时候听说过,但是,就是没印象了)。 回家时,好好找找看看。
2005-06-03 13:02 | 清风雨

# to 清风雨:

LOKI 是类似boost一样的C++开源库,成立很早了,也正因为很早,当时C++对模板支持不太好,所以其中使用了很多高深的技巧,被Bjarne批评为“太聪明”^_^
2005-06-03 19:40 | 周星星

# re: 偷别人的内存管理

一个内存池。。。


如果STL里把它独立出来就太好了。不知道Boost里的pool与这个相比性能如何。

据说LOCK主要是用来封装设计模式的吧?难道也插手内存管理?
2005-06-06 11:13 | 好人

# STL里面的alloctor就是标准的

也就是独立的。只是没有对外公开使用而已,我无赖,强行拿来用了。
2005-06-06 12:09 | 清风雨

# re: 偷别人的内存管理

晕。怎么打错字了。LOKI怎么打成LOCK了。

真没面子~~~~~~~
2005-06-07 09:55 | 好人

# 哈哈!

我同事也说,好认真没面子。^_^
2005-06-07 19:27 | 清风雨

# re: 偷别人的内存管理

不错
2005-06-09 00:40 | wy

# re: 偷别人的内存管理

sGi标准的内存管理为std::allocator, 它只是HP原始版本,并没有考虑到任何效率的强化.

SGI从来不用它,SGI用的是std::alloc
2005-11-07 23:53 | 乌雕

# re: 偷别人的内存管理

sGi标准的内存管理为std::allocator, 它只是HP原始版本,并没有考虑到任何效率的强化.

SGI从来不用它,SGI用的是std::alloc
2005-11-07 23:53 | 乌雕

# re: 乌雕

你的说法很有道理,而且在候的书里也有指出。
不过,实际你根据代码(或调试跟踪),会发现std::allocator< T >的allocate和deallocate是调用的__sgi_alloc下,而__sgi_alloc是根据预编译宏来选择allocater的。
候的书上是特别指出过,不知是不是现在的STLport版本做了调整,记得好像看到过一次说明,至于是在头文件里还是在STLport的论坛里看到的,我忘了。
自己调试时,确实是调用的内存优化处理的版本。(我这里是STLport 5.0,不知道我当时贴这个时,是看的4.6.2还是5.0,具体忘了)
2005-11-10 22:43 | 清风雨
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]