C++ 快速检索(void*)内存块
我有一个向内存块返回空*的系统。这个内存块存储不同类型(int、char、double等)的连续数据记录,并给出每个记录中每个字段的字节数。我基本上查找记录的类型并获得记录的值。要检索所有记录,我需要C++ 快速检索(void*)内存块,c++,c,C++,C,我有一个向内存块返回空*的系统。这个内存块存储不同类型(int、char、double等)的连续数据记录,并给出每个记录中每个字段的字节数。我基本上查找记录的类型并获得记录的值。要检索所有记录,我需要 switch(type) { case 'int' : \*(int*)(ptr+index) case 'char': \*(char*)(ptr+index) } 当我必须遍历300000条记录时,这需要花费大量时间。有没有更快的方法来遍历所有记录?如果一个块可以是多种类
switch(type)
{
case 'int' : \*(int*)(ptr+index)
case 'char': \*(char*)(ptr+index)
}
当我必须遍历300000条记录时,这需要花费大量时间。有没有更快的方法来遍历所有记录?如果一个块可以是多种类型,并且只能在运行时解析,则必须在
switch
语句中分派给处理程序。请注意:
union
s通常在C中用于此类事情以节省空间switch
语句非常快速,可以转换为固定时间查找表如果我正确理解了您的问题——我假设您正在浏览每个记录,比如说“对于每个记录
I
,如果其类型为'char',则访问位于I
”位置的记录。”
如果您知道需要提前访问多少条记录,您不能先缓存所有记录吗
如果我完全偏离了正轨,请原谅我没有理解您的观点。您的评论最终提供了足够的信息来回答这个问题:您正在向
ostringstream
写信。这意味着您可能在交换机内部进行了大量的字符串操作。找出如何优化这一点,您的性能问题就会消失
(为了让自己相信这一点,只需注释掉引用流的所有代码,然后再次运行程序即可)您能发布(并正确格式化)真实代码吗?这不可能是正确的。定义“很多时间”。我们说的是微秒还是秒?如果是后者,则很可能是将内存交换到磁盘,并且只能使用更多的RAM来解决。300000条记录并没有那么大,简单地访问这300000条记录的内存应该非常快。在每种切换情况下,我都将值附加到一个ostringstream。这需要更长的时间吗?
C
或C++
?我相信这个答案对于不同的语言来说可能是非常不同的…@拉杰什:你的代码不是合法的C或C++。然而,答案要看情况而定。这取决于您对值所做的操作、从何处获取内存块等。您如何知道switch语句是一个瓶颈?你用过剖析器吗?我简直不敢相信开关是个问题。它实际上是各种类型的连续内存。比如int,char,int,double…所以它将是4个字节,1个字节,4个字节,8个字节etc@Eli,switch语句不能保证是常数时间查找表。这取决于编译器是否能对其进行优化。@Vlad:我假设对于作者要求的简单情况(在枚举
或小整数上使用开关
进行调度),今天的编译器将进行优化it@Rajesh:给定一个二进制数据流,你怎么知道接下来的4个字节是int还是double的开始?我得到了每个记录的起始点及其数据类型/sizecache?。它们已经在内存中。我得到了指向第一个位置的指针。我所做的唯一操作是读入ostringstream,我用它作为通过套接字发送的序列化手段。有更好的选择吗?