易截截图软件、单文件、免安装、纯绿色、仅160KB

C/C++语言实现动态数组


C数组的小问题
     这里说的动态数组是可以根据需要动态增长占用内存的数组,比如程序初始分配了100个元素,可是运行了一段时间后区区100个空间不能满足了,现在需要400个,怎么办呢;那肯定需要再额外分配300个。
     C语言有realloc()函数来解决空间扩充的问题,但是不要忘了realloc可能会迁移内存,很多时候数组中的元素会被其它函数/模块引用,如果地址发生了变化,结果将是灾难性的。
     那么STL的vector呢?它也有相同的问题。
     一次分配足够的空间是可以解决这个问题,很明显这会造成内存的浪费,这个做法不算明智。
     不使用数组呢?使用list能解决一部分问题,但是list不能支持随机访问啊,鉴于效率上的硬伤,显然不能随便用list替换数组。
     怎么解决这个问题呢?动态数组!在HPServer 的Demutex Table就用到了动态数组,事实证明效果不错。
动态数组的特征
动态数组是一个很简单易用的数据结构,但是简单不代表优点小,它的特征如下:
1 根据需要动态批量增长内存;
2 一经分配,元素地址不会再次变化;
3 实现简单,效率高,事实上它和普通数组相比基本没有效率损失;
4 最大个数固定; 
其实最重要的就是特征2了,不然直接使用realloc多方便呢,当然动态数组的实现也很方便,下面就会详细说说。
特征4实际上是个限制,但是相信我,你的程序不可能达到这个最大值。
动态数组的实现
如上面所说的,动态数组实现起来很简单,以下都假设数组元素类型是T,首先需要一个辅助数据结构。
view plaincopy to clipboardprint?
struct ARRAY_ELE_S  
{  
    T item_array[1024];  
};  
ARRAY_ELE_S *pArray[2000];  
int iSize;   
变量pArray是一个ARRAY_ELE_S类型的指针数组,这个也就是你的动态数组了;iSize记录了当前数组的大小。
上面的代码表明:
1 数组每次动态增长1024个元素;
2 数组的最大元素个数可以到:2000*1024个,如果这个还不够,你可以把这个值改的更大点。
先来看看内存占用,pArray本身占用2000*4,大约是8K的内存,基本可以忽略了。
如果一次分配一个2000*1024的数组array[2000*1024],那么一次就要分配的内存是:2*sizeof


相关文档:

C/C++程序内存分配详解


一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。
2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可 ......

程序员的自我修养: 程序运行的基石 C/C++运行库

一个C语言运行库大致包含了如下功能:
1. 启动与退出: 包括入口函数及入口函数所依赖的其它函数等
2. 标准函数: 由C语言标准规定的C语言标准库所拥有的函数实现.
3. I/O: IO功能的封装和实现
4. 堆:堆的封装和实现
5. 语言实现: 语言中一些特殊功能的实现.
6. 调试: 实现调试功能的代码.
在这些运行库的组成成分中, C ......

Objective —C 的单例模式 Singleton实现


static
 DataManager 
*
sharedDataManager 
=
 nil;
+
 (DataManager 
*
) sharedManager
{
    @synchronized(self)
 {
        
if
 (sharedDataManager 
==
 nil)
 &nb ......

C unsigned int and int

首先进行一个实验,分别定义一个signed int型数据和unsigned int型数据,然后进行大小比较:
unsigned int a=20;
signed int b=-130;
a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?
这是因为在C语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号 ......

用C/C++做DLL函数的导出方法

由于VC编译器有函数重命名的功能所以,确定函数名有两种方式:
1.extern "C"
2.使用.def文件
这两种也可以一起使用。
下面是一个例子:
extern "C" _declspec(dllexport)int __stdcall JieCheng(int a)
{//阶乘函数。输入:正整数。输出:这个数的阶乘值
 int b=1;
 for(int i=1;i<=a;i++)
 {
&n ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号