posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

     摘要: 详解QT 信号机制 (上篇)2011-07-05 18:32 佚名 互联网 我要评论(1) 字号:T | T信号不是Unix中进程间通信的信号。这里的信号更多地与图形界面的输入输出联系在一起(当然也可以是不可见的操作)。先来看内容。AD:QT 信号机制 是本文要介绍的内容,Qt用预编译器和宏来保证强大的跨平台能力,信号机制则是其中最精妙之处。本文分...  阅读全文

posted @ 2011-07-14 07:14 RTY 阅读(888) | 评论 (0)编辑 收藏

作者: Peter Wang (Intel) (28 篇文章) 日期: 九月 17, 2010 在 2:14 下午

最近Intel新发布的产品Intel® Parallel Studio 2011包含四个组件:Intel® Parallel Composer 2011, Intel® Parallel Inspector 2011,Intel® Parallel Amplifier 和Intel® Parallel Advisor。

我们知道Intel® Parallel Inspector 2011 可以对程序进行动态检查,包含内存检查和线程检查。

现在Intel® Parallel Studio 2011不用执行程序,也可以发现原代码的错误。这个功能(Static Security Analysis - SSA) 给我们带来的好处是:

  1. 只检查原代码,不检查程序。在最终程序生成前,发现问题。节约了大量的调试时间
  2. 检查所有的代码,不管路径有没有被执行到
  3. 还检查“死代码”
  4. 只专注于内存访问,不检查线程访问
  5. 无需Test Case (User Input)

SSA功能由二部分来实现:

  1. Intel® Parallel Composer 2011 实现静态扫描,生成结果
  2. Intel® Parallel Inspector 2011 打开结果文件,进行分析

Intel® Parallel Composer 2011 上的关键步骤:

1. 选择Intel C++编译器

2. 改变编译器的选项

3. 重新Rebuild, 生成结果

Intel® Parallel Inspector 2011上的关键步骤:

1. 打开结果文件,检查某个错误

2. 对照原代码,发现问题

3. 利用“帮助”,解释问题

分类: Blog Challenge, 并行计算, 英特尔® 软件网络 2.0
标签:
如需了解英特尔软件产品相关的性能和优化选项,请参阅优化注意事项.

posted @ 2011-07-13 21:39 RTY 阅读(519) | 评论 (0)编辑 收藏

 如题,链接如下:

http://developer.qt.nokia.com/elearning

 

