WEB 开发 开发语言 Java 技术 .Net 技术 数 据 库 硬件使用
图象媒体 Linux/Unix 移动平台 嵌入开发 Windows 专区 软件工程
Ajax 技术 | ASP | PHP | ASP.NET | C# | JSP | Access | Oracle | 网页设计 | Flash | 安全专题 | IIS | VC/MFC | Delphi | C/C++
 你的位置:首页 > 开发语言 > VC/MFC

关于网络缓冲区与内存
[ 来源:ITWENKU 时间:2006-9-22 9:54:37 | 浏览:229人次 ]

请问我在C/S程序中,服务器怀客户端需要发送64K的数据,再加上一需头,就是说整个网络包超过64K。
以下两种内存分配方式,哪个更快。
第一:
typedef struct PACKET1
{
DOWRD dwLength;
.......
char buffer[64K]
}PACKET1

第二。
typedef struct PACKET2
{
DWORD dwLength;
.......
char* buffer; //在使用时从内存池中分配64K.
}PACKET2。

我个人认为第二方式快。因为他的内存没有超过64K。

请问是这样吗?




传指针?? 看来楼主对C的掌握有待提高


还得分情况,如果第一个是从栈上分配的,我想比第二个快。
具体情况,需要测试才了解。内存池的确可以加快分配速度,但也是有局限的啦。

──────────────────────
国内专业的ACE网络编程、开发论坛开通:
www.acejoy.com
www.acedevelop.com
涉及ACE使用和开发,中间件、服务器端软件的设计,P2P技术,
socket网络编程、应用开发等内容。
欢迎加入,大家一起交流、学习成长!



我是说内存是64K为一页,按第一种方式内存需要二页吗?



楼主的意思是堆上内存64K为一页,new多于64K的内存速度会巨降?学习学习


第一种方式不用第二页呀..

但是我觉得用内存池方式会好一点..在某种情况下可以减少分配以及拷贝内存的次数..


第一种在栈里分配空间,可以立即分配出来,速度很快,第二种在堆里分配,那么要先查找适合该大小的可用堆,耗时就多了.


单考虑内存分配当然第一种快了。但我估计这里的意思是怎么能让发送数据更快。这和内存分配可就没啥关系了。

网络传输要考虑最合适的载荷大小。如果用TCP传不需要考虑,因为TCP在建立连接时会协商MSS。如果用UDP,就要考虑让包能够最大且在中途不需要分段,这就不是一两句话能说清的了。


如果第一个是从栈上分配的,我想比第二个快

但是数量大 是否会溢出呢?

推荐第二种


第一种肯定快,65535绝对不会造成溢出。
第二种如果单靠new来分配的话效率肯定低下,建议用虚拟内存管理的API来自己管理,例如保留提交之类的。


呵呵 好样的阿 学学


传递指针的话,
实际的数据和这个指针所在的位置是不连续的,
传输控制就比较麻烦了 ...


所以, 还是用第一种方式,
或者用 C99 新增加的柔性数组方式:

typedef struct PACKET1
{
DOWRD dwLength;
.......
char buffer[0]; //长度为0, 结构体空间不包含它, 可以通过动态分配空间完成
}PACKET1

但是这样只是提供了灵活性,
要是只考虑效率, 显然还是直接栈上分配最快 ...


基本差不多。。。各有好处。。第二种实用些。。看应用。。

第一种堆栈快一点。。也就快几个指令。。线程安全。。由于是堆栈分配。。不能投递。。不然就要COPY了。。慢。。

第二种也就是要改下结点指向。。线程不安全。。方便投递。。只是传指针。。注意不要memory leak


关注


mark是个好习惯


mark


传指针是错误的吧?传一个地址过去有什么作用?又不是在同一个进程的虚拟内存空间里.


回复人:zengwenfu() ( 二级(初级)) 信誉:100 2006-9-23 1:20:27 得分:0
?

