【发布时间】:2019-10-09 09:29:42
【问题描述】:
理论上是否有可能使用一些分配器来获得一个内存高效的 STL(和/或 Boost)字符串向量,例如:
using String = std::basic_string<char, std::char_traits<char>, SomeAllocMaybe;
using Vector = std::vector<String, SomeOtherAllocMaybe>;
Vector vec( /* an allocator eventually */ );
vec.emplace_back("first string longer than SSO");
vec.emplace_back("second string");
vec.emplace_back("third string longer than SSO");
将导致内存中只有一个紧凑的连续数据块,如下所示:
"first string longer than SSO'\0'second string'\0'third string longer than SSO'\0'"
【问题讨论】:
-
在您的场景中,当您执行
vec[1].append("boom")时会发生什么? -
这不是一个真正的向量,更像是一个串联的字符串,而且这已经存在,它是
std::string;) -
理论上,当然。然而,这需要太多关于编译器如何实现 std::string 的假设。如果你真的需要你指定的内存布局,可能值得为它滚动你自己的类。例如 GCC:stackoverflow.com/q/5058676/5343120
-
理论上是可以的,是的。但你真正需要的是什么?您是否只需要将字符串放在同一内存段中,或者您是否也不想避免“指针 deref”?在第一种情况下 - 附加到一个字符串可能会移动到不同的内存段。
-
使用 STL/Boost 会对这些类的底层实现做很多假设。我宁愿自己实现。
标签: c++ string vector allocator