【发布时间】:2015-06-02 07:05:21
【问题描述】:
编写一个简单的 32 位模拟器(在 C++ 中)但管理内存让我陷入了循环。
我的计划是有一个二维数组,第一个是指针,每个指针指向内存块,这些内存块是在第一次读/写内存块时创建的。
我遇到的问题是如何正确解决它,例如,如果我需要 216 位内存地址是否意味着这一点。
- 我需要 2048 个单词的内存(其中每个单词都是 32 位
uint) - 可以分为 64 个 32 个字的块(每个块为 1024 字节,或 8192 位)
我的印象是这会如下所示
uint32_t* m[64];
// When first read or write into a block create as follows
m[block] = new uint32_t[32];
这意味着最后一个可访问的地址是 0xfffc(因为 0x10000 是地址的总数)。
现在,如果这一切都正确(我不确定它是否正确),我认为实际进入内存将如下所示
uint32_t whichBlock = addr / (32 * 4);
uint32_t blockLoc = (addr % 32) / 4;
这似乎适用于,例如 0x80,因为whichBlock 的地址为 1,blockLoc 为 0(即第二块中的第一个字),但当地址类似于0xff8c 将whichBlock 设为 511,blockLoc 设为 3。
显然我在某个地方的计算完全出错了,但我不知道在哪里!
【问题讨论】:
-
如果您只需要 2^16 位的内存,只需创建一个大小合适的向量(或数组,如果需要),然后完成。所涉及的内存量远太小了,不值得麻烦(实现它可能会使用足够多的代码,最终导致成本超过节省的成本)。
-
对不起,我想我应该说清楚,但我实际上必须处理 2^32 位的内存,这对于向量来说太大了。我只是说 2^16,因为我试图使用较小的值以便于理解,谢谢
-
2^32 位对于矢量来说仍然不算大。它确实提供了一点更多的理由,但我仍然会至少在第一次切割时使用向量(并在以后减少内存使用量,当/如果测量表明它是一个重要因素 - - 但它可能不会)。
-
我看错了规范,我很傻,感谢您的反馈,因为阅读您的回答让我意识到我从根本上误解了规范。我一直在寻找的是地址本身是 32 位(或在我的示例中为 16 位),这意味着该数组太大而不能仅作为单个数组。我已经编辑了原始问题以反映这一点
标签: c++ memory memory-management 32-bit memory-address