c/c++语言开发共享避免多类型结构的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位区域,因此访问它更快。

      以上就是c/c++开发分享避免多类型结构的memset相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519270.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