C++ C+;中对象指针的堆内存分配+;

C++ C+;中对象指针的堆内存分配+;,c++,memory-management,heap-memory,C++,Memory Management,Heap Memory,我读了一本关于游戏编程模式的书,决定在我不上课的时候给我写一个小引擎来娱乐/练习,这样可以大量使用对象指针 我创建了一个Tile类来表示地图的一个区域(位于标准的2D坐标平面上,这是指向平铺对象的指针的2D数组),该区域具有其他类型的对象(臭名昭著的平铺陷阱、字符和地面类型),如下图所示,其中包含指向平铺对象将包含的数据的指针 class Tile { public: enum TileType{ WATER_DEEP, WATER_SHALLOW,

我读了一本关于游戏编程模式的书,决定在我不上课的时候给我写一个小引擎来娱乐/练习,这样可以大量使用对象指针

我创建了一个
Tile
类来表示地图的一个区域(位于标准的2D坐标平面上,这是指向平铺对象的指针的2D数组),该区域具有其他类型的对象(臭名昭著的平铺陷阱、字符和地面类型),如下图所示,其中包含指向平铺对象将包含的数据的指针

class Tile
{
public:
    enum TileType{
        WATER_DEEP,
        WATER_SHALLOW,
        GRASS,
        MUD
    };

    Trap* getTileTrap();
    GameObject* getTileObject();
    TileType* getTileType();

    Trap *tileTrap;
    GameObject *tileObject;
    TileType *tileType;

    Tile();
    virtual ~Tile();

protected:
private:
};
我想知道的是,保持它的编写方式,让这个tile对象(在堆上分配)包含指向其他对象的指针,是否更高效,内存/性能方面更明智,还是应该放弃指针,直接返回对象

如果我保持它的编写方式,指针指向的对象是在堆上其他地方创建的吗?它们是随机分配的,还是与创建时分配给平铺对象的空间一起分配

在内存/性能方面,更有效的方法是保持它的编写方式,让这个tile对象(在堆上分配)包含指向其他对象的指针,或者我应该放弃指针并简单地返回对象

使用间接和动态分配几乎是前所未有的高效。只有当您存储的对象复制成本很高时(例如,在写字符串上复制),它才会更有效。当您希望引用同一对象而不复制它时,它也是“必需的”

tl;博士:

  • 首选,除非您有充分的理由引入间接
  • 首选引用而不是指针,因为它们没有“空状态”

  • 考虑
    TileType
    :它是一个
    enum
    ,其大小很可能小于或等于
    sizeof(void*)
    。通过将其存储为指针并按指针返回,您将一无所获,一无所获

    若您通过指针存储它,这意味着您可能需要动态分配。每次访问它时,都需要跳过指针

  • 关于
    Trap
    GameObject
    :根据它们的大小以及是否需要引用语义,您可能希望使用
    std::unique\u ptr
    std::shared\u ptr
    存储它们,并返回
    Trap&
    /
    GameObject&
    以允许访问


如果我保持它的编写方式,指针指向的对象是在堆上其他地方创建的吗?它们是随机分配的,还是与创建时分配给平铺对象的空间一起分配

似乎你需要读一本好的C++书籍,了解指针和引用的基本知识。除非初始化指针,否则它们将具有垃圾值


  • 您不应该使用原始指针作为所有权。你应该使用智能指针

  • 除非有充分的理由,否则不应该使用动态分配

  • 在内存/性能方面,更有效的方法是保持它的编写方式,让这个tile对象(在堆上分配)包含指向其他对象的指针,或者我应该放弃指针并简单地返回对象

    使用间接和动态分配几乎是前所未有的高效。只有当您存储的对象复制成本很高时(例如,在写字符串上复制),它才会更有效。当您希望引用同一对象而不复制它时,它也是“必需的”

    tl;博士:

    • 首选,除非您有充分的理由引入间接
    • 首选引用而不是指针,因为它们没有“空状态”

    • 考虑
      TileType
      :它是一个
      enum
      ,其大小很可能小于或等于
      sizeof(void*)
      。通过将其存储为指针并按指针返回,您将一无所获,一无所获

      若您通过指针存储它,这意味着您可能需要动态分配。每次访问它时,都需要跳过指针

    • 关于
      Trap
      GameObject
      :根据它们的大小以及是否需要引用语义,您可能希望使用
      std::unique\u ptr
      std::shared\u ptr
      存储它们,并返回
      Trap&
      /
      GameObject&
      以允许访问


    如果我保持它的编写方式,指针指向的对象是在堆上其他地方创建的吗?它们是随机分配的,还是与创建时分配给平铺对象的空间一起分配

    似乎你需要读一本好的C++书籍,了解指针和引用的基本知识。除非初始化指针,否则它们将具有垃圾值


  • 您不应该使用原始指针作为所有权。你应该使用智能指针

  • 除非有充分的理由,否则不应该使用动态分配


  • 当您希望存储不会因创建它或可以“共享”的函数而过期时,指针非常有用。你可以把它们看作是一种全局变量,只要你没有忘记指针或者没有释放内存,它是可以访问的。例如,您可以让一个
    Tile
    对象创建
    GameObject
    ,另一个
    Tile
    类型的对象共享指向同一
    GameObject
    的指针。但是指针不是对象,这意味着在
    Tile
    类中,需要分配堆上的所有成员,然后释放它们