为指令集模拟器设计高效内存 我在C++中设计了一个指令集模拟器,它由CPU、内存和指令集本身组成。我目前正在尝试设计我的内存类,它将由uint32\u t数据类型组成

为指令集模拟器设计高效内存 我在C++中设计了一个指令集模拟器,它由CPU、内存和指令集本身组成。我目前正在尝试设计我的内存类,它将由uint32\u t数据类型组成,c++,c,memory,computer-architecture,instruction-set,C++,C,Memory,Computer Architecture,Instruction Set,基本上,memory类必须执行以下操作: 接受一个值和一个地址,并将该值分配到内存的特定地址 在某个地址获取一个值。如果以前分配过某个值,则获取该值。否则,返回0 我想到的是,我需要一个搜索算法来找到我感兴趣的地址 我已经实现了可用的最简单版本,这将是一个线性内存搜索,其中所讨论的内存块将只是一个简单的结构,*block,其值和地址存储在向量中。然而,正如您可能猜到的,对于大型案例来说,这是非常昂贵的 总而言之,我想实现一个可以很容易找到内存的案例(我正在考虑二进制搜索,但我愿意接受更多的建议)

基本上,memory类必须执行以下操作:

  • 接受一个值和一个地址,并将该值分配到内存的特定地址
  • 在某个地址获取一个值。如果以前分配过某个值,则获取该值。否则,返回0
  • 我想到的是,我需要一个搜索算法来找到我感兴趣的地址

    我已经实现了可用的最简单版本,这将是一个线性内存搜索,其中所讨论的内存块将只是一个简单的结构,
    *block
    ,其值和地址存储在
    向量中。然而,正如您可能猜到的,对于大型案例来说,这是非常昂贵的


    总而言之,我想实现一个可以很容易找到内存的案例(我正在考虑二进制搜索,但我愿意接受更多的建议),我还想得到关于安排内存块的建议。我目前正在使用向量,因为我不知道我需要的内存大小。

    您尝试过使用std::map吗?这正是你想要的。地址将是键,值将是数据。

    您可以创建类似于实际操作系统处理进程内存的方式。您可以拥有64KB的内存页,并按以下方式存储它们:

    假设您的模拟应用程序试图在地址
    0x05001234
    处存储
    字节

    这将在内存页
    0x0500
    (十进制为1280)中。您只需读取前16位就可以获得页面地址,这有助于将页面地址精确设置为64KB

    使用
    std::map
    来组织内存页。类似于
    std::map页面。或数组
    char*页[0x00010000]在32位系统中应使用256KB内存。别忘了把它归零

    检查您的集合中是否已经有内存页
    0x0500
    。您只需看到
    页面[0x0500]
    不是
    NULL
    。如果不存在,
    pages[0x0500]=新字符[0x00010000]来创建它。如果必须的话,把它归零


    现在只需编写字节,如
    pages[0x0500][0x1234]=byte

    您试图模拟的内存有多大?通常,当我过去这样做的时候,我只是在一个大数据块中分配所需的内存量,然后分别访问它。所讨论的内存没有固定大小,因为我需要按需分配内存。例如,测试套件将在同一测试文件中的位置0x00000000、0x0000000C、0x0000020c、0x40000000、0x8000000C、0xFFFFF0请求内存。然而,0x8000010和0xFFFFFFEC之间有一个巨大的空白,由于未使用的空间,将其保留下来将非常低效。感谢您的回复!嗨,拉兹洛,谢谢你的回复。是的,我曾考虑使用std::map,但规范要求我设计整个类而不使用任何内置函数,因此我认为这不是一个选项。+1给定OP的“设计整个类而不使用任何内置函数”(我认为他指的是标准库用法)可以有一个
    char*
    数组。在大多数商用硬件上,实际内存页可能约为4k,并且使用虚拟寻址,阵列和页面的未占用区域将不需要备份内存,所以它比听起来更高效。。。。