清除 char 数组的最佳方案 - memset 与否?
Posted
技术标签:
【中文标题】清除 char 数组的最佳方案 - memset 与否?【英文标题】:Clearing out a char array best scenario - memset or not? 【发布时间】:2013-08-20 09:22:43 【问题描述】:在我当前的代码中,我有这样的东西
while(true) //Infinite loop
char buff[60];
.....
....
我想知道在性能方面什么会更好。
-
在进入无限循环然后使用
memset(buff, 0, 60);
或之前声明 char buff(将保存包含换行符和换行符的字符串)
保持原样。 memset 会影响性能吗?
注意:
我的要求是每次循环重新启动时我都需要让char
数组完全干净。
【问题讨论】:
memset 必须做点什么——但至于哪个更快,试试看? 你真的需要清除它吗?它必须在循环的其余部分填充,因此可能不需要初始化。 我很确定它们不相等 - 在声明char buff[60];
之后,内存不能保证全为 0。如果需要内存全为0,使用memset
,否则不要。
正如发布的那样,您的数组未初始化,因此在调试构建之外它大致相当于在无限循环之外声明它并且 not 调用 memset。
如果使用memset
将数组归零有效,那么char buff[60] = 0;
也有效。 char buff[60] = ;
也是如此,就像我的回答一样。
【参考方案1】:
“它的方式”不会给你一个全零的数组。但是无论如何您都不必致电memset
。如果你只是在循环内部使用buff
,我认为最好保持在循环的范围内:
while(true) //Infinite loop
char buff[60] = ; // buff is full of zeros
.....
....
【讨论】:
【参考方案2】:memset
做了一些工作,所以它必须“影响性能”。不过,它通常会进行大量优化,因为它是一种常见的操作。
因此,您不太可能找到一种更快的方法来清除数组,并且为了进行比较,您显示的代码根本没有初始化数组。
作为参考,它应该看起来像:
char buff[60];
while (true)
memset(buff, 0, sizeof(buff));
...
唯一可能更快的解决方案是找到一种方法来停止,具体取决于在每次迭代开始时将缓冲区归零
【讨论】:
【参考方案3】:如果您一直将其用作 C 样式字符串:
char buff[60];
buff[0] = 0;
这只会设置第一个字节,但如果您将其用作简单的 C 样式字符串,那么您只需设置即可使其成为零长度字符串。它比在 64 位机器上填充整个缓冲区的任何解决方案都快 7 倍。
如果你确实需要将整个缓冲区填充为0,那么
char buff[60] = ;
会这样做。
【讨论】:
以上是关于清除 char 数组的最佳方案 - memset 与否?的主要内容,如果未能解决你的问题,请参考以下文章
为啥“memset(arr, -1, sizeof(arr)/sizeof(int))”不能将整数数组清除为-1?