【问题标题】:How does a C++ std::container (vector) store its internals (element address, access by index)?C++ std::container (vector) 如何存储其内部结构(元素地址,按索引访问)?
【发布时间】:2013-03-29 10:36:37
【问题描述】:

我正在尝试“破解”游戏(红色警报 3),我尝试制作一个程序来显示我的对手的单位列表。至于这一点,我首先需要找到一个指向我自己的列表的(静态)指针,我可以在单人游戏中做到这一点。

我注意到了这种行为:(通过查看 add_unit 代码更改了哪些地址):

  • 如果尚未构建单元,请为其创建一个新地址(随机?)并将值设置为 1(该类型的单元数量)
  • 当单位已经在游戏中建造过一次时,将单位类型的原始地址加 1

这在我看来就像 std::vector 行为。现在我很难找到向量的“基”地址,还有一个更大的问题:如何按索引访问? std::vector 将它的元素地址存储在哪里?

额外信息:

代码是(从我从程序集中读到的)用 MS Visual C++ 2005 编译的(播放需要 MSVCR80 dll)

向量中的地址如下所示:

(突出显示的地址是作为第一个元素出现的地址 - 第一个单元构建)

这看起来我不能通过添加一个常量值来迭代?

每当添加新地址时,所有其他地址都完全有效且不会更改。

【问题讨论】:

  • 完全依赖于编译器厂商提供的实现。该标准仅描述了接口以及您对容器的要求,而不是实现细节。
  • 伙计们……问题不必由语言标准定义才有效。他正在询问一个公开可用的编译程序,该程序可供所有人使用。这是一个完全有效的问题。
  • 代码是(从我从程序集中读到的)用 MS Visual C++ 2008 编译的(播放需要 MSVCR80 dll)
  • 标准还规定向量将其对象存储在连续内存中。所以如果你有基地址,你可以得到任何元素的地址作为基地址的偏移量。
  • 链接 MSVCRT80.DLL 等表明该应用程序是使用 Visual Studio 2005(也称为“MSVC8”)构建的。 Visual Studio 2008(也称为“MSVC9”)将使用MSVCRT90.DLL 等。

标签: c++ stl containers std stdvector


【解决方案1】:

vector 的典型(尽管不是强制性的)实现是三个连续的单词:

struct TypicalVector
{
    T * start;
    T * end;
    T * capacity;
};

元素访问是通过start[i] 完成的(这就是为什么将start 指针放在前面很重要,以避免不必要的偏移计算),大小为end - start,容量为capacity - start。内存分配获取c * sizeof(T)字节并将start设置为分配的内存地址,将capacity设置为start + c。元素构造增量end

【讨论】:

  • 我注意到添加的新地址有时比第一个添加的地址小,有时比第一个添加的地址大,这是否意味着开始正在更改为最低地址?
  • @GamErix:它是一个动态容器,所以当容量需要增长时,会重新分配整个缓冲区。
  • 然而在游戏中地址总是有效(不要改变),那么它是怎么做到的呢? :o
  • @GamErix:问开发者?!谁说数据甚至在一个连续的数组中?它可以是任何其他类型的数据结构......(可能是双端队列或链表?)
  • 是否有记录所有数据结构的内部结构,以便我可以全部尝试? :)
猜你喜欢
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多