C ++ std :: container(vector)如何存储其内部(元素地址,索引访问)?

时间:2013-03-29 10:36:38

标签: c++ stl containers std stdvector

我试图“破解”游戏(红色警报3),我尝试制作一个程序,显示我的对手的单位列表。至于我首先需要找到一个指向我自己列表的(静态)指针,我可以在单个播放器上执行。

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

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

这看起来像std :: vector行为。现在我无法找到向量的“基本”地址,还有一个更大的问题:我如何通过索引访问? std :: vector在哪里存储它对元素的地址?

额外信息:

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

这就是向量中的地址:

enter image description here

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

这看起来不像我可以通过添加常量值来迭代?

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

1 个答案:

答案 0 :(得分:4)

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

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

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