我想知道,为什么这样的功能:-memset-memmov-memchr-memcpy存在于string.h头文件中,但不存在于stdlib.h文件中,其中还有其他标准内存函数如动态内存分配:malloc、calloc、realloc、free。也许将它们合并到一个标题中会更好?你怎么看待这件事?我不明白,为什么一组内存函数与其他函数分开并存在于字符串头(string.h)中。 最佳答案 因为实际上string.h被定义为一个标准头文件,它声明了处理字符数组而不仅仅是字符串的函数。memcpy和memset等函数接受的参数被视为指向字
volatileuint8_treset_mask[768]={0}现在我在内部操作之一期间将此数组元素的值设置为1。在另一个函数调用中,我需要将此数组的所有元素设置为0。一种方法是使用for循环,但我相信分配数组所有元素的更好方法是使用memsetmemset(reset_mask,0,sizeof(reset_mask));但我收到此错误:-“从类型'volatileuint8_t*{akavolatileunsignedchar*}'类型转换为类型'void*'抛弃限定符”如果我们不能在这里使用memset,有没有更好的方法一次性设置这个volatile数组的所有元素?
volatileuint8_treset_mask[768]={0}现在我在内部操作之一期间将此数组元素的值设置为1。在另一个函数调用中,我需要将此数组的所有元素设置为0。一种方法是使用for循环,但我相信分配数组所有元素的更好方法是使用memsetmemset(reset_mask,0,sizeof(reset_mask));但我收到此错误:-“从类型'volatileuint8_t*{akavolatileunsignedchar*}'类型转换为类型'void*'抛弃限定符”如果我们不能在这里使用memset,有没有更好的方法一次性设置这个volatile数组的所有元素?
memset有时用于在构造函数中初始化数据,如下例所示。它一般工作吗?总的来说这是个好主意吗?classA{public:A();private:inta;floatf;charstr[35];long*lp;};A::A(){memset(this,0,sizeof(*this));} 最佳答案 不要使用memset。它是C的保留,不适用于非POD。具体来说,在包含任何虚函数的派生类(或任何包含非内置函数的类)上使用它会导致灾难。C++为初始化提供了特定的语法:classA{public:A();private:inta;floa
memset有时用于在构造函数中初始化数据,如下例所示。它一般工作吗?总的来说这是个好主意吗?classA{public:A();private:inta;floatf;charstr[35];long*lp;};A::A(){memset(this,0,sizeof(*this));} 最佳答案 不要使用memset。它是C的保留,不适用于非POD。具体来说,在包含任何虚函数的派生类(或任何包含非内置函数的类)上使用它会导致灾难。C++为初始化提供了特定的语法:classA{public:A();private:inta;floa
在c(或者可能是c++)中,有什么区别charmyarr[16]={0x00};和charmyarr[16];memset(myarr,'\0',sizeof(myarr));??编辑:我问这个是因为在vc++2005中结果是一样的..编辑更多:和charmyarr[16]={0x00,};?也许可以得到更全面的答案,而不是模棱两可,因为下面的一些答案是指这种代码,即。将逗号放在大括号之前。结果在vc++2005中也是一样的。 最佳答案 重要的区别是第一个默认值以特定于元素的方式初始化数组:指针将接收一个空指针值,它不需要是0x00
在c(或者可能是c++)中,有什么区别charmyarr[16]={0x00};和charmyarr[16];memset(myarr,'\0',sizeof(myarr));??编辑:我问这个是因为在vc++2005中结果是一样的..编辑更多:和charmyarr[16]={0x00,};?也许可以得到更全面的答案,而不是模棱两可,因为下面的一些答案是指这种代码,即。将逗号放在大括号之前。结果在vc++2005中也是一样的。 最佳答案 重要的区别是第一个默认值以特定于元素的方式初始化数组:指针将接收一个空指针值,它不需要是0x00
我已阅读here如果编译器知道传递的内存缓冲区不再使用,它可以自由地删除对memset的调用。这怎么可能?在我看来(从核心语言的角度来看)memset只是一个常规函数,编译器无权假设其中发生的任何事情都没有副作用。在linkedarticle他们展示了VisualC++10如何删除memset。我知道Microsoft编译器在标准合规性方面并不领先,所以我问-是根据标准,还是只是msvc-ism?如果符合标准,请详细说明;)编辑:@库比以下代码:voidtestIt(){charfoo[1234];for(inti=0;i在mingw下用行编译:g++-c-O2-frtti-fex
我已阅读here如果编译器知道传递的内存缓冲区不再使用,它可以自由地删除对memset的调用。这怎么可能?在我看来(从核心语言的角度来看)memset只是一个常规函数,编译器无权假设其中发生的任何事情都没有副作用。在linkedarticle他们展示了VisualC++10如何删除memset。我知道Microsoft编译器在标准合规性方面并不领先,所以我问-是根据标准,还是只是msvc-ism?如果符合标准,请详细说明;)编辑:@库比以下代码:voidtestIt(){charfoo[1234];for(inti=0;i在mingw下用行编译:g++-c-O2-frtti-fex
上下文:不久前,我偶然发现了Alexandrescu在2001年发表的这篇DDJ文章:http://www.ddj.com/cpp/184403799这是关于将缓冲区初始化为某个值的各种方法的比较。就像“memset”对单字节值所做的一样。他比较了各种实现(memcpy、显式“for”循环、duff的设备),并没有真正找到跨所有数据集大小和所有编译器的最佳候选者。引用:Thereisaverydeep,andsad,realizationunderlyingallthis.Wearein2001,theyearoftheSpatialOdyssey.(...)Juststepoutof