避免多类型结构的memset

时间:2016-11-22 10:28:42

标签: c memcpy 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类型结构),其中memset比手动初始化慢两倍。所以我会考虑尝试初始化多类型结构。

避免memcpy()也会很好(避免使用<string.h> lib。)

5 个答案:

答案 0 :(得分:5)

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

Object object = {0};

答案 1 :(得分:1)

你可以创建一个&#34;零&#34;对象,然后将其复制到相同类型的其他对象。也许它比memset()快,我还没有测试过效率。

const Object zeroobject = {0};

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

答案 2 :(得分:1)

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

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

Object obj = { 0 };

答案 3 :(得分:0)

没有

我更喜欢使用memset:

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

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

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

答案 4 :(得分:-3)

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

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

由于所涉及的所有元素的大小都是四的倍数,你可以做这样的事情,但仍然得到相同的结果。

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

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