传指针是错误的吧?传一个地址过去有什么作用?又不是在同一个进程的虚拟内存空间里.
---------------------------------------
理解错误,楼主不是传地址过去,是在填充要传的数据时,用那种方式分配内存更好

我喜欢第一种,直接、快。
还有,楼主的程序是想在全局空间分配还是函数的栈空间?


第二种可以处理不定长的数据
还有,第二种并不慢。你可以在程序启动时一次性分配空间,不必每次都在要使用的时候才分配。


我觉得具体情况要具体分析。比较赞同jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!) 的意见。因为第二种如果很频繁的发数据的话,处理不好可能会有内存泄漏或内存碎片。所以如果要用第二种的话需要比较好的内存回收/整理的措施,正如前面朋友提到的,最好用系统自带的api进行处理。


学习中~~~~


采用第二种方式效率肯定低下,因为你还要手动组包阿
包头和包身不连续阿


mark


学习中~第二种的组包过程好像也要很多的时间,
还是第一种来得方便


第一种快
第二种灵活


学习


学习MARK


有点晕,楼主题好像没讲清,以至于一楼以为楼主的方法二是要发送一个指针
另外,请问楼主一下,你是用VC吗? 在WIDNWOS下,是否分配到一页这个不是你能控制的吧,你分配的内存可能不在同一页上,一般来说,在WINDOWS下,作为服务程序,尽量不要使用堆内存,栈内存安全而且速度快得多


我只知申请/释放内存是很慢的,频繁的分配/再释放,这样还不如写个LIST,需要的时候,从LIST取出PACKET,不需要再放回






我认为还是选择第一种比较好。用这样的结构体在建立传输对象的时候内存就从栈上分配了,不用考虑内存分配算法带来的开销。前提是64K大小的内存不会超过栈的负荷。
第二种方式有两个缺点,一来是使用new再分配内存时会有额外的消耗,再有就是传输的时候要考虑如何序列化指针所指向的内容。


mark study


第一种方法比较好,64K大小并不是影响内存分配速度的关键,只要你有足够的内存,你申请64K
和1M速度都没有区别,第一个是直接在栈上一次分配好内存不需要二次申请.
第二种方法扩展性比较好,你可以需要多少内存才申请多少,但是在使用的时候会产生而外的
申请和释放消耗.如果采用内存池存放你需要申请的内存就比较完美了.


靠!!!

这还用说吗!要说快,肯定第一种快,第一种是栈,第二种是堆。

不管是否大于64K,new都会很慢。new的快慢首先取决于分配的尺寸,其次取决于是否是多线。

自己回去研究一下。

但是按照结构设计。第一种有些问题,除非以后不做更改



Study


学习中,


学习 mark


忍不住来mark一下...


传输 64K,需要 一次分配那么多内存吗?如果是 64G呢?楼主是不是也要一次分配64G????

 相关文章
·怎么利用橡皮筋矩形截取显示的图片的某个部分??~
·有关DNS被屏蔽的问题?
·怎么自定义程序图标?
·如何让两个窗口同时移动
·计算过程中更新对话框中Cedit的内容
·我用DirectDraw做了一个播放器,为什么每当有对话框在画面上移动时画面上会留下对话框的痕迹,怎样解决

 推荐文章
求助--补全代码
如何知道一个线程还在“正常运行”
访问网络出现异常
如何将一个文件夹里的文件组织成xml描述信息
想将一些东东按拼音排序!!
求Debugging application 的sourcecode
vc开发的activex可以在网页中用吗?
请问什么时候需要为资源(例如对话框或按钮)新建一个类?
如何用SQL语言完成复杂字符串的筛选
有关DNS被屏蔽的问题?
MDI程序,如何像VC界面那样,编辑对话框时候在旁边显示标尺?
windows搜索驱动的默认路径是什么
 版权所有:IT问库
copyright © 2006 www.itwenku.cn all rights reserved.