首页 > 基础资料 博客日记

为什么给 new 设计一个 realloc 是必要的

2026-04-09 11:00:03基础资料围观1

文章为什么给 new 设计一个 realloc 是必要的分享给大家,欢迎收藏极客资料网,专注分享技术知识

为什么给 new 设计一个 realloc 是必要的

本文使用 macbook pro m4 + vscode 编写.

意外无处不在 给未知留个缓冲 花钱续费未来 我真没时间轻松
做事谨慎是因为我从小就心特重 噼里啪啦喊着废话少跟我嗡嗡
很多次是懒惰 荒废不知不觉 很多
会了押韵不听不学
水中捞月 缘木求鱼 我不擅长花心思走面儿组局
时间不等人 写歌词儿又走了神 想把一切都做安排 让过程过稳
-- dirty moss <5 min> in <interact>

分析为什么需要

如果我直接用 std::realloc

std::realloc 的语义是加长申请的内存, 如果不够就 std::memcpy.

std::memcpy 本身有个巨大的坏处, 它只是把内存复制过去. 这会导致虚表指针爆炸 (虽然我经常说 fxxk virtual func, 但是 virtual func 是 c++ 的优秀设计).

而且 std::realloc 只支持加长用 std::malloc 申请的内存.

但我需要的是移动语义.

如果我用 new

new 没有加长内存的功能, 我必须额外申请一段更长的内存, 然后手动用移动语义把原本的东西移过去.

但是坏处是, 如果本来可以扩容, 它也必须在别处开新内存. 但我需要 在大多数情况下是原地扩容, 这样能带来更好的时间复杂度.

所以

new 设计一个 realloc 是非常必要的.

设计关键字

我们使用 new 和 realloc 制造一个合成词, rew. 就叫 rew 了.

这个词的含义是 "倒带", 也就是说这是 recall 的意思???

设计语法

已知 new 一个数组的时候用的是 arr = new type[length], 原地构造使用的是 new (arr) type().

那么数组我们肯定是知道首地址的, 而且内存分配器也知道我们已经分配了多少内存.

arr = rew (arr) type[length_new];

设计行为

\(length\_new < length\)

这个简单, 直接把后面的内存给释放掉, 注意释放之前先调用析构函数.

\(length < length\_new\)

首先, 能扩容就扩容.

如果不能扩容, 分两种情况:

  • 当前类型有移动语义, 且移动语义是 noexcept

直接使用移动语义, 把当前数组挨个元素移动过去.

  • 当前类型没有移动语义或移动语义不是 noexcept, 但有复制语义

使用复制语义, 把当前数组挨个元素复制过去.

  • 当前类型没有移动语义或移动语义不是 noexcept, 也没有复制语义

直接编译错误就行了.

总结

那么这样一个 rew 关键字是不是你需要的呢?


文章来源:https://www.cnblogs.com/young-tea/p/19839285
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云