使用C和Cpp跟踪内存结构

Following Structures In Memory Using C and Cpp

本文关键字:内存 结构 跟踪 Cpp 使用      更新时间:2023-10-16

我在头文件中有很多结构。我在想办法把它们整合起来。我知道一定有更好的方法来访问这些指针。我用了一个叫做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对象,你可能能够卷成一个单一的对象,等等。关键是要考虑"对于这个任务,我最小的功能构建块是什么?"然后定义你的对象来匹配它们。

希望这是有帮助的。欢呼:)