首页 > 编程知识 正文

字符数组清零,kafka零拷贝原理

时间:2023-05-06 08:02:27 阅读:108537 作者:2155

最近在修正程序问题时,发现了使用ZeroMemory的使用问题。 用ZeroMemory、memset或“={0}”初始化或清除结构对象。 但这三种方式都有各自的特点,需要谨慎使用。 否则,容易发生严重错误。

ZeroMemory是美国微软公司软件开发软件包SDK中的宏。 其作用是用0填充内存区域。 定义公式如下。

# definertlzeromemory (destination,Length ) (destination,0,) definezeromemoryrtlzeromemorymemsion )

void*memset(void*s,int ch,size_t n ); 是C Run-time Library提供的函数,用于在内存块中输入特定值。 这是将更大的结构或数组清零的最快方法。 因为是在语言层面提供的,所以可以跨平台使用。 参考:

33558 www.cplusplus.com/reference/cstring/memset /

可以看到ZeroMemory实际上是在memset中实现的,并且仅在Windows平台上使用。 如果清除了ZeroMemory和memset,则结构的所有字节都将设置为0。 如果结构具有虚函数,或者结构的成员具有虚函数,则虚函数指针将设置为0。 如果后续程序调用虚函数,空指针很可能会导致程序崩溃。

因此,具有虚函数或成员具有虚函数的结构的初始化必须通过构造函数进行。

此外,如果某个类的结构包含STL模板(Vector、List、Map等),则使用ZeroMemory执行将此类的对象清零的操作会导致一系列崩溃问题(指针内存错误) 因此,我们再次强烈建议您仅使用构造函数初始化类(class ),而不要调用ZeroMemory进行清零操作。={0}操作是一种初始化结构和数组的方法,它为结构中的基本类型变量指定默认值,如果结构中存在非基本类型(如类对象),则会发生编译错误,并且也会受到保护。

# include ' STD afx.h ' # include windows.hclasscar { public 3360 virtual voidrun () } private 3360 intm _ speed; (; 结构跟踪{ car car; int dirver; (; int_tmain(intargc,_TCHAR* argv[] ) {SRace race; zeromemory(race,sizeof ) race ); //不通过虚拟表指针调用,没有问题的race.car.Run (; Car *pCar=race.car; //__vfptr=0x00000000,故障pCar-Run (; 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。