将向量地址转换为本机指针是不是安全?

Posted

技术标签:

【中文标题】将向量地址转换为本机指针是不是安全?【英文标题】:Is it safe to convert vector address to native pointer?将向量地址转换为本机指针是否安全? 【发布时间】:2012-06-01 03:17:47 【问题描述】:

我想在将向量地址传递给某些外部 API 调用之前将其传递给指针,这样做安全吗?潜在的问题是向量中的元素是否确保在内存中是连续的?

std::vector<Type> vT;
Type* p = (Type*)&vT[0];

【问题讨论】:

【参考方案1】:

是的,你甚至不需要投射它。

【讨论】:

谢谢,我需要进行转换,因为 API 需要本地指针类型才能调用。 是的,但重点是 &amp;vT[0] 已经是您正在寻找的本机指针类型,无需强制转换。 @Thomson:你不需要投射。即使你这样做了,你也不应该使用 C-cast。 这是返回副本还是参考? 它返回一个指针,但就你的问题而言,它返回一个“引用”,这意味着它没有复制任何东西。【参考方案2】:

是的,&amp;v[0] 是安全的,是的,这些元素在内存中是连续的。不过,我个人会使用v.data(),因为这样可以更好地传达这个想法(毕竟你想获得内部数组,data)。

【讨论】:

我不同意 data() 传达了better 的意图。它也不是更糟。但是取第一个元素的地址的习语已经广为人知了。 .. 如果他碰巧将 std::vector 换成原生类型的 C 数组,则 100% 与 C 等效:Type vT[MAX_ARRAY_ELEMS], *pVT = vT; Type *p1 = &amp;vT[0]; Type *p2 = &amp;pvT[0];【参考方案3】:

在你这样做之前确保向量是非空的。

Type *p = ( vT.empty() ? NULL : &amp;vT[0] );

或者正如 Xeo 所说,新的库规范允许 .data() 成员函数做同样的事情(可能在您的实现中不可用)。

【讨论】:

在过去计算地址应该也是有效的......当然它可能不是传递给任何函数的合适值 @Ben:如果v为空,访问v[0]就是UB,直接取地址也没关系。

以上是关于将向量地址转换为本机指针是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

如何将地址转换为函数指针以调用方法

将 3 维指针的第一个地址转换为单维指针有问题吗?

通过指针、强制转换和取消引用加载向量?

int64_t 指针转换为 AVX2 内在 _m256i

如何将向量转换为数组

哪个向量地址更安全?