posted @ 2011-07-13 07:18 RTY 阅读(313) | 评论 (0)编辑 收藏

     摘要: QML是什么?QML 是一中声明式语言,用来描述应用程序接口的――是什么样,有怎样的行为。在QML中,一个用户接口被指定为带有属性的对象是。这个介绍主要面向只有很少或者没有编码经验的人。在QML中,JavaScript作为一种脚本语言被使用。因此在深入学习QML之前,也许你会想要去学一些关于JavaScript的知识(JavaScript: The Definitive G...  阅读全文

posted @ 2011-07-06 22:03 RTY 阅读(1446) | 评论 (0)编辑 收藏

styleSheet : QString

This property holds the widget's style sheet.

The style sheet contains a textual description of customizations to the widget's style, as described in the Qt Style Sheets document.

Since Qt 4.5, Qt style sheets fully supports Mac OS X.

Warning: Qt style sheets are currently not supported for custom QStyle subclasses. We plan to address this in some future release.

This property was introduced in Qt 4.2.

Access functions:

QStringstyleSheet () const
voidsetStyleSheet ( const QString & styleSheet )


一定要注意速度,平凡的调用,一般会消耗0.25倍的CPU资源

posted @ 2011-07-04 20:47 RTY 阅读(3168) | 评论 (0)编辑 收藏

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 
  4 
  5 # Fast copy for Winodws or Linux
  6 # Copy file to
  7 
  8 import os
  9 import sys
 10 import re
 11 from optparse import OptionParser
 12 
 13 
 14 def CallFastCmd(src, dest):
 15      cmd = "XCOPY " + src +" " + dest
 16      print u"命令行"+ cmd
 17      os.system(cmd)
 18 
 19 def SplitStr(src, split):
 20      return src.split(split)
 21 
 22 
 23 
 24 def IsCanCopy(path, include, exclude):
 25     IsCan = False
 26     split = "|"
 27     if include is None:
 28         if exclude is None:
 29             IsCan = True
 30         else:
 31             for excStr in SplitStr(exclude, split):
 32                if (excStr not in path):
 33                    IsCan = True
 34     else:
 35         for incStr in SplitStr(include, split):
 36 
 37              if exclude is not None :
 38                  for excStr in SplitStr(exclude, split):
 39                      if (excStr not in path) and (incStr in path):
 40                          IsCan = True
 41              elif incStr in path:
 42                  IsCan = True
 43 
 44 
 45 
 46     #返回值
 47     return IsCan
 48 
 49 
 50 
 51 def CopyToSubDir(src, des, include, exclude, regEnable):
 52     for root,dirs,files in os.walk(des):
 53         for dirPath in dirs:
 54             subPath = os.path.join(root,dirPath) # 路径
 55             if not regEnable:
 56                if IsCanCopy(subPath, include, exclude):
 57                    CallFastCmd(src, subPath)
 58             else#使用正则表达式
 59                 incReg = include
 60                 excReg = exclude
 61 
 62                 incMatch = incReg.match(incReg, subPath)
 63                 if incMatch is not None:
 64                     excMatch = excReg.match(excReg, subPath)
 65                     if excMatch is None:
 66                         CallFastCmd(src, subPath)
 67 
 68 
 69 
 70 
 71 
 72 def Copy(src, des, include, exclude , regEnable):
 73     if not os.path.exists(des):
 74         CallFastCmd(src, des)
 75     else:
 76         CopyToSubDir(src, des, include, exclude, regEnable)
 77 
 78 
 79 
 80 def ParseCmd():
 81     parser = OptionParser()
 82     parser.add_option("-s""--src", action="store", dest="src", help="input the Dir or file")
 83     parser.add_option("-d""--des", action="store", dest="des", help="input the Dir or file")
 84     parser.add_option("-i""--include",action="store", dest="include", help="input the include string")
 85     parser.add_option("-e""--exclude",action="store", dest="exclude", help="input the exclude string")
 86     parser.add_option("-r""--regEnable",action="store_true", dest="regEnable", default=False, help="input the exclude string")
 87 
 88 
 89     (options, args) = parser.parse_args()
 90     if options.src is None:
 91         parser.error("The source is none")
 92     if options.des is None:
 93         parser.error("The dest is none")
 94 
 95     Copy(options.src, options.des, options.include, options.exclude, options.regEnable)
 96 
 97 if __name__ == "__main__":
 98     ParseCmd()
 99 
100 

posted @ 2011-06-21 00:47 RTY 阅读(463) | 评论 (0)编辑 收藏

Advanced PDF Password Recovery(PDF 文件解密的方案) V5.00 汉化绿色特别版


Advanced PDF Password Recovery(PDF 文件解密的方案) V5.00 汉化绿色特别版
Advanced PDF Password Recovery可以破解Adobe Acrobat PDF文件的“所有者密码”。未破解“所有者密码”的PDF文件是不能被编辑和打印的。该程序也可以破解用FileOpen插件加密的文件。破解可以立即 完成。破解后的文件可以用各种PDF浏览器(例如Adobe Acrobat Reader)阅读而无任何限制。
支持命令行格式
支持PDF文件限制直接解除
支持PDF文件密码的暴力破解
支持几种解密方式
支持PDF最新的版本

sn:APDFPR-P-R844-JCEN-BMSK



posted @ 2011-06-19 21:05 RTY 阅读(2007) | 评论 (0)编辑 收藏

一、针对Microsoft
#include   <stdlib.h>


(1)第一种方式
system( "PAUSE ");
--------------------
(2)第二种方式
getchar();
---------------------
(3)第三种方式
Sleep();



二、针对Linux
(1)第一种方式
getchar();

posted @ 2011-06-18 22:04 RTY 阅读(5388) | 评论 (0)编辑 收藏

概述

  size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。   例如bitset的size操作返回bitset对象中二进制位中的个数,返回值类型是size_t。   例如在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t。

来源

  size_t是标准C库中定义的,应为unsigned int。   数据类型"socklen_t"和int应该具有相同的长度。否则就会破坏 BSD套接字层的填充.POSIX开始的时候用的是size_t, Linus Torvalds(他希望有更多的人,但显然不是很多) 努力向他们解释使用size_t是完全错误的,因为在64位结构中 size_t和int的长度是不一样的,而这个参数(也就是accept函数的第三参数)的长度必 须和int一致,因为这是BSD套接字接口标准.最终POSIX的那帮家伙找到了解决的办法,那就是创造了一个新的类 型"socklen_t".Linux Torvalds说这是由于他们发现了自己的错误但又不好意思向大家伙儿承认,所以另外创造了一个新的数据类型 。   在C++中,设计 size_t 就是为了适应多个平台的 。size_t的引入增强了程序在不同平台上的可移植性。size_t是针对系统定制的一种数据类型,一般是整形,因为C/C++标准只定义一最低的位 数, 而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定议这样的数据类型。一般这 种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。经测试发现,在32位系统中size_t是4字节的,而在64位系统 中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。

posted @ 2011-06-18 21:53 RTY 阅读(389) | 评论 (0)编辑 收藏

malloc

原型:extern void *malloc(unsigned int num_bytes);
用法:#include <malloc.h>
或#include<stdlib.h>
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
malloc的语法是:指针名=(数据类型*)malloc(长度),(数据类型*)表示指针.
举例

// malloc.c
#include <syslib.h>
#include <malloc.h>
main()
{
char *p;
clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");

if(p)
free(p);
getchar();
return 0;
}

malloc()函数的工作机制

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足 用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传 给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片 段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检 查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。

浅析malloc()的几种实现方式

malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。
动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存 分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。本文简单介绍动态内存分 配函数malloc()及几种实现方法。
1. 简介
malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中 分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能 成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。
2. 函数说明
C语言的动态存储管理由一组标准库函数实现,其原型在标准文 件<stdlib.h>里描述,需要用这些功能时应包含这个文件。与动态存储分配有关的函数共有四个,其中就包括存储分配函数 malloc()。函数原型是:void *malloc (size_t n);这里的size_t是标准库里定义的一个类型,它是一个无符号整型。这个整型能够满足所有对存储块大小描述的需要,具体相当于哪个整型由具体的C系 统确定。malloc的返回值为(void *)类型(这是通用指针的一个重要用途),它分配一片能存放大小为n的数据的存储块,返回对应的指针值;如果不能满足申请(找不到能满足要求的存储块)就 返回NULL。在使用时,应该把malloc的返回值转换到特定指针类型,赋给一个指针。
注意,虽然这里的存储块是通过动态分配得到的,但是它的大小也是确定的,同样不允许越界使用。 例如上面程序段分配的块里能存n个双精度数据,随后的使用就必须在这个范围内进行。越界使用动态分配的存储块,尤其是越界赋值,可能引起非常严重的后果, 通常会破坏程序的运行系统,可能造成本程序或者整个计算机系统垮台。
下例是一个动态分配的例子:
#include <stdio.h>
#include<stdlib.h>
main()
{
int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/
count=100;
if((array=(int *)malloc(count*sizeof(int))) == NULL)
{
printf("不能成功分配存储空间。");
exit(1);
}
for(count=0;count<10;count++) /*给数组赋值*/
array[count]=count;
for(count=0;count<10;count++) /*打印数组元素*/
printf("%2d",array[count]);
}
上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array(int *) malloc (10*sizeof(int)))==NULL)语句可以分为以下几步:
1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
2)把此整型指针地址赋给array
3)检测返回值是否为NULL
3. malloc()工作机制
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。 调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的 大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存 块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于 是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。
4. malloc()在操作系统中的实现


    申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话:

   大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已 分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移 动也可能会改写本块的管理信息。

   以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。

