读书人

讨论用字符串:char buf[LEN] = {0}与

发布时间: 2012-02-27 10:00:22 作者: rapoo

讨论用字符串:char buf[LEN] = {0}与char *buf =new char[LEN]; 当LEN为多大时需要用后者比较好。
char buf[LEN] = {0}与char *buf =new char[LEN];
一般小于1k长度时我都喜欢用第一种方式,但现在如果这个LEN长度有2K或25k时, 用第一种方式还好不? 大家一般在 "LEN > = ? " 时用new??

[解决办法]
嗯,一般来讲我很喜欢你种思路。
大小我一般也是 1024了。

但是此外,是栈是堆,也不是大小的问题啊,更主要取决于你的需要。

[解决办法]
看你什么操作系统。
不过,我喜欢vector <char> /string
[解决办法]
一般不要超过512k因为栈是有限的
不过我也一般用string vector <char>
[解决办法]
如果知道长度不会大于1M的话,我一般都是第一种方式.大于1M vc需要设置编译参数
用第二种方式不知道会有多大的时候用第二种,或者需要传递到外面的时候
[解决办法]
也要看char buf[LEN] = {0}这种变量在同一个作用域中多不多,如果太多的话,可以考试用后一种,如果少的话,而且生命周期不是太长,用第一种省事一些,也免得不小心搞出个内存泄漏。
不过vector <char> 实际上相当于第二种,因为内部实现内存分配是在堆上的,管理很方便,像取length很容易,但效率上比第一种要稍微低那么小小一点。
[解决办法]
我的原则是能不new就不new... ...
[解决办法]
还是不new比较保险。
[解决办法]
如果你觉得你还不能很好的控制内存就不要去new了,省得要是这样的地方多了一个忘记释放内存就麻烦了
[解决办法]
需要理解的是,第一种方法开的内存是在栈里的,而第二种方法是在堆里(也就是数据段)。
用第一种方法,当函数返回后,栈会pop出来,则内存就会在调用其他函数时被覆盖,这就是局部变量在函数返回后就不能使用的原因。
同时,栈的大小是有限的,比较大的内存应该用new来申请。
[解决办法]
当年我写过这样的代码,呵呵

char buf[2*1024*1024] = {0};

理所当然fail掉了
[解决办法]
我认为,需要较大内存而大小又未知的情况下,用new,就像楼上的楼上所说512K以上的,

另外,对于反复使用的内存,一定要只new一次,以后再重复使用,因为new会大幅度减慢速度,切勿在循环体内new然后又delete, 如果每次大小未知, 宁可牺牲一点内存,一次申请一个足够大的够每次使用的

我是做实时图像处理的,这方面做过测试,区别很大
[解决办法]
堆上的内存是动态地通过操作系统去申请的,大小的限制和当前可用的物理内存有密切关系,而栈内存是编译时决定的,可以从编译器或者链接器的选项中去指定,运行时是有限的,这个或许我在说废话了,大家都知道。

如果是实时性要求比较高的环境,函数的调用会很频繁,栈内存是相当宝贵的,但另一方面要申请堆空间的话,相对来说会比较花CPU时间。所以我觉得这样的情况不妨结合当前编译指定的栈的大小和同一时间会被调用的函数数量去考虑。

[解决办法]
char buf[LEN] = {0}与char *buf =new char[LEN]; ]

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

需要不同,用不同的方法

大家共同提高...
[解决办法]
数组方便,呵呵
[解决办法]
数组不大的情况下,用第一种,第一种的分配效率是第二种的成千上万倍,特别是频繁分配,能用第一种就用第一种
[解决办法]
长度还是放在第2因素考虑吧
首先考虑的是使用情况
[解决办法]
一般不new的,
[解决办法]
是呀,能不NEW就尽量不NEW吧,要是NEW的话有很多其他要做的,内存的管理什么的,指针又是比较容易出错的!如果用的好的话,NEW是很好的方式。
[解决办法]
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
[解决办法]
恩,学习!!!
[解决办法]
不错.学习啊!
[解决办法]
Y___Y(一叶障目)

你在这也一个星星..?

读书人网 >C++

热点推荐