讨论用字符串:char buf[LEN] = {0}与char *buf =new char[LEN]; 当LEN为多大时需要用后者比较好。

gerry2000 2007-07-13 10:53:42
char buf[LEN] = {0}与char *buf =new char[LEN];
一般小于1k长度时我都喜欢用第一种方式,但现在如果这个LEN长度有2K或25k时, 用第一种方式还好不? 大家一般在 "LEN >= ?" 时用new??
...全文
986 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
love_inter_net 2007-07-15
  • 打赏
  • 举报
回复
不错.学习啊!
liuxiuk 2007-07-15
  • 打赏
  • 举报
回复
Y___Y(一叶障目)

你在这也一个星星..?
jinwei1984 2007-07-14
  • 打赏
  • 举报
回复
都系高手!!
lin_style 2007-07-14
  • 打赏
  • 举报
回复
长度还是放在第2因素考虑吧
首先考虑的是使用情况
Y___Y 2007-07-14
  • 打赏
  • 举报
回复
数组不大的情况下,用第一种,第一种的分配效率是第二种的成千上万倍,特别是频繁分配,能用第一种就用第一种
hwkobeliulili 2007-07-14
  • 打赏
  • 举报
回复
恩,学习!!!
星羽 2007-07-14
  • 打赏
  • 举报
回复
char buf[LEN] = {0}是静态数组
char *buf =new char[LEN]; 是动态数组



什么时候用动态数组,什么时候用静态数组?


在你程序运行前就知道数组有多大,用静态数组
在你程序运行过程中才知道数组有多大,用动态数组

动态数组在用setlength设定长度后就相当于静态数组。
函数或过程声明中用动态数组,传递静态数组后动态数组就确定了长度,可以使用,反之,定义的是静态数组,已有确定长度,系统已经为该数组分配了确定大小的内存空间,
---------------------------------------------------------------

设计期已知大小就用静态数组,动态数组大小在运行期根据实际使用大小分配,后者有一定灵活性,但是需要一些更多的管理
---------------------------------------------------------------

补充一:动态数组是一个32位的指针,指向一个内存块,该内存块除保存数组元素的值之外,还在数据块的前面保存了两个32位的整数,一个是动态数组的长度,一个是动态数组的引用计数。静态数据则是一组相邻的变量序列,没有额外的内存保存其他信息。因此,动态数组与静态数组的内在区别是内存管理。
补充二:静态数组的索引范围可以随意,而动态数组的索引总是以0开始。
补充三:楼主所说的参数中的“动态数组”,严格来说是不准确的。

开放数组参数允许不同尺寸的数组传递给相同的过程或函数。要定义含有开放数组参数的例程,需要在参数声明中使用语法array of type(优于array[X..Y] of type)。例如,

function Find(A: array of Char): Integer;

上面声明了一个叫做Find的函数,该函数接受任何尺寸的字符数组并返回一个整数。

注意:开放数组参数的语法类似于动态数组类型,但它们的用途完全不同。上面的例子创建的函数接受任何以字符为元素的数组,包括(但不限于)动态字符数组。要声明必需是动态数组的参数,则需要指定一个类型标识符:

type TDynamicCharArray = array of Char;
function Find(A: TDynamicCharArray): Integer;

该文章转载自1024k:http://www.1024k.cn/faq/2007/200706/40671.html
MPTD_Fire 2007-07-14
  • 打赏
  • 举报
回复
是呀,能不NEW就尽量不NEW吧,要是NEW的话有很多其他要做的,内存的管理什么的,指针又是比较容易出错的!如果用的好的话,NEW是很好的方式。
lkldiy 2007-07-14
  • 打赏
  • 举报
回复
一般不new的,
gerry2000 2007-07-13
  • 打赏
  • 举报
回复
看来楼上四位把该讲的都讲完了, 呵呵
gerry2000 2007-07-13
  • 打赏
  • 举报
回复
我使用的是HP-UNIX拉
奥爸 2007-07-13
  • 打赏
  • 举报
回复
如果知道长度不会大于1M的话,我一般都是第一种方式.大于1M vc需要设置编译参数
用第二种方式不知道会有多大的时候用第二种,或者需要传递到外面的时候
  • 打赏
  • 举报
回复
一般不要超过512k因为栈是有限的
不过我也一般用string vector<char>
taodm 2007-07-13
  • 打赏
  • 举报
回复
看你什么操作系统。
不过,我喜欢vector<char>/string
healer_kx 2007-07-13
  • 打赏
  • 举报
回复
嗯,一般来讲我很喜欢你种思路。
大小我一般也是 1024了。

但是此外,是栈是堆,也不是大小的问题啊,更主要取决于你的需要。
yuanchuang 2007-07-13
  • 打赏
  • 举报
回复
数组方便,呵呵
Vitin 2007-07-13
  • 打赏
  • 举报
回复
如果是要用大缓冲区,还是用静态的吧。
static char buf[LEN]; // 不用={0},static已经初始化为0了

栈和堆都是给动态数据使用的。堆效率低,它的意义主要体现在未知资源需求的情况(如未知运行期需要多少内存资源时)。栈效率高,它的意义主要体现在程序行进中的状态保留和少量资源的快速取用(如活动记录和局部变量),因为它使用周期短、重用度高,所以一般设置比较小的值即可,从而最大程度上节省资源。
固定尺寸的缓冲区(特别是比较大、且经常使用的)还是适合用静态分配的。当然,如果是不定尺寸的缓冲区(往往是为了节约有限的资源),那么还是用堆分配吧:根据实际需要在运行期分配,以时间来换取空间。
linux_is_perfect 2007-07-13
  • 打赏
  • 举报
回复
char buf[LEN] = {0}与char *buf =new char[LEN]; ]

这样的话不如这样写
char * const buf = new charr[len];
记得new 出来的内存是得自己delete掉的

需要不同,用不同的方法

大家共同提高...
BenjaminHuang 2007-07-13
  • 打赏
  • 举报
回复
堆上的内存是动态地通过操作系统去申请的,大小的限制和当前可用的物理内存有密切关系,而栈内存是编译时决定的,可以从编译器或者链接器的选项中去指定,运行时是有限的,这个或许我在说废话了,大家都知道。

如果是实时性要求比较高的环境,函数的调用会很频繁,栈内存是相当宝贵的,但另一方面要申请堆空间的话,相对来说会比较花CPU时间。所以我觉得这样的情况不妨结合当前编译指定的栈的大小和同一时间会被调用的函数数量去考虑。
gerry2000 2007-07-13
  • 打赏
  • 举报
回复
我比较赞同这两句话, :-)
Inhibitory() ( )
char buf[LEN] = {0}这种变量在同一个作用域中多不多,如果太多的话,可以考试用后一种,如果少的话,而且生命周期不是太长,用第一种省事一些,也免得不小心搞出个内存泄漏。

healer_kx(甘草-http://healerkx.spaces.live.com/)
我的原则是能不new就不new... ...
加载更多回复(7)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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