struct mem_control_block {
int is_available;
int size;
};


在 C 程序中,多次使用malloc () 和 free()。不过,您可能没有用一些时间去思考它们在您的操作系统中是如何实现的。本节将向您展示 malloc 和 free 的一个最简化实现的代码,来帮助说明管理内存时都涉及到了哪些事情。
在大部分操作系统中,内存分配由以下两个简单的函数来处理:
void *malloc (long numbytes):该函数负责分配 numbytes 大小的内存,并返回指向第一个字节的指针。
void free(void *firstbyte):如果给定一个由先前的 malloc 返回的指针,那么该函数会将分配的空间归还给进程的“空闲空间”。
malloc_init 将是初始化内存分配程序的函数。它要完成以下三件事:将分配程序标识为已经初始化,找到系统中最后一个有效内存地址,然后建立起指向我们管理的内存的指针。这三个变量都是全局变量:
清单 1. 我们的简单分配程序的全局变量
int has_initialized = 0;
void *managed_memory_start;
void *last_valid_address;
如前所述,被映射的内存的边界(最后一个有效地址)常被称为系统中断点或者 当前中断点。在很多 UNIX? 系统中,为了指出当前系统中断点,必须使用 sbrk(0) 函数。 sbrk 根据参数中给出的字节数移动当前系统中断点,然后返回新的系统中断点。使用参数 0 只是返回当前中断点。这里是我们的 malloc 初始化代码,它将找到当前中断点并初始化我们的变量:
清单 2. 分配程序初始化函数
/* Include the sbrk function */
#include
void malloc_init()
{
/* grab the last valid address from the OS */
last_valid_address = sbrk(0);
/* we don't have any memory to manage yet, so
*just set the beginning to be last_valid_address
*/
managed_memory_start = last_valid_address;
/* Okay, we're initialized and ready to go */
has_initialized = 1;
}
现在,为了完全地管理内存,我们需要能够追踪要分配和回收哪些内存。在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构:
清单 3. 内存控制块结构定义
struct mem_control_block {
int is_available;
int size;
};
现在,您可能会认为当程序调用 malloc 时这会引发问题 —— 它们如何知道这个结构?答案是它们不必知道;在返回指针之前,我们会将其移动到这个结构之后,把它隐藏起来。这使得返回的指针指向没有用于任何其他用途的 内存。那样,从调用程序的角度来看,它们所得到的全部是空闲的、开放的内存。然后,当通过 free() 将该指针传递回来时,我们只需要倒退几个内存字节就可以再次找到这个结构。
在讨论分配内存之前,我们将先讨论释放,因为它更简单。为了释放内存,我们必须要做的惟一一件事情就是,获得我们给出的指针,回退 sizeof(struct mem_control_block) 个字节,并将其标记为可用的。这里是对应的代码:
清单 4. 解除分配函数
void free(void *firstbyte) {
struct mem_control_block *mcb;
/* Backup from the given pointer to find the
* mem_control_block
*/
mcb = firstbyte - sizeof(struct mem_control_block);
/* Mark the block as being available */
mcb->is_available = 1;
/* That's It! We're done. */
return;
}
如您所见,在这个分配程序中,内存的释放使用了一个非常简单的机制,在固定时间内完成内存释放。分配内存稍微困难一些。以下是该算法的略述:
清单 5. 主分配程序的伪代码
1. If our allocator has not been initialized, initialize it.
2. Add sizeof(struct mem_control_block) to the size requested.
3. start at managed_memory_start.
4. Are we at last_valid address?
5. If we are:
A. We didn't find any existing space that was large enough
-- ask the operating system for more and return that.
6. Otherwise:
A. Is the current space available (check is_available from
the mem_control_block)?
B. If it is:
i) Is it large enough (check "size" from the
mem_control_block)?
ii) If so:
a. Mark it as unavailable
b. Move past mem_control_block and return the
pointer
iii) Otherwise:
a. Move forward "size" bytes
b. Go back go step 4
C. Otherwise:
i) Move forward "size" bytes
ii) Go back to step 4
我们主要使用连接的指针遍历内存来寻找开放的内存块。这里是代码:
清单 6. 主分配程序
void *malloc(long numbytes) {
/* Holds where we are looking in memory */
void *current_location;
/* This is the same as current_location, but cast to a
* memory_control_block
*/
struct mem_control_block *current_location_mcb;
/* This is the memory location we will return. It will
* be set to 0 until we find something suitable
*/
void *memory_location;
/* Initialize if we haven't already done so */
if(! has_initialized) {
malloc_init();
}
/* The memory we search for has to include the memory
* control block, but the users of malloc don't need
* to know this, so we'll just add it in for them.
*/
numbytes = numbytes + sizeof(struct mem_control_block);
/* Set memory_location to 0 until we find a suitable
* location
*/
memory_location = 0;
/* Begin searching at the start of managed memory */
current_location = managed_memory_start;
/* Keep going until we have searched all allocated space */
while(current_location != last_valid_address)
{
/* current_location and current_location_mcb point
* to the same address. However, current_location_mcb
* is of the correct type, so we can use it as a struct.
* current_location is a void pointer so we can use it
* to calculate addresses.
*/
current_location_mcb =
(struct mem_control_block *)current_location;
if(current_location_mcb->is_available)
{
if(current_location_mcb->size >= numbytes)
{
/* Woohoo! We've found an open,
* appropriately-size location.
*/
/* It is no longer available */
current_location_mcb->is_available = 0;
/* We own it */
memory_location = current_location;
/* Leave the loop */
break;
}
}
/* If we made it here, it's because the Current memory
* block not suitable; move to the next one
*/
current_location = current_location +
current_location_mcb->size;
}
/* If we still don't have a valid location, we'll
* have to ask the operating system for more memory
*/
if(! memory_location)
{
/* Move the program break numbytes further */
sbrk(numbytes);
/* The new memory will be where the last valid
* address left off
*/
memory_location = last_valid_address;
/* We'll move the last valid address forward
* numbytes
*/
last_valid_address = last_valid_address + numbytes;
/* We need to initialize the mem_control_block */
current_location_mcb = memory_location;
current_location_mcb->is_available = 0;
current_location_mcb->size = numbytes;
}
/* Now, no matter what (well, except for error conditions),
* memory_location has the address of the memory, including
* the mem_control_block
*/
/* Move the pointer past the mem_control_block */
memory_location = memory_location + sizeof(struct mem_control_block);
/* Return the pointer */
return memory_location;
}
这就是我们的内存管理器。现在,我们只需要构建它,并在程序中使用它即可。
5. malloc()的其他实现
malloc() 的实现有很多,这些实现各有优点与缺点。在设计一个分配程序时,要面临许多需要折衷的选择,其中包括:
分配的速度。
回收的速度。
有线程的环境的行为。
内存将要被用光时的行为。
局部缓存。
簿记(Bookkeeping)内存开销。
虚拟内存环境中的行为。
小的或者大的对象。
实时保证。
每一个实现都有其自身的优缺点集合。在我们的简单的分配程序中,分配非常慢,而回收非常快。另外,由于它在使用虚拟内存系统方面较差,所以它最适于处理大的对象。
还有其他许多分配程序可以使用。其中包括:
Doug Lea Malloc:Doug Lea Malloc 实际上是完整的一组分配程序,其中包括 Doug Lea 的原始分配程序,GNU libc 分配程序和 ptmalloc。 Doug Lea 的分配程序有着与我们的版本非常类似的基本结构,但是它加入了索引,这使得搜索速度更快,并且可以将多个没有被使用的块组合为一个大的块。它还支持缓存, 以便更快地再次使用最近释放的内存。 ptmalloc 是 Doug Lea Malloc 的一个扩展版本,支持多线程。在本文后面的 参考资料部分中,有一篇描述 Doug Lea 的 Malloc 实现的文章。
BSD Malloc:BSD Malloc 是随 4.2 BSD 发行的实现,包含在 FreeBSD 之中,这个分配程序可以从预先确实大小的对象构成的池中分配对象。它有一些用于对象大小的 size 类,这些对象的大小为 2 的若干次幂减去某一常数。所以,如果您请求给定大小的一个对象,它就简单地分配一个与之匹配的 size 类。这样就提供了一个快速的实现,但是可能会浪费内存。在 参考资料部分中,有一篇描述该实现的文章。
Hoard:编写 Hoard 的目标是使内存分配在多线程环境中进行得非常快。因此,它的构造以锁的使用为中心,从而使所有进程不必等待分配内存。它可以显著地加快那些进行很多分配和回收的多线程进程的速度。在 参考资料部分中,有一篇描述该实现的文章。
众多可用的分配程序中最有名的就是上述这些分配程序。如果您的程序有特别的分配需求,那么您可能更愿意编写一个定制的能匹配您的程序内存分配方式的分配程序。不过,如果不熟悉分配程序的设计,那么定制分配程序通常会带来比它们解决的问题更多的问题。
6. 结束语
前面已经提过,多次调用malloc()后空闲内存被切成很多的小内存片段,这就使得用户在申 请内存使用时,由于找不到足够大的内存空间,malloc()需要进行内存整理,使得函数的性能越来越低。聪明的程序员通过总是分配大小为2的幂的内存 块,而最大限度地降低潜在的malloc性能丧失。也就是说,所分配的内存块大小为4字节、8字节、16字节、18446744073709551616 字节,等等。这样做最大限度地减少了进入空闲链的怪异片段(各种尺寸的小片段都有)的数量。尽管看起来这好像浪费了空间,但也容易看出浪费的空间永远不会 超过50%。
参考文献:
[1] Jonathan Bartlett,内存管理内幕. developerWorks 中国,2004年11月
[2] Jan Lindblad,内存碎片处理技术. EDN电子设计技术,2004年10月08日

转自:http://baike.baidu.com/view/736228.htm

posted @ 2011-06-18 20:20 RTY 阅读(889) | 评论 (0)编辑 收藏

仅列出标题
共31页: First 13 14 15 16 17 18 19 20 21 Last