【发布时间】:2019-05-30 16:24:11
【问题描述】:
希望我的问题得到改进和更集中的版本:
由于解释起来会产生误导(见下文),我必须在单个字符串中存储多个 UTF-8 编码字符串。 (这里的字符串表示 C++ std::string)
我的方法是将字符串与非法 UTF-8 八位字节(0xC0、0xC1、0xF5-0xFF)之一作为分隔符,因为这些八位字节永远不会出现在有效的 UTF-8 序列中。 (由于 0x00 是一个有效的 UTF-8 八位字节,我认为它不适合我的预期误用。)
除了性能方面的所有考虑之外,我不知道这种方法有什么问题吗?是否有任何理由偏爱其中一个非法八位位组?
..
在我最初的问题中,我试图提供更多背景信息,但这会导致一些关于性能问题和预期权衡的问题。但我的问题不在于这些权衡,而在于我的方法在技术上的可行性和有效性。
【问题讨论】:
-
@z80crew:“我需要通过索引快速访问单个字符串。”您的数据结构不会发生这种情况。您的
split函数必须遍历 整个 存储空间 (O(n)) 才能找到第 N 个元素。那不会是“快速访问”。 -
说实话,我很惊讶这种权衡是值得的。你真的节省了那么多内存吗?同时,您的新字符串 非常非常 更难查找(除非您正在索引它们的起始位置,再次需要更多内存 - 并使分隔符毫无意义,所以我猜不是)!加上修改它们将是一个麻烦。我认为这个问题过于宽泛,无法直接回答,但前提似乎有缺陷。
-
顺便说一下,
"abc" + 0xC0 + "def" + 0xC0 + "ghi"不是字符串连接,但您可能已经知道并且可能出于说明的目的而忽略它 -
@z80crew:“对于一些重要的用例,它会产生过多的内存开销”你能澄清一下那些“重要的用例”是什么造成了“过多的内存开销”吗? ?
-
也使用一些疯狂的非法 UTF-8 序列,使用零
0作为分隔符更简单、更简洁。