Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 快速检索(void*)内存块_C++_C - Fatal编程技术网

C++ 快速检索(void*)内存块

C++ 快速检索(void*)内存块,c++,c,C++,C,我有一个向内存块返回空*的系统。这个内存块存储不同类型(int、char、double等)的连续数据记录,并给出每个记录中每个字段的字节数。我基本上查找记录的类型并获得记录的值。要检索所有记录,我需要 switch(type) { case 'int' : \*(int*)(ptr+index) case 'char': \*(char*)(ptr+index) } 当我必须遍历300000条记录时,这需要花费大量时间。有没有更快的方法来遍历所有记录?如果一个块可以是多种类

我有一个向内存块返回空*的系统。这个内存块存储不同类型(int、char、double等)的连续数据记录,并给出每个记录中每个字段的字节数。我基本上查找记录的类型并获得记录的值。要检索所有记录,我需要

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,我用它作为通过套接字发送的序列化手段。有更好的选择吗?