使用C和Cpp跟踪内存结构
Following Structures In Memory Using C and Cpp
我在头文件中有很多结构。我在想办法把它们整合起来。我知道一定有更好的方法来访问这些指针。我用了一个叫做reclass的程序;它所做的是基于指针和用户选择的其他数据类型创建结构。你把这些结构放入你的源代码中并使用它们。但现在我的项目太庞大了。结构布局的方式。这让我很头疼。
这是我的(版本号示例):
class Level1ToVersionNumer
{
public:
char _0x0000[8];
char VersionNumber[12]; //0x0008
char _0x0014[44];
};//Size=0x0040
class Level0ToVersionNumber
{
public:
char _0x0000[20];
Level1ToVersionNumer* Level1PointerToVersionNumber; //0x0014
char _0x0018[40];
};//Size=0x0040
class BaseObjectWorld
{
public:
char _0x0000[32];
Level0ToVersionNumber* Level0PointerToVersionNumber; //0x0020
char _0x0024[1844];
ObjectTable* ObjectTablePtr; //0x0758
char _0x0748[760];
LocalPlayerLevel0* LocalPlayerLevel0Ptr; //0x0A54
char _0x0A44[1348];
NearLootTable* NearLootTablePtr; //0x0F88
volatile __int32 SizeOfNearLootTable; //0x0F8C
char _0x0F90[160];
FarLootTable* FarLootTablePtr; //0x1030
__int32 SizeOfFarLootTable; //0x1034
};//Size=0x1840
你可以看到在Level0ToVersionNumber类中有20个字节的填充。
在Level1ToVersionNumber里面有8个字节的填充。
我目前正在访问这些结构:
g_pArmaMain->BaseObectWorld->Level0PointerToVersionNumber->Level1PointerToVersionNumber->VersionNumber;
你可以看到这是4个结构的深度。我的一些代码有15到20个结构。我知道一定有更好的办法来安排。这不是唯一的方法。
有没有人知道如何缩小/合并类与多级指针或其他一些创造性的方式?
当我不得不做这样的事情时,这是荒谬的:
if( !( g_pArmaMain->BaseObjectWorld->ObjectTablePtr->ObjectTableArrayPtr->ObjectTableArrayElement[i].element->EntityPtr->EntityPlus70->EntityPlus70Plus40->ObjectNamePtr <= 0 ) && !( g_pArmaMain->BaseObjectWorld->ObjectTablePtr->ObjectTableArrayPtr->ObjectTableArrayElement[i].element->EntityPtr->EntityPlus70->EntityPlus70Plus40->ObjectNamePtr->lengthOfEntName <= 0 ) )
它工作,但它只是肮脏肮脏肮脏…
谢谢你的帮助
首先,C和c++肯定不是同一种语言。举个简单的例子,你的代码不会被编译成C语言,因为在C语言中没有class
这样的东西,也没有内存保护,所以public/protected/private
说明符也不存在。
除了c++有额外的特性之外,还有很多不同之处。它甚至不是c的严格超集。然而,如果你好奇,我将在这里放下我的肥皂盒,让你阅读:更多信息
对于你的问题,你的代码没有提供很多关于它试图完成的任务的信息,所以我将无法提供具体的建议。我可以提供一些解决这个问题的总体思路和方法:
首先,在代码块中引用大量嵌套的数据结构对我来说意味着函数试图做的比它应该做的更多。根据经验,你应该努力把你的任务分解成小的、功能性的部分;写一些小的、专门的函数来做一些简单的事情,然后用这些函数作为构建块来完成更大的任务。
我的第二个想法是在你的类中定义方法。例如,如果您需要从BaseObjectWorld对象获取版本信息,您可以编写如下方法:char* BaseObjectWorld::getVersion() { ... };
遍历BaseObjectWorld成员层次结构并返回对象的版本信息。
如果你宁愿坚持C风格的编码,你会想把这些class
定义转换成struct
定义,然后用函数做类似的方法:
char* get_version(struct BaseObjectWorld* instance) { ... };
我要看的最后一件事是,某些结构是否真的需要是不同的结构。如果没有情况下,你将实例化一个Level1ToVersionNumber对象单独从一个Level0ToVersionNumber对象,你可能能够卷成一个单一的对象,等等。关键是要考虑"对于这个任务,我最小的功能构建块是什么?"然后定义你的对象来匹配它们。
希望这是有帮助的。欢呼:)
- 如何在C++类内存结构中创建"spacer"?
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 使用内存地址访问结构的属性值
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 包含矢量指针的结构的内存释放问题
- 如何在cpp中删除(免费)多维结构内存?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 公共/私有/受保护是否会更改内存中结构的排列?
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 从只读内存中读取结构
- 具有 STL 类 c++ 的结构的内存分配
- 相同的结构可以在C++中分配不同的内存大小吗?
- 我可以使用哪种数据结构来释放连续内存中的内存?
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- C++编译大型结构时内存使用过多
- 使用Hazelcast替换共享内存结构数据
- c++ WINAPI 共享内存结构数组
- 向量的<T>内存结构
- 使用C和Cpp跟踪内存结构