gpt4 book ai didi

c++ - 如何实现仅在堆栈上分配的字符串

转载 作者:可可西里 更新时间:2023-11-01 17:50:32 26 4
gpt4 key购买 nike

在大约十年前的一个项目中,我们发现 std::vector的动态分配导致严重的性能消耗。在这种情况下,它分配了许多小 vector ,所以快速的解决方案是编写一个类似 vector 的类来包装一个基于堆栈的预分配 char用作其容量的原始存储的数组。结果是 static_vector<typename T, std::size_t Max> .如果你知道一些基础知识,这样的东西很容易写,你可以找到quite a few这样的野兽on the web .事实上,boost has one ,现在也是。

现在在嵌入式平台上工作,我们恰好需要一个 static_basic_string .那将是一个字符串,它在堆栈上预先分配了固定的最大内存量并将其用作其容量。

起初我认为这应该相当容易(毕竟它可以基于现有的 static_vector ),但再次查看 std::basic_string的界面我不再那么确定了。它比 std::vector 复杂得多的界面。特别是实现find()的家庭函数 std::basic_string附带的不仅仅是一项繁琐的任务。

这让我又开始思考了。毕竟,这就是创建分配器的目的:替换基于 new 的分配和 delete用其他一些手段。但是,说分配器接口(interface)笨拙是轻描淡写的说法。有几篇文章解释了它,但在过去的 15 年里,我很少看到自己开发的分配器是有原因的。

所以这是我的问题:

如果您必须实现 basic_string长得像,你会怎么做?

  • 自己写static_basic_string
  • 写一个分配器传递给std::basic_string
  • 做一些我没有想到的事情?
  • 使用我不知道的来自 boost 的东西?

一如既往,对我们来说有一个相当重要的限制:在嵌入式平台上,我们绑定(bind)到 GCC 4.1.2,所以我们只能使用 C++03、TR1 和 boost 1.52。

最佳答案

第一个问题是:你有多少额外的接口(interface)?利用?大部分std::string的附加接口(interface)可以是使用 <algorithm> 中的函数简单实现(例如。 std::find , std::find_ifstd::search ),并且在很多在某些情况下,其中有很大一部分无论如何都不会被使用。只需根据需要实现即可。

我认为您无法使用自定义分配器来完成这项工作。使内存“在堆栈上”的唯一方法是声明它作为自定义分配器的成员,它将创建所有复制它们时会遇到各种问题。分配器必须是可复制,并且拷贝必须是幂等的。

也许你可以在网上找到一个免费的实现 std::string它使用小字符串实现;然后修改它,以便截止大小(超过它使用动态分配)比您实际使用的任何字符串都大。 (那里是标准库的几个开源实现可用的;与 g++ 一起交付的仍然使用 COW,但是我怀疑其他大多数人都使用 SSO。)

关于c++ - 如何实现仅在堆栈上分配的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26356388/

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