避免多类型结构的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标准并不保证。 在异国情调的系统上,这可能不会将param1
或param2
初始化为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位区域,因此访问它更快。