在WndProc函数中定义变量

时间:2013-01-14 11:34:47

标签: winapi

在WndProc函数中声明/定义变量是可以接受的。如此代码:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
...

是否好的问题。
因为程序进入这个函数,每分钟数千次,每次重新定义这些变量,并且再次销毁,也许最好在类中的WndProc函数之外定义这些变量,从而节省时间和资源? / p>

2 个答案:

答案 0 :(得分:3)

  

因为程序进入这个函数,每分钟数千次,每次重新定义这些变量,并再次销毁,也许最好在WndProc函数之外定义这些变量,在类中,从而节省时间和资源?

就时间和资源而言,它没什么区别。这些是局部变量,存储在堆栈中。创建线程时已保留整个堆栈,并且不迟于第一次执行此过程时提交这些变量的内存。所以这意味着,对于没有引用这些变量的switch条件,您可能无法测量由于存在变量而导致的运行时或资源需求的差异。

Raymond指出WndProc可以被称为“{1}}。如果WndProc中有很多局部变量,则生成的堆栈使用可能不是最佳的。我仍然无法想象任何真实世界的应用程序,其中瓶颈是WndProc的堆栈使用。

话虽如此,一个WndProc方法是一个包含所有变量的大转换语句,这是不好的做法。您不希望使用许多不同的变量污染此函数的本地命名空间。我建议你为要在窗口过程中处理的每条消息创建一个单独的处理函数。

最后,建议在类中声明这些变量。不要这样做。在可能的情况下,始终首选局部变量当然可以将这些变量声明为本地变量。虽然它们应该是WndProc调用的单独处理程序函数的本地文件。

答案 1 :(得分:1)

当局部变量被“创建”时,会分配空间以使所有变量适合堆栈并调用它们的构造函数。如果没有构造函数,我相信默认操作是将字段“归零”,尽管我对此并不是100%肯定。

然而,这可以通过十几条指令来实现。与其他操作(尤其是系统调用)相比,此效果可以忽略不计。如果您仍然担心程序中不同例程所花费的时间,我建议您使用gprof之类的工具。