0

在 WndProc 函数中声明/定义变量是可以接受的。作为这段代码:

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

switch (message)
{
...

好不好的问题。
因为程序进入这个函数,每分钟上千次,而且每次这些变量都被重新定义,又被销毁,也许最好把这些变量定义在WndProc函数之外,在类中,这样可以节省时间和资源?

4

2 回答 2

3

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

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

Raymond 指出,这WndProc可以被召回。如果您的 中有很多局部变量WndProc,则生成的堆栈使用可能不是最佳的。我仍然无法想象任何现实世界的应用程序的瓶颈是WndProc.

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

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

于 2013-01-14T16:44:45.220 回答
1

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

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

于 2013-01-14T11:45:04.463 回答