增加容量时 std::vector *必须* 移动对象吗?或者,分配器可以“重新分配"吗?

Does std::vector *have* to move objects when growing capacity? Or, can allocators quot;reallocatequot;?(增加容量时 std::vector *必须* 移动对象吗?或者,分配器可以“重新分配吗?)
本文介绍了增加容量时 std::vector *必须* 移动对象吗?或者,分配器可以“重新分配"吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

限时送ChatGPT账号..

A 不同的问题激发了以下想法:

std::vector 是否必须在增加容量时移动所有元素?

据我所知,标准行为是底层分配器请求整个新大小的块,然后移动所有旧元素,然后销毁旧元素,然后释放旧内存.

鉴于标准分配器接口,这种行为似乎是唯一可能的正确解决方案.但我想知道,修改分配器以提供一个 reallocate(std::size_t) 函数是否有意义,该函数将返回一个 pair 并且可以映射到底层realloc()?这样做的好处是,如果操作系统实际上可以扩展分配的内存,则根本不需要移动.布尔值将指示内存是否已移动.

(std::realloc() 可能不是最好的选择,因为如果我们不能扩展,我们不需要复制数据.所以实际上我们更想要像 extend_or_malloc_new().也许基于 is_pod-trait 的特化将允许我们使用实际的 realloc,包括它的按位复制.只是不一般.)

这似乎是一个错失的机会.最坏的情况,你总是可以将 reallocate(size_t n) 实现为 return make_pair(allocate(n), true);,所以不会有任何惩罚.>

是否有任何问题使此功能不适用于 C++ 或不受欢迎?

也许唯一可以利用这一点的容器是 std::vector,但话说回来,这是一个相当有用的容器.

<小时>

更新:一个小例子来澄清.当前resize():

pointer p = alloc.allocate(new_size);for (size_t i = 0; i != old_size; ++i){alloc.construct(p + i, T(std::move(buf[i])))alloc.destroy(buf[i]);}for (size_t i = old_size; i < new_size; ++i){alloc.construct(p + i, T());}alloc.deallocate(buf);buf = p;

新实现:

pairpp = alloc.reallocate(buf, new_size);if (pp.second) {/* 和以前一样 *
                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!
                
上一篇:向量的大小与容量? 下一篇:如果增加一个等于 STL 容器的结束迭代器的迭代器会发生什么
相关文档推荐 OpenGL 变换不同轴多次旋转的对象 OpenGL transforming objects with multiple rotations of Different axis(OpenGL 变换不同轴多次旋转的对象) GLFW 第一响应者错误 GLFW first responder error(GLFW 第一响应者错误) SOIL 连接不正确 SOIL not linking correctly(SOIL 连接不正确) 核心配置文件与版本字符串?在 mesa 10.0.1 中只获得 GLSL 1.3/OGL 3.0 Core profile vs version string? Only getting GLSL 1.3/OGL 3.0 in mesa 10.0.1(核心配置文件与版本字符串?在 mesa 10.0.1 中只获得 GLSL 1.3/OGL 3.0) OpenGL 纹理 ID 的范围是多少? What is the range of OpenGL texture ID?(OpenGL 纹理 ID 的范围是多少?) 与基本逻辑代码相比,OpenGL glDrawElements() 调用的繁重程度如何? How taxing are OpenGL glDrawElements() calls compared to basic logic code?(与基本逻辑代码相比,OpenGL glDrawElements() 调用的繁重程度如何?)
栏目导航 前端开发问题Java开发问题C/C++开发问题Python开发问题C#/.NET开发问题php开发问题移动开发问题数据库问题 最新文章 • 如何使用 VideoWriter 从 OpenCV 打... • LNK2038:检测到“RuntimeLibrary&quo... • C/C++ 中的无限循环... • Clang C++ 交叉编译器 - 从 Mac OS X... • 如何避免 Qt app.exec() 阻塞主线程... • 如何从 C++ 对象中获取类名?... • 在 C++ 中删除指针... • OSX - 用通过 Homebrew 安装的 4.9 ... • 基准测试(python 与 C++ 使用 BLAS)... • 具有完整 C++11 支持的 Windows C++ ... • 如何在 MacOS 上安装 Boost?... • shared_ptr 到数组:应该使用它吗?... 热门文章 • 如何使用 VideoWriter 从 OpenCV 打... • LNK2038:检测到“RuntimeLibrary&quo... • C/C++ 中的无限循环... • Clang C++ 交叉编译器 - 从 Mac OS X... • 如何避免 Qt app.exec() 阻塞主线程... • 如何从 C++ 对象中获取类名?... • 在 C++ 中删除指针... • OSX - 用通过 Homebrew 安装的 4.9 ... • 基准测试(python 与 C++ 使用 BLAS)... • 具有完整 C++11 支持的 Windows C++ ... • 如何在 MacOS 上安装 Boost?... • shared_ptr 到数组:应该使用它吗?... 热门标签 五金机械 教育培训 机械设备 环保公司 新闻资讯 服装服饰 营销型 轴承 电子元件 零部件 电子科技 电子产品 环保科技 培训机构 电子商城 双语 中英双语 织梦模板 dede 外语学校 竞价网站源码 竞价培训网 门户网站 织梦笑话网 dedecms笑话网 织梦源码 网站建设 搞笑图片 织梦教程 旅游网站源码 织梦旅游网 学校培训 html5 企业织梦源码 医院源码 后台样式 移动营销页 chatgpt 整形医院 大学医院 新手建站 客服代码 洗衣机维修 企业网站 淘宝客 导航菜单 教育网站 学校源码 装修网站 装修模板 美容整形 女性健康 妈妈网 机械源码 建站公司 珠宝首饰 苹果网站 手机资讯 管理平台 织梦模版打包 妇科源码 安卓市场源码 男性时尚网 健康之家 app应用网站 笑话网站 下载站 车辆管理系统 中医院网站 家装网站源码
网站首页 - 免责声明- 最新公告- 充值相关 - 网站地图 Copyright © 2022-2023 深圳市沃梦达电子商务有限公司 All Rights Reserved. 粤ICP备14083021号