gpt4 book ai didi

c++ - 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:46 26 4
gpt4 key购买 nike

我正在使用外部库 (pcl),因此我需要一个不会更改现有函数原型(prototype)的解决方案。

我正在使用的一个函数生成一个 std::vector<int, Eigen::aligned_allocator<int>> .我接下来要调用的函数需要一个 const boost::shared_ptr<std::vector<int, std::allocator<int>>> .我不想复制这些元素,因为它在我的代码中已经很慢的关键部分。如果不是因为分配器不匹配,我将通过简单地执行以下操作来绕过 shared_ptr 要求:

// code that generates std::vector<int, Eigen::aligned_allocator<int>> source
boost::shared_ptr<std::vector<int>> indices(new std::vector<int>);
indices->swap(source);
// use indices as intended

这不能用 MSVC 编译器编译,因为它不能在这两种 vector 类型之间进行转换。到目前为止,我想到的唯一不复制内容的解决方案是:

// code that generates std::vector<int, Eigen::aligned_allocator<int>> source
boost::shared_ptr<std::vector<int>> indices(new std::vector<int>);
indices->swap(reinterpret_cast<std::vector<int>&>(source));
// use indices as intended
indices->swap(reinterpret_cast<std::vector<int>&>(pcout.points));

请注意我需要如何将索引用作 const shared_ptr。我相信分配器不会在交换操作中发挥作用。整数也不需要任何填充来对齐,因为它们已经是 32 位大小。 std::allocator 版本应该能够从对齐版本中读取,因为它只能在 std::allocator 本来可以使用的内存地址中分配。最后,我换回来了,因为如果对齐分配器试图删除一个非对齐的保留空间,它可能会崩溃。

我试过了,它没有崩溃,但这还不足以让我相信它确实是正确的。安全吗?如果不是,如果对编译器做出某些合理的假设,它是否有条件安全?是否有不会显着影响性能的更安全的替代方案?

请不要回复“分析您的代码”、“不值得”或类似的回答。即使它们适用于此,理论上也存在复制不是可行解决方案的情况,本帖应解决该问题。

Similar question正在谈论以一种干净的方式复制数据,正如评论中所阐明的那样。

编辑:似乎尽管 Eigen::aligned_allocator 被设计为 16 位对齐,但没有向整数添加额外的填充。比较列表中第一个和最后一个元素的地址,可以得出元素数量和 sizeof(int) 所期望的大小。这意味着整数的存储方式应与 std::allocator 版本兼容。我希望今天晚些时候或 future 几天有时间进行更完整的测试。

最佳答案

如果您有能力将函数原型(prototype)更改为另一种 vector 类型,那么标准库中就有一个全新的命名空间 (namespace pmr),它对分配器使用类型删除以确保两者之间的兼容性使用不同分配器的容器。

有关更多信息,请参阅 polymorphic_allocator: when and why should I use it?

有了这个改变,你可以简单地做

void foo(std::pmr::vector<int>& vec); 

并传入一个带有任何你想要的分配器的 vector 类型(只要它也是一个 std::pmr::vector)。

如果您无法更改函数期望的 vector 类型,我认为您可以做的比一个一个地复制/移动元素更好。

reinterpret_cast将两个不同的 vector 实例转换为不同的类型,然后对它们使用方法是非常危险的。

关于c++ - 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44953076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com