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++书籍,了解指针和引用的基本知识。除非初始化指针,否则它们将具有垃圾值
- 首选值,除非您有充分的理由引入间接李>
- 首选引用而不是指针,因为它们没有“空状态”
- 考虑
:它是一个TileType
,其大小很可能小于或等于enum
。通过将其存储为指针并按指针返回,您将一无所获,一无所获 若您通过指针存储它,这意味着您可能需要动态分配。每次访问它时,都需要跳过指针sizeof(void*)
- 关于
和Trap
:根据它们的大小以及是否需要引用语义,您可能希望使用GameObject
或std::unique\u ptr
存储它们,并返回std::shared\u ptr
/Trap&
以允许访问GameObject&
如果我保持它的编写方式,指针指向的对象是在堆上其他地方创建的吗?它们是随机分配的,还是与创建时分配给平铺对象的空间一起分配 似乎你需要读一本好的C++书籍,了解指针和引用的基本知识。除非初始化指针,否则它们将具有垃圾值
当您希望存储不会因创建它或可以“共享”的函数而过期时,指针非常有用。你可以把它们看作是一种全局变量,只要你没有忘记指针或者没有释放内存,它是可以访问的。例如,您可以让一个
Tile
对象创建GameObject
,另一个Tile
类型的对象共享指向同一GameObject
的指针。但是指针不是对象,这意味着在Tile
类中,需要分配堆上的所有成员,然后释放它们