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

2024-05-14

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

我正在使用的一个函数生成一个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 编译器进行编译,因为它无法在这两种向量类型之间进行转换。到目前为止我想到的唯一不复制内容的解决方案是:

// 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 本来可以使用的内存地址中进行分配。最后,我交换回来,因为如果对齐的分配器尝试删除未对齐的保留空间,它可能会崩溃。

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

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

类似问题 https://stackoverflow.com/questions/8190889/converting-between-vectors-with-different-allocators正在谈论以干净的方式复制数据,正如评论中所澄清的那样。

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


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

更多请参见polymorphic_allocator:我何时以及为什么应该使用它? https://stackoverflow.com/questions/38010544/polymorphic-allocator-when-and-why-should-i-use-it

通过这个改变,你可以简单地做

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

并使用您想要的任何分配器传递向量类型(只要它也是一个std::pmr::vector) 你要。

如果您无法更改函数期望的向量类型,我认为您不能比一一复制/移动元素做得更好。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数? 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 是否需要销毁运算符删除的形式才能真正销毁对象?

    C 20 添加了破坏形式operator delete区别于std destroying delete t范围 它导致delete表达式在调用之前不再销毁对象operator delete 目的是在显式调用对象的析构函数和释放内存之前 允许
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 任何人都可以清楚地告诉如何在不使用像 这样的预定义函数的情况下找到带有小数值或小数值的指数吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 例如 2 0 5 1 414 所以想要 我是 c 的新手 所以请解释简单的逻辑 如果不是复杂的逻辑也足够了 在数学中 从整数取幂到实数
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • 将矩阵与 SUM 相乘

    我想将一个指标与另一个指标之和的结果相乘 我想尝试做的事情 MeticOne SUM MetricTwo Thanks 假设你有MetricOne带标签id and name 你有MetricTwo还有标签id and name 然后你就得
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 如何防止 GCE 将 ssh 密钥复制到所有新实例?

    当我通过 Cloud Console 创建新的虚拟机实例时 系统会自动为我在之前的实例上手动创建的用户创建主目录 并且ssh keys被复制到 ssh authorized keys在各自的主目录中 我不想那样 恕我直言 这是一个严重的安全
  • 如何使用多个项目将大型 ASP.NET MVC 站点分成多个部门?

    假设我有一个非常大的网站 例如 amazon com 我想在整个网站上使用 asp net mvc 但拥有一个包含数百名贡献者的大型项目是不切实际的 我想将工作分成每个部门的书籍 工具 玩具 杂货等项目 然后 当他们构建并交付新版本时 我只
  • 在 R Shiny 中,如何使用可排序 js 将其在列表中出现的顺序次数附加到每个列表元素?

    下面的可重现代码适用于将元素从一个面板拖动到另一个面板 并在 拖动到 面板中自动使用 HTML CSS 对拖入的每个元素进行排名顺序编号 但是 我现在尝试附加到每个 拖动到 列表元素的末尾 使用某种形式的paste0 我假设 该元素在 拖至
  • MySQL中如何存储小数?

    我尝试过将 DECIMAL 与 2 2 一起使用 但它不允许我使用它 我只想存储一个数字 例如 7 50 或 10 50 我需要将这两个数字保留在小数点后 但是当我刷新数据库时 它会将值重置为 0 99 有什么建议么 第一个参数DECIMA
  • 在监督分类中,使用partial_fit() 的MLP 比使用fit() 的表现更差

    我正在使用的学习数据集是灰度图像flatten让每个像素代表一个单独的样本 第二张图像在训练后将被逐像素分类Multilayer perceptron MLP 前一个分类器 我遇到的问题是MLP当它一次接收到所有训练数据集时表现更好 fit
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 什么是春季里程碑?

    我必须学习使用 Maven 和 Spring 在网络上 我在不同的地方看到了术语 spring里程碑 和 spring里程碑存储库 但这是一个里程碑吗 我用谷歌搜索了一下 但没有找到满足我好奇心的定义 谁能帮我 里程碑是项目管理术语 htt
  • VS Code 忽略 pylint 的设置

    我正在尝试禁用 VS Code 中的某些 pylint 警告 但我所做的一切似乎都不起作用 我已在所有 3 个可能的位置 用户 远程 工作空间 中放置了相同的设置 但 pylint 输出窗口中显示的命令行并未反映它 我尝试过重新启动 禁用
  • 无法启动 Angular-phonecat,安装后脚本失败[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我目前正在设置一个 vagrant box 来开始开发实验性的 node js angularjs 应用程序 由于我刚刚开始使用
  • 在移动网站中处理 iPhone 事件(如向左滑动)

    iPhone 浏览器是否有可以使用 Javascript 挂钩的特殊事件 例如 如果用户向左滑动 我想执行某个操作 如果有类似的活动 很高兴看到所有这些活动的参考 理想情况下 有一天所有触摸屏移动浏览器都会有一个标准 您可以访问多点触控事件
  • RestSharp RestClient的默认超时值是多少?

    任何人都知道默认超时值休息锐利 https github com restsharp 休息客户端 RestSharp 在底层使用 HttpWebRequest 它有一个默认超时 https msdn microsoft com en us
  • 在停止调试时终止 VS Code 中的 ng 服务任务

    我有一个 Angular 项目 目前正在通过 chrome 调试器在 vs code 内进行调试 我的launch json uses preLaunchTask serve 其中服务定义于tasks json as ng serve 这样
  • 配置:错误:找不到 CGAL 库

    我的最终目标就是获取python包graph tool在我的系统上工作 如果可能的话 也在 ipynb 上工作 我已经brew install graph tool 如此处所示 https git skewed de count0 grap
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • Expresso 的 Android 测试首选项片段

    我在通过 Expresso 测试我的代码时遇到问题 我写了这段代码 public class SettingsActivity extends Activity Override protected void onCreate Bundle
  • Spring Boot 中的 JSTL 支持

    虽然我知道有JSP 支持中的一些限制 http docs spring io spring boot docs current reference html boot features developing web applications
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

    我正在使用外部库 pcl 因此我需要一个不会更改现有函数原型的解决方案 我正在使用的一个函数生成一个std vector