【问题标题】:Will this code make those vector aligned?这段代码会让那些向量对齐吗?
【发布时间】:2012-02-21 14:45:09
【问题描述】:

假设我有:

vector<T *> vect;

我知道这不是显而易见的方法,但我有一个 API 可以做到这一点,所以我不能决定改用 vector&lt;T&gt;

所以当我将对象放入其中时:

vect.push_back(new T);

此代码是否会确保该向量是 aligned 连续的,因为它是一个指针向量?这个容器会决定new 操作符的行为吗?

编辑: 我还需要在这些上拨打delete 吗?

【问题讨论】:

  • 你对这种情况下的aligned这个词有什么理解?
  • “决定new 运算符的行为”是什么意思?
  • 分配的对齐将不是向量的责任,因为您执行分配而不是向量。它只是用来存放您放入其中的指针。
  • 好吧,我的意思不是对齐,而是连续,我知道这不是同一个意思,但我想知道分配的对象是否会像数组一样放置
  • 所以你问的是两个新语句是否会将分配的对象放在彼此的正下方?我相当确定分配器可以随意处理这个问题,并且对此没有任何保证。我知道确保它们相互跟随的唯一方法是分配一个数组。

标签: c++ stl alignment


【解决方案1】:

您希望将许多 T* 推入向量中,以使指向的对象是连续的。各种 T* 将彼此相邻,但您也希望 T 对象彼此相邻。如果你事先知道物品的数量,你可以这样做:

T* arr = new T[N];
for(int i = 0; i<N; ++i) {
    vect.push_back(&(arr[i]));
}

要删除,您必须致电delete[] vect[0];。您仅在第一项上调用删除。如果你 delete 其他人,你会得到未定义的行为。

(我仍然不知道为什么你希望它们是连续的。)

【讨论】:

  • 我不得不承认这是一种有趣的方式。 +1
【解决方案2】:

指针在内存中是连续的,就像一个

 T* array[]

这是由标准保证的。但是,向量将在特定操作(例如增长容量)上重新分配;标准也很好地定义了这一点。继续阅读

 std::vector<>::resize
 std::vector<>::reserve
 std::vector<>::capacity
 std::vector<>::size

只要不触发重新分配,就可以将向量视为数组。

链接:http://en.cppreference.com/w/cpp/container/vector/reserve

【讨论】:

    【解决方案3】:

    这段代码会确保这个向量是对齐的吗?因为它是一个指针向量?

    不确定在这种情况下您对 aligned 的理解是什么,但情况类似于指针数组,其中每个指针都分配了动态内存。指针数组位于连续的位置,每个指针都指向位于堆上某处的内存。
    这同样适用于指针元素向量的情况。

    我还需要在这些上拨打delete 吗?

    是的,您需要在每个元素上显式调用 delete
    如果元素是指针,标准库容器不负责释放元素的内存。

    好读:
    Does vector::erase() destroy the removed object?

    【讨论】:

    • typedef btAlignedObjectArray &lt; class btCollisionObject * &gt; btCollisionObjectArray 这就是我担心的(子弹物理)
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多