0 c++ memory-management heap-memory
我读了一本关于游戏中编程模式的书,并决定在我不上课的时候写一个小引擎用于娱乐/练习,这使得大量使用对象指针.
我已经创建了一个Tile类来表示的地图的区域(位于一标准的2D坐标纯,这是指针的2D阵列,以磁砖对象),其具有其他类型的对象(臭名昭著瓦片陷阱,字符,以及接地type)如下所示,它保存指向tile对象将保存的数据的指针.
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:
};
Run Code Online (Sandbox Code Playgroud)
我很好奇的是,它是否是更有效的,内存/性能明智的,以保持它是怎么写的,有此图块对象(这是在堆上分配)包含指向其他对象,或者我应该报废的指针并简单地返回对象?
如果我保留它的编写方式,指针指向的对象是否在堆上的其他位置创建?它们会被随机分配到某个地方,还是会在创建时分配给分配给Tile对象的空间?
它是更有效,内存/性能明智的,以保持它是怎么写的,有此图块对象(这是在堆上分配)包含指向其他对象,或者我应该报废的指针和简单地返回的对象?
使用间接和动态分配几乎没有效率.当你要存储的对象复制起来很昂贵时(例如写时复制字符串),效率会更高.当你想要引用同一个对象而不复制它时,它也是"必需的" .
TL;博士:
考虑一下TileType:它的enum大小很可能小于或等于sizeof(void*).通过将其存储为指针并通过指针返回它,您什么也得不到并失去一切.
如果通过指针存储它,这意味着您可能需要动态分配.每次访问它时,您都需要跳过指针.
关于Trap和GameObject:根据它们的大小以及是否需要引用语义,您可能希望使用std::unique_ptr或std::shared_ptr存储它们,并返回Trap&/ GameObject&以允许访问.
如果我保留它的编写方式,指针指向的对象是否在堆上的其他位置创建?它们会被随机分配到某个地方,还是会在创建时分配给分配给Tile对象的空间?
您似乎需要阅读一本好的C++书籍并理解指针和参考的基础知识.除非你初始化你的指针,否则它们将具有垃圾值.
您不应该使用原始指针来拥有所有权.你应该使用智能指针.
除非您有充分的理由这样做,否则不应使用动态分配.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |