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






3.67/5 (2投票s)
展示一个用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_data
和 remove_data
方法中使用了“先双字后字节”写入算法。 完成并测试该类后,结果证明是正确的。
摘要
做这个很有趣。 我对 ASM 还是很陌生,这实际上是我用它编写的第一个真正的项目。 在如此低的级别上使用 C++ 确实帮助我更好地了解了该语言本身的机制。 如果有人对我的 ASM 代码有任何建议,请告诉我如何做得更好。