Tag: memset

C ++程序员应该避免memset?

我听到一个说c ++程序员应该避免memset, class ArrInit { //! int a[1024] = { 0 }; int a[1024]; public: ArrInit() { memset(a, 0, 1024 * sizeof(int)); } }; 所以考虑上面的代码,如果你不使用memset,你怎么能做一个[1..1024]填零?memset在C ++中有什么错误? 谢谢。

为什么memset需要一个int而不是char?

为什么memset将int作为第二个参数而不是char ,而wmemset需要wchar_t而不是long或long long类的东西?

memset如何用-1来初始化一个整型数组?

关于memset的manpage说: #include <string.h> void *memset(void *s, int c, size_t n) memset()函数用常量字节c填充s指向的内存区域的前n 个字节。 很明显memset不能用来初始化int数组,如下所示: int a[10]; memset(a, 1, sizeof(a)); 这是因为int是由4个字节(比如说)表示,并且不能获得数组a整数的期望值。 但我经常看到程序员使用memset将int数组元素设置为0或-1 。 int a[10]; int b[10]; memset(a, 0, sizeof(a)); memset(b, -1, sizeof(b)); 根据我的理解,使用整数0初始化是可以的,因为0可以用1个字节表示(可能在这种情况下我错了)。 但是如何用-1 (一个4字节的值)来初始化b ?

为什么std :: fill(0)比std :: fill(1)慢?

我在一个系统上观察到,当设置一个常数值0与一个常量值1或一个dynamic值相比时, std::fill在一个大的std::vector<int>上显着且一致地慢: 5.8 GiB / s vs 7.5 GiB / s 但是,对于更小的数据大小,结果是不同的,其中fill(0)更快: 使用多于一个线程,在4 GiB数据大小时, fill(1)显示的斜率更高,但达到比fill(0) (51 GiB / s vs 90 GiB / s)低得多的峰值: 这引起了第二个问题,为什么fill(1)的峰值带宽要低得多。 这个testing系统是双通道Intel Xeon CPU E5-2680 v3,设置为2.5 GHz(通过/sys/cpufreq ),带有8×16 GiB DDR4-2133。 我testing了GCC 6.1.0( -O3 )和Intel编译器17.0.1( -fast ),都得到了相同的结果。 GOMP_CPU_AFFINITY=0,12,1,13,2,14,3,15,4,16,5,17,6,18,7,19,8,20,9,21,10,22,11,23为组。 Strem / add / 24线程在系统上获得85 GiB / s。 我能够在不同的Haswell双套接字服务器系统上重现这种效果,但没有任何其他体系结构。 例如,在Sandy Bridge EP上,内存性能是相同的,而在caching中fill(0)要快得多。 这里是重现的代码: #include […]

重置C int数组为零:最快的方法?

假设我们有T = int,unsigned int,long long int或unsigned long long int的T myarray[100] ,将其所有内容重置为零的最快方法是什么(不仅用于初始化,还用于重置几个内容次在我的程序)? 也许与memset? 对于像T *myarray = new T[100]这样的dynamic数组,同样的问题。

最快的方法来清零C中的二维数组?

我想用C重复一个大的二维数组。这就是我现在所做的: // Array of size n * m, where n may not equal m for(j = 0; j < n; j++) { for(i = 0; i < m; i++) { array[i][j] = 0; } } 我试过使用memset: memset(array, 0, sizeof(array)) 但是这只适用于一维数组。 当我打印二维数组的内容时,第一行是零,但随后我得到了大量的随机数,它崩溃了。

memset()的返回值有什么用?

memset()被声明为返回void* ,该值始终与传入该函数的地址的值相同。 什么是返回值的用法? 为什么它不返回void ?

为什么在memset上使用bzero?

在一个系统编程类中,我在上一学期学习了C语言,我们必须在C中实现一个基本的客户端/服务器。当初始化sock_addr_in或者char缓冲区(我们用来在客户端和服务器之间来回发送数据)时,教授指示我们只使用bzero而不是memset来初始化它们。 他从来没有解释为什么,我很好奇,如果有这个有正当的理由? 我在这里看到: http : bzero效率更高,因为它只是将内存调零,所以它不会“不得不做任何额外的memset可能做的检查。 这仍然不一定是绝对不使用memset来清零内存的原因。 bzero被认为是弃用的,而且不是一个标准的C函数。 根据手册, memset比bzero更受青睐。 那么,为什么你还想在memset使用bzero呢? 只是为了提高效率,还是更多? 同样的, memset优于bzero的好处是使它成为新程序事实上的首选。

为什么memset()不正确地初始化int?

为什么下面的程序84215045的输出? int grid[110]; int main() { memset(grid, 5, 100 * sizeof(int)); printf("%d", grid[0]); return 0; }

什么是在C#中的memset相当于?

我需要用一个非零值填充一个byte[] 。 如何在C#中执行此操作,而不循环数组中的每个byte ? 更新:评论似乎已经分裂成两个问题 – 是否有一个框架方法来填充一个可能类似于memset的byte [] 当我们处理一个非常大的数组时,最有效的方法是什么? 我完全同意,像Eric和其他人所指出的那样,使用一个简单的循环就行得通。 问题的关键是要看看我是否可以学习一些有关C#的新东西:)我认为Juliet的并行操作方法应该比简单的循环更快。 基准:感谢Mikael Svenson: http : //techmikael.blogspot.com/2009/12/filling-array-with-default-value.html 事实certificate,简单for循环是要走的路,除非你想使用不安全的代码。 对于我原来的文章没有更清楚的道歉。 Eric和Mark在评论中都是正确的。 需要有更多的重点问题。 感谢大家的build议和回应。