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

时间:2010-12-12 23:12:40

标签: c++ c windows initialization

代码:

WINDOWPLACEMENT wplcmt = {sizeof(WINDOWPLACEMENT)};

看起来比以前更清洁:

WINDOWPLACEMENT wplcmt;
memset(&wplcmt, 0, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);

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

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

5 个答案:

答案 0 :(得分:8)

您展示的第二个代码,

WINDOWPLACEMENT wplcmt;
memset(&wplcmt, 0, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);

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

第一个代码段,

WINDOWPLACEMENT wplcmt = {sizeof(WINDOWPLACEMENT)};
除了混淆之外,

是首选方式,除非您想要

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

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

  • 执行效率较低,

  • 提供错误输入门户。

顺便说一句,您使用的模糊名称是什么,wplcmt

为什么要混淆名字?

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

干杯&第h。,

编辑:问题已被修改。以上问题是对原始标题/问题的回应,"这种结构分配有多邪恶?"。我将答案保留原样,为评论提供背景信息。

编辑2 :情境进一步发生了变化:OP的昵称从" Madman"到" Coder"。所以,虽然原作是关于"如何eveil"正常的代码由"狂人",它现在关于"它是否首选......" by" Coder"。噢,我的意思是,我没有打电话给他"狂人"在评论中,就像现在看来一样;这就是他所谓的自己,当时他的昵称。

答案 1 :(得分:7)

使用memset。然后每个人都会立即看到代码的作用,并且不太可能产生任何意想不到的副作用。

答案 2 :(得分:1)

这种初始化我经常与之斗争。在C99中,人们可以做到:

WINDOWPLACEMENT wplcmt = {.length = sizeof(wplcmt), .showCmd = SW_SHOW};

其他值为零初始化。

在G ++中你可以这样做:

WINDOWPLACEMENT wplcmt = {length: sizeof(wplcmt), showCmd: SW_SHOW};

最后在C ++中,您可以选择初始化所有成员,还是希望您获得正确的成员顺序:

WINDOWPLACEMENT wplcmt = {sizeof(wplcmt)};
WINDOWPLACEMENT wplcmt = {sizeof(wplcmt), 0, SW_SHOW, {0, 0}, {0, 0}, {0, 0, 0, 0}};

事实上,在最后一种情况下,我甚至不确定所有C ++编译器都支持复合文字初始化。此外,如果成员更改订单或键入,并且您的值仍然适合您将不会出现错误。

就我个人而言,我个人选择使用C99,我会在一次点击中声明你给出的结构,并且所有已知的值都是这样的:

WINDOWPLACEMENT const wplcmt = {.length = sizeof(wplcmt), .showCmd = SW_SHOW};

Update0

我所提到的“初始化全部”似乎只适用于数组?我的错误,这使得C ++稍微有用。

答案 3 :(得分:0)

memset应该有更好的性能,因为它通常用高优化的asm

编写

答案 4 :(得分:0)

如果您使用Visual Studio,我强烈建议您使用:

WINDOWPLACEMENT wplcmt;
SecureZeroMemory((LPVOID)&wplcmt, sizeof(WINDOWPLACEMENT));
wplcmt.length = sizeof(WINDOWPLACEMENT);

因为优化编译器可以完全从生成的代码中删除 memset 调用,如果你真的需要将这些值设置为零,会导致很多麻烦。

永远不会删除SecureZeroMemory