是否优先使用结构初始化({...})而不是memset等?

Cod*_*der 9 c c++ windows initialization

码:

WINDOWPLACEMENT wplcmt = {sizeof(WINDOWPLACEMENT)};
Run Code Online (Sandbox Code Playgroud)

看起来比以前更清洁:

WINDOWPLACEMENT wplcmt;
memset(&wplcmt, 0, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);
Run Code Online (Sandbox Code Playgroud)

这个东西的组装输出也非常好,对于更长的结构,MSVC甚至使用memset而不是xor eax, eaxmov.从标准的角度来看,它看起来也不错.但我仍然害怕结构没有紧密包装的边界情况说#pragma pack(128),窗户突然决定做一个结构的memcmp.

那么使用这样的语法是好还是坏?使用这种初始化是一种好习惯吗?

Che*_*Alf 8

你展示的第二个代码,

WINDOWPLACEMENT wplcmt;
memset(&wplcmt, 0, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);
Run Code Online (Sandbox Code Playgroud)

太可怕了.混淆,效率低下,冗长,你把它全部塞进去了.

第一个代码段,

WINDOWPLACEMENT wplcmt = {sizeof(WINDOWPLACEMENT)};
Run Code Online (Sandbox Code Playgroud)

除了混淆之外,它是首选方式,除非您愿意

  • 花更多时间不必要地编写更多代码,

  • 让读者花更多时间阅读并不必要地分析你的详细代码,

  • 执行效率降低,并且

  • 提供bug入口门户.

顺便问一下,你使用过的混淆名称是什么wplcmt

你为什么要混淆名字?

你的问题是真的还是只是拖钓?

干杯&hth.,

编辑:问题已被编辑.上述问题是对原始标题/问题"这种结构分配有多邪恶?"的回应.我将离开我的答案,为评论提供背景信息.

编辑2:情境进一步发生变化:OP的缺口从"狂人"变为"编码器".因此,虽然原作是关于"如何eveil是"正常代码的"狂人",它现在是"Coder"的"它是首选......".哦,我的意思是,我不是在评论中称他为"狂人",因为它现在会出现; 这就是他所谓的自己,当时他的昵称.

  • 你的答案很好(事实上),但你不应该无理由地指责别人.因此,你的答案将无法获得我的投票...... (3认同)

Thi*_*ter 7

使用memset.然后每个人都会立即看到代码的作用,并且不太可能出现任何意外的副作用.