C ++内存分配器

问题描述 投票:-1回答:2

我试图弄清楚如何制作一个链接到单个字节数组的链表。因此,我放入字节数组的每个元素都可以是enqued()和dequeued()。但是,我需要弄清楚如何使用指针偏移量和链接列表来执行此操作。

我的问题是:我如何从指针的起始处获得设定量的偏移量?例如,假设我的列表的开头是一个指针。我将从检查该空间是否为空开始,如果不是,请获取列表中的下一个值。如何从当前指针位置偏移并获得一个新的指针位置,该位置基本上只是另一个指针的偏移,即向前或向后,向上或向下,向上或向下,向左和向右,正负。

有人问一个例子:

byte myData[1024];

我必须将所有数据存储到此。这是一个课堂作业。本质上,我必须使用此数组将所有数据存储到该数组中,并基本上创建一个队列,例如标准c ++队列。我必须创建Enqueue()和Dequeue()函数,然后为每个函数动态分配内存。我对自己的工作有一个大致的了解。我一直试图找出如何获取当前位置的指针,然后将其设置为新位置,然后将其作为列表中的“下一个”。

c++ memory memory-management
2个回答
2
投票

听起来您真正想要的是指针算术。很简单。

std::int32_t foo[] = {42, 350};
std::int32_t* intPtr = &foo;  // We'll say foo is at address 0x005

++intPtr;  // Or intPtr += 1, either way the value of intPtr is now 0x009
           // *intPtr would now give you 350.
           // Your program knows the type being pointed to, and bumps up the address
           // accordingly. In this case a 4-byte integer

[在C数组上执行指针算术时,重要的是要进行检查以防止您越过边界。但是,我什至不认为指针算术是必要的。如果要私下存储数组,则只需使用索引访问并跟踪列表结尾的索引就容易得多。您仍然必须进行检查,但检查起来比较容易。

您还说了链表,但描述了一个数组列表。它们是两个非常不同的数据结构。如果您编写一个单独的数组列表类,并将数组列表对象而不是原始数组存储在队列中,则队列的编写将容易得多。


0
投票

如何获得从指针开始的设定量的偏移量?

有关n3337算术,请阅读C ++ 11标准pointer。注意C ++中的existence of offsetof

[如果您有两个包含有效地址的offsetofshort*ptr1;指针,则可以对short*ptr2;ptr1 - ptr2ptr1 + 5进行编码(但是,禁止ptr2 - 3)。 C ++ 11标准说明了何时有效(有时无效,例如ptr1+ptr2ptr2时)。还请注意,通常nullptr&ptr1[3]相同,并且ptr1+3恰好是ptr2[-1](在这种情况下)。

请注意代码中的*(ptr2-1),例如undefined behavior(如果不小心进行指针算术,将只有一个:请注意buffer overflows)。

segmentation faults之类的工具,调试器(例如address sanitizers),GDB应该有助于理解代码的行为。

不要忘记在C ++编译器中启用警告和调试信息。一旦C ++代码在没有警告的情况下编译,请阅读valgrind。用how to debug small programs,用GCC编译。请注意,GCC 10添加了一些g++ -Wall -Wextra -g。您可以使用static analysis abilitiesClang static analyzer(或开发自己的Frama-C)。

GCC plugin Wikipage有一个不错的身影。 linked list上的Wikipage也可以为您提供帮助。

我建议先读一个好的trie,然后再读一些C++ programming book

introduction to algorithms或其他地方,您可以找到大量与您的问题相关的C ++代码示例(其术语使非母语的英语人士感到困惑)。

关于记忆形状分析]的学术论文(例如githubthis one一个]”中包含的数字将有助于您理解。 that或与Books有关的Web resources也相关。

© www.soinside.com 2019 - 2024. All rights reserved.