我知道memset不适合用于class初始化。例如,类似于以下内容:classX{public:X(){memset(this,0,sizeof(*this));}...};如果混合中有virtual函数,将会破坏vtbl。我正在处理一个(巨大的)遗留代码库,它是C-ish但用C++编译,因此所有有问题的成员通常都是POD,不需要传统的C++构造函数。C++的使用逐渐深入(如虚函数),这让没有意识到memset具有这些额外的C++dentry的开发人员感到痛苦。我想知道是否有一种C++安全的方法来执行初始的全能零初始化,然后可以在不适合零初始化的情况下进行特定的按成员初始化?我找到了类
我正在处理大型代码库,将一些旧的C模块转换为C++。我想将一个C++对象添加到一个结构中,但是这个结构的一些用户memset它,这对于我想放入结构中的对象来说是不幸的。我如何在编译时检测到正在执行此操作,以便我可以消除在不再是POD的结构上对memset的所有使用? 最佳答案 我不确定编译器是否会通过直接提供一些编译标志来帮助您。如果是这样,对你有好处。用那个。故事结束。如果没有,那么也许这会对您有所帮助。由于您将代码从C转换为C++,这意味着memset的所有使用都没有std::命名空间。所以利用这个事实和#definememse
我无法确定哪个在C++中更好:我使用一个结构来管理消息队列中的客户端,该结构如下所示:typedefstruct_MsgClient{inthandle;intmessage_class;void*callback;void*private_data;intpriority;}MsgClient;所有这些都是POD实体。现在,我有一个这些结构的数组,用于存储我的客户(我使用一个数组来限制内存,我必须限制碎片)。所以在我的课上我有这样的东西:classFoo{private:MsgClient_clients[32];public:Foo(){memset(_clients,0x0,si
我有这个代码char*oldname=newchar[strlen(name)+1];memcpy(oldname,name,strlen(name)+1);name=newchar[strlen(oldname)+strlen(r.name)+1];memset(name,'\0',strlen(name));strcat(name,oldname);strcat(name,"");strcat(name,r.name);我明白使用memcpy和memset是不行的,但我还不明白如何在C++中使用它,最好不使用std。有人知道吗?谢谢。 最佳答案
似乎无法在任何地方找到这个问题的答案,如何将数组memset为数组类型的最大值?我原以为memset(ZBUFFER,0xFFFF,size)可以在ZBUFFER是16位整数数组的情况下工作。相反,我始终得到-1。此外,我们的想法是尽可能快地完成这项工作(它是一个需要初始化每一帧的zbuffer)所以如果有更好的方法(并且仍然一样快或更快),请告诉我。编辑:作为澄清,我确实需要一个带符号的int数组。 最佳答案 在C++中,您将使用std::fill和std::numeric_limits。#include#include#incl
如果我有T(T*)类型的指针并且我有一个数组T*array[N]这两种方法是否允许我稍后检查哪些条目是空指针以延迟初始化每个存储桶中的内容?memset(数组,0,sizeof(T*)*N);或for(inti=0;i即memset调用还会让我稍后执行if(array[i]==NULL)...吗?如果不是的话,我不想引入未定义的行为.. 最佳答案 虽然技术上不要求空指针值全为零位,但我不知道有哪个系统不是全为零位。所以这两种方法都应该有效。然而,有一种更简单的方法来初始化一个数组,即使在一些邪恶的实现中也会设置正确的空指针值:T*a
我应该如何将匿名union归零?我在cppreference上找不到任何内容关于它的页面。memset它最大的成员0在这里工作吗?例如-#include#includestructs{chara;charb[100];};intmain(){union{inta;sb;charc;};//b.a='a';(1)std::memset(&b,0,sizeof(b));std::cout此外,如果这行得通,我是否应该在使用memset()激活最大成员之前取消注释(1)? 最佳答案 如果你真的想尊重标准,你应该知道你写的代码是未定义的行为
我不确定。我可以在四个内核上编写一个大的内存集(例如10MB)来获得加速吗?这种ram-chip并行化是否可能,以及触发其他线程的时间成本有多大-是超过一毫秒还是更短? 最佳答案 你指出了一个正确的问题,同时很难给出一个简单的答案。这涉及到几个方面。启动新线程(或从某些缓存中挑选它们)的开销;内存总线上的争用。上述方面各不相同,不同平台的成本也大不相同。更大的PC有多个内存总线。较小的只有一个。在单内存总线系统上,这没有任何意义。如果您的系统有多个内存总线(channel),您的数据数组可能会在内存条之间任意分割。如果整个数组都位于
先运行一段代码:intmain(){ char*f;//不进行赋值,此时无法访问F指针,错误写法,实际不建议这样写code memset(f,0,sizeof(f)); if(NULL==f)//成立,此时的f变为能够使用的指针,虽然指针为空 printf("f指针为空"); return0;}一般情况下,给空指针赋值为NULL,初始化一块内存,用memset为0。如果内存块中有的字段是指针,此时就要注意了。虽然NULL一般情况下就是0,但是不排除也有特别的时候,特别是在写跨平台代码的时候,不要有这种默认思维。应该老老实实的给指针赋值NULL,值数据mem
我需要用一个非零值填充byte[]。我如何在C#中执行此操作而不循环遍历数组中的每个byte?更新:评论似乎将其分为两个问题-是否有框架方法来填充可能类似于memset的byte[]当我们处理非常大的数组时,最有效的方法是什么?正如Eric和其他人所指出的,我完全同意使用一个简单的循环就可以很好地工作。问题的重点是看看我是否可以学到一些关于C#的新知识:)我认为Juliet的并行操作方法应该比简单循环更快。基准:感谢MikaelSvenson:http://techmikael.blogspot.com/2009/12/filling-array-with-default-value.