将向量地址转换为本机指针是不是安全?
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 需要本地指针类型才能调用。 是的,但重点是&vT[0]
已经是您正在寻找的本机指针类型,无需强制转换。
@Thomson:你不需要投射。即使你这样做了,你也不应该使用 C-cast。
这是返回副本还是参考?
它返回一个指针,但就你的问题而言,它返回一个“引用”,这意味着它没有复制任何东西。【参考方案2】:
是的,&v[0]
是安全的,是的,这些元素在内存中是连续的。不过,我个人会使用v.data()
,因为这样可以更好地传达这个想法(毕竟你想获得内部数组,data)。
【讨论】:
我不同意 data() 传达了better
的意图。它也不是更糟。但是取第一个元素的地址的习语已经广为人知了。
.. 如果他碰巧将 std::vector
换成原生类型的 C 数组,则 100% 与 C 等效:Type vT[MAX_ARRAY_ELEMS], *pVT = vT; Type *p1 = &vT[0]; Type *p2 = &pvT[0];
【参考方案3】:
在你这样做之前确保向量是非空的。
Type *p = ( vT.empty() ? NULL : &vT[0] );
或者正如 Xeo 所说,新的库规范允许 .data()
成员函数做同样的事情(可能在您的实现中不可用)。
【讨论】:
在过去计算地址应该也是有效的......当然它可能不是传递给任何函数的合适值 @Ben:如果v
为空,访问v[0]
就是UB,直接取地址也没关系。以上是关于将向量地址转换为本机指针是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章