65.9K
CodeProject 正在变化。 阅读更多。
Home

C++ 数据归档类 (MASM 实现)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (2投票s)

2011 年 7 月 18 日

CPOL

3分钟阅读

viewsIcon

16916

downloadIcon

367

展示一个用ASM编写的内存包装类,该类提供组织和序列化数据的方法。自带32位算法。

引言

本文介绍的是 CppArchivPlus 类以及如何在您的项目中使用它。CppArchivPlus 是一个非常小的 C++ 类,它提供了组织数据的有效方法。我编写这个类是为了在网络上传输数据和跟踪特定数据。在 ASM 中实现像我的类中这样的关键例程可以提高性能速度,因此我使用 MASM 结合 Microsoft Visual Studio 2010 用汇编语言编写了整个类。我的类与 MFC 的 CArchiv 类无关。

CppArchivPlus

首先,我想指出在您的 C++ 代码中使用此类的几个优点。您可以使用 add_data() 函数将数据动态添加到 CppArchivPlus 对象。 对象中的数据包含在 Element 内部,该 Element 只能通过其名称找到/删除。 在下面的代码中,您可以看到添加对象的基本用法的一个非常简单的示例。 其中包含一个 32 位字符串哈希算法; 尽管我不能保证它是最有效的哈希算法,但它现在可以完成这项工作。

#define STR_SIZE 0x0D

char str_a[] = {"Hello World!\0"}
unsigned long ul_name = 0x00;

int main(void)
{
    //with the overloaded new operator we can preallocate
    //memory as needed (in this case 1024 bytes) 
    CppArchivePlus* pArchiveObject = new(STR_SIZE) CppArchivePlus;

    //a 32bit hash is quickly created
    ul_name = CppArchivePlus::hash("Billy\0");

    //now we add the specified data.
    //the object reserves space within itself and places name, size and data.
    pArchiveObject->add_data(str_a,STR_SIZE,ul_name);

    //when the object runs out of memory it automatically
    //allocates more. So lets add the same string once again.
    pArchiveObject->add_data(str_a,STR_SIZE,ul_name+1);
}

该类的主要目的是防止内存泄漏,并为任何形式的数据提供更好的流传输能力。 由于对象始终处于序列化状态,因此可以非常容易地对其进行流传输,而无需进行任何进一步的处理。 您也不需要跟踪对象大小,因为总大小包含在对象标头中。 标头还包含整个对象名称和所包含数据的字节数。 这使得 CppArchivePlus 类非常容易用于通用流和套接字。 下面显示了如何轻松地通过网络发送创建的 CppArchivePlus 实例的示例。

SOCKET sock;

//you can just pass the object pointer to the function.
//use get_t_size to retrieve the total object size.
send( sock, pArchiveObject, pArchiveObject->get_t_size(), NULL );

您可以使用 remove_data() 方法从对象中删除数据,下面的示例中可以看到。请注意,remove_data() 不会最小化已分配的实际对象内存,它所做的只是删除 add_data() 写入的所有内容。

//just specifie the name, if it is found the corresponding entry should be removed
pArchiveObject->remove_data(ul_name);

要查找数据,您将必须使用 GET_DATA 宏,该宏只是 get_space 方法的宏。 get_space 方法用于按名称查找元素。 但是由于元素地址不是自动数据地址,因此我建议您使用 GET_DATA 宏。 get_data 所做的是遍历对象中的每个条目并比较名称,直到最终找到匹配的项目。 类实例中列出的对象越多,查找名称的过程就越长。 这就引出了整体性能问题。

我从一开始就认为该类在使用中/较大对象时会更快,因为 add_dataremove_data 方法中使用了“先双字后字节”写入算法。 完成并测试该类后,结果证明是正确的。

摘要

做这个很有趣。 我对 ASM 还是很陌生,这实际上是我用它编写的第一个真正的项目。 在如此低的级别上使用 C++ 确实帮助我更好地了解了该语言本身的机制。 如果有人对我的 ASM 代码有任何建议,请告诉我如何做得更好。

C++ 数据存档类 (MASM 实现) - CodeProject - 代码之家
© . All rights reserved.