内存管理

leizhengdeng 2002-01-25 09:13:13
OS - Unix, Database - Oracle, Language - Pro *C
我现在从数据库中查到大量数据放到了结构体数组A里,
方法是先用select count(*)得到A数组的大小,然后一个一个地fecth填入A的成员中。
同样的方法我得到了B.
现在我要根据一些条件来将A,B组合成C:
方法是找到满足条件的话用realloc(C, n+1),每次内存大小增加一个C。这样每次都要内存拷贝和释放(realloc)效率低。

问如何解决?
用链表会不会产生大量内存碎片?
...全文
128 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_feng_fly 2002-01-25
  • 打赏
  • 举报
回复
就是先分配一大块内存,当你需要内存的时候,就从这已经分配好的内存里面分一小块出去并做好标计,不用了还是还回来,这样,不管怎么做都是在这一大块内存里面,就不会有什么碎片了,一般是使用链表来记录没有使用的内存,可以看看<effectiv c++>(如果我没记错,那上面应该有)
leizhengdeng 2002-01-25
  • 打赏
  • 举报
回复
to GuanXP(不能用于登录) 
能给具体的提示吗?
GuanXP 2002-01-25
  • 打赏
  • 举报
回复
使用自己的内存池,由自己管理内存.
leizhengdeng 2002-01-25
  • 打赏
  • 举报
回复
因为这个操作是经常性的,大量的malloc,free不会有碎片吗?
jyc_nj 2002-01-25
  • 打赏
  • 举报
回复
C啊,就用链表吧,注意alloc和free的使用,不会有什么 碎片吧。
leizhengdeng 2002-01-25
  • 打赏
  • 举报
回复
to: shornmao(死猫) 什么意思?
shornmao 2002-01-25
  • 打赏
  • 举报
回复
STL中的动态增长的实现思想是,如果差n bytes的空间,那就分配2*n bytes的空间。
leizhengdeng 2002-01-25
  • 打赏
  • 举报
回复
觉得最好是每次都分配一个较大的空间,能存下一定数目的C,不足时再分配这样的一个空间,
这个方法不错,我们也考虑过。
谁还有更好的方法?
leizhengdeng 2002-01-25
  • 打赏
  • 举报
回复
我用的是c,不是c++,c也有vector吗?
jyc_nj 2002-01-25
  • 打赏
  • 举报
回复
分配内存的方法,觉得最好是每次都分配一个较大的空间,能存下一定数目的C,不足时再分配这样的一个空间。其实管理起来是很简单的,而且碎片是很少的,就象汇编下提供的读取文件的方法,也并不是你要多少它就读到内存多少。
至于用链表,用vector吧,省不少事。
leizhengdeng 2002-01-25
  • 打赏
  • 举报
回复
A,B是根据大小malloc的
ipnet 2002-01-25
  • 打赏
  • 举报
回复
象这种大的内存块的管理,比较好的方法是首先开辟一块大的内存空间,然后在这块空间里再进行操作。块里的操作,就要看你程序使用数据的频繁程度和每一次使用的块的大小是否想差很大来选择。
leizhengdeng 2002-01-25
  • 打赏
  • 举报
回复
我想还是每次都分配一个较大的空间,能存下一定数目的C,不足时再分配这样的一个空间,这些空间以链表形式连接比较好。
第一章 走进linux 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 1.3走进Linux内核 1.4 分析Linux内核的意义 1.5 Linux内核结构 1.6 Linux内核源代码 1.7 Linux内核源代码分析工具 第二章 Linux运行的硬件基础 2.1 i386的寄存器 2.2 内存地址 2.3 段机制和描述符 2.4 分页机制 2.5 Linux中的分页机制 2.6 Linux中的汇编语言 第三章中断机制 3.1 中断基本知识 3.2中断描述符表的初始化 3.3异常处理 3.4 中断处理 3.5中断的后半部分处理机制 第四章 进程描述 4.1 进程和程序(Process and Program) 4.2 Linux中的进程概述 4.3 task_struct结构描述 4.4 task_struct结构在内存中的存放 4.5 进程组织的方式 4.6 内核线程 4.7 进程的权能 4.8 内核同步 第五章进程调度 5.1 Linux时间系统 5.2 时钟中断 5.3 Linux的调度程序-Schedule( ) 5.4 进程切换 第六章 Linux内存管理 6.1 Linux的内存管理概述 6.2 Linux内存管理的初始化 6.3 内存的分配和回收 6.4 地址映射机制 6.5 请页机制 6.6 交换机制 6.7 缓存和刷新机制 6.8 进程的创建和执行 第七章 进程间通信 7.1 管道 7.2 信号(signal) 7.3 System V 的IPC机制 第八章 虚拟文件系统 8.1 概述 8.2 VFS中的数据结构 8.3 高速缓存 8.4 文件系统的注册、安装与拆卸 8.5 限额机制 8.6 具体文件系统举例 8.7 文件系统的系统调用 8 .8 Linux2.4文件系统的移植问题 第九章 Ext2文件系统 9.1 基本概念 9.2 Ext2的磁盘布局和数据结构 9.3 文件的访问权限和安全 9.4 链接文件 9.5 分配策略 第十章 模块机制 10.1 概述 10.2 实现机制 10.3 模块的装入和卸载 10.4 内核版本 10.5 编写内核模块 第十一章 设备驱动程序 11.1 概述 11.2 设备驱动基础 11.3 块设备驱动程序 11.4 字符设备驱动程序 第十二章 网络 12.1 概述 12.2 网络协议 12.3 套接字(socket) 12.4 套接字缓冲区(sk_buff) 12.5 网络设备接口 第十三章 启动系统 13.1 初始化流程 13.2 初始化的任务 13.3 Linux 的Boot Loarder 13.4 进入操作系统 13.5 main.c中的初始化 13.6 建立init进程 附录: 1 Linux 2.4内核API 2.1 驱动程序的基本函数 2.2 双向循环链表的操作 2.3 基本C库函数 2.4 Linux内存管理中Slab缓冲区 2.5 Linux中的VFS 2.6 Linux的连网 2.7 网络设备支持 2.8 模块支持 2.9 硬件接口 2.10 块设备 2.11 USB 设备

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