c++ - 堆上和栈上应用问题

标签 c++ winapi

我在堆上和系统类内部创建了 System 对象,我在堆上创建了 Game 对象,而在堆栈上创建了 KeyboardServer 对象。

1) KeyboardServer 对象的行为是否像在堆上一样,因为 System object 是其中的一部分?

2) KeyboardServer 对象是否也需要在堆上创建?

3)是否有更好的解决方案来提高性能?

////////////////////////////////////////////////////////////////////////////////
// Filename: main.cpp
////////////////////////////////////////////////////////////////////////////////
#include "SystemClass.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pScmdline, int iCmdshow )
{
    SystemClass* System;
    bool result;

    // Create the system object
    System = new SystemClass;
    if ( !System )
    {
        return 0;
    }

    // Initialize and run the system object
    result = System->Initialize();
    if (result)
    {
        System->Run();
    }

    // Shutdown and release the system object
    System->Shutdown();
    delete System;
    System = 0;

    return 0;
}



////////////////////////////////////////////////////////////////////////////////
// Filename: SystemClass.h
////////////////////////////////////////////////////////////////////////////////
#ifndef _SYSTEMCLASS_H_
#define _SYSTEMCLASS_H_


///////////////////////////////
// PRE-PROCESSING DIRECTIVES //
///////////////////////////////
#define WIN32_LEAN_AND_MEAN


//////////////
// INCLUDES //
//////////////
#include <Windows.h>


///////////////////////
// MY CLASS INCLUDES //
///////////////////////
#include "GameClass.h"
#include "KeyboardClass.h"


////////////////////////////////////////////////////////////////////////////////
// Class name: SystemClass
////////////////////////////////////////////////////////////////////////////////
class SystemClass
{
    public:
    SystemClass();
    ~SystemClass();

    bool Initialize();
    void Shutdown();
    void Run();

    LRESULT CALLBACK MessageHandler( HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam );

private:
    void InitializeWindows();
    void ShutdownWindows();

private:
    LPCSTR m_applicationName;
    HINSTANCE m_hinstance;
    HWND m_hwnd;

    GameClass*            m_Game;
    KeyboardServerClass  m_KeyboardServer;
};


/////////////////////////
// FUNCTION PROTOTYPES //
/////////////////////////
static LRESULT CALLBACK WndProc( HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam );


/////////////
// GLOBALS //
/////////////
static SystemClass* ApplicationHandle = 0;

#endif



////////////////////////////////////////////////////////////////////////////////
// Filename: KeyboardClass.h
////////////////////////////////////////////////////////////////////////////////
#ifndef _KEYBOARDCLASS_H_
#define _KEYBOARDCLASS_H_


////////////////////////////////////////////////////////////////////////////////
// Class prototype
////////////////////////////////////////////////////////////////////////////////
class KeyboardServerClass;


////////////////////////////////////////////////////////////////////////////////
// Class name: KeyboardClientClass
////////////////////////////////////////////////////////////////////////////////
class KeyboardClientClass
{
public:
    KeyboardClientClass( const KeyboardServerClass& KeyboardServer );
    ~KeyboardClientClass();

    bool KeyIsPressed( unsigned char keycode ) const;

private:
    const KeyboardServerClass& server;
};

class KeyboardServerClass
{
    friend KeyboardClientClass;

public:
    KeyboardServerClass();

    void OnKeyPressed( unsigned char keycode );
    void OnKeyReleased( unsigned char keycode );

private:
    static const int nKeys = 256;
    bool keystates[ nKeys ];
};

#endif

最佳答案

1) Do KeyboardServer object will behave like on heap as System object is part of it?

不,KeyboardServerSystemClass 的一部分,反之亦然。

2) Does KeyboardServer object needs to be created on heap too?

它是自动创建的:

m_KeyboardServerSystemClass 的一部分。当您创建 SystemClass 时,它会创建 KeyboardServerClass 对象。

因此,当您在堆上创建SystemClass 对象时,它会自动为您在堆上创建m_KeyboardServer

想象一下这个场景:

class A
{
   int field;
};

A *a = new A();
A b;

这里,对象 a 是在堆上创建的,它的成员 field 也是如此。对象 b 是在堆栈上创建的,所以 b.field 也是。

另外,想象一下:

class A
{
    Object* obj;
}

如果您在堆栈上创建此类的对象,则指向对象指针 将分配在堆栈上。这个指针将指向的完整Object可能在堆上,可能在堆栈上,在某个文件中等,但是类的一部分是指向Object的指针 并且它将存储在与存储 A 类 的整个对象相同的位置。

3 Do any better solution to increase the performance?

如果你有 *m_KeyboardServer 并且你总是手动分配新实例,那么它不会比将整个对象放在类中慢,它会自动为你初始化一个。但是,如果您不需要 KeyboardServer 的不同实例(如果您想在不同的 SystemClass 对象之间共享一个实例,那么您应该使用指针,因为它只会为 SystemClass< 的每个实例创建一个指针.

关于c++ - 堆上和栈上应用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802122/

相关文章:

c++ - "Expression must be a modifiable LValue"

c++ - 使用 boost 查找目录空间详细信息

c++ - 有什么方法可以使用c++在快速xml中通过标签获取xml值

c++ - 使用 Xcode 分析 C++

c# - 使用 'WlanScan' 刷新 WiFi 网络列表(将 api 语法从 c# 转换为 vba...或解决方法?)

c++ - 如何更改已映射和已提交内存空间的权限?

c++ - Typedef 声明的形式为 `int typedef my_int;`

c++ - 在主 win32 窗口中创建窗口控制台

windows - 尝试从用户模式进程创建全局文件映射对象失败

c++ - 将 PAGE_GUARD 保护设置为大页面