清除 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 与否?的主要内容,如果未能解决你的问题,请参考以下文章

在 C/C++ 中清除 char 数组的最佳方法是啥?

清除 char 数组 c

使用 memset 清除非平凡类型的对象时出错

为啥“memset(arr, -1, sizeof(arr)/sizeof(int))”不能将整数数组清除为-1?

为啥“memset(arr, -1, sizeof(arr)/sizeof(int))”不能将整数数组清除为-1?

在c++中怎么用memset() 给二维char型数组赋值