避免多类型结构的memset

我想避免在这样的结构上使用memset()

 typedef struct { int size; float param1; } StructA; typedef struct { StructA a; unsigned int state; float param2; } Object; 

我可以做这样的事情(伪代码,我现在无法检查)?

 Object obj; int *adr = (int*)&obj; for (int i; i < sizeof(obj); i++) { *adr++ = 0; } 

它会将obj的每个成员设置为零吗?

编辑 :回答有关评论的问题。 我一直在研究一些情况(使用uni-type结构),其中memset手动初始化慢两倍。 所以我会考虑尝试初始化多类型结构。

避免使用memcpy()也会很好(避免使用 lib)。

通用零初始化器将所有(递归地)初始化为正确类型的零。

 Object object = {0}; 

您可以创建“零”对象,然后将其复制到相同类型的其他对象。 也许它比memset()快,我没有测试效率。

 const Object zeroobject = {0}; /* ... */ Object obj; memcpy(&obj, &zeroobject, sizeof obj); /* assignment may work too */ obj = zeroobject; 

memset将结构初始化为所有位零。 这将在符合IEEE标准的体系结构上将整数和浮点数初始化为0,但C标准并不保证。 在异国情调的系统上,这可能不会将param1param2初始化为0.0

如果手动编码初始化更快,请使用它,或使用静态初始化程序:

 Object obj = { 0 }; 

没有。

我更喜欢使用memset:

 memset(&obj, 0, sizeof(obj)); 

或者如果你想让它按照你的方式行事:

 char* adr = (char*)&obj; for(int i = 0; i < sizeof(obj); i++) { *adr++ = 0; } 

你应该使用memset ,除非它很难做到。 就像它在您的环境中不存在而您无法添加等效项。 它很快,检查所有正确的边缘情况,并且基本上没有错误。


这足够接近实际工作。 但sizeof以字节为单位生成大小。 您应该将int切换为char。

由于所涉及的所有元素的大小都是四的倍数,因此您可以执行类似的操作,并且仍然可以获得相同的结果。

 int* adr = (int*)&obj; for (int i = 0; i < sizeof(obj); i+=4) {*adr = 0; adr += 4;} 

例如,在编译器可能在字段之间插入任何填充。 它可能将每个字段放在8字节/ 64位区域,因此访问它更快。