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