【发布时间】:2016-12-08 17:03:45
【问题描述】:
我正在尝试为大学课程练习优化 String 课程。 普通字符串存储为 char* 和 size_t 作为长度。 sizeof(String) 是 8,它应该保持这样。但是,如果我只有 7 个或更少字符的字符串(或者如果您考虑 null 终止符,则为 6 个),而不是使用指针,我想将它们直接存储在指针/size_t 字节中。
为此,我有两个结构,一个用于 char* 和 size_t,另一个用于 8 个字符(字节)的数组。两者我都放在一个联合中,并给 String 类一个所述联合的成员。
要确定一个字符串是普通字符串还是短字符串,我使用长度为 size_t 或 byte[7] 的最高有效位。如果 byte[7] 大于或等于 128(或 0x80),则它是一个短字符串,字符直接存储在字节中。然后将长度存储在 byte[7] 的剩余位中。
这是目前为止的理论。普通字符串位已经实现,我现在正在尝试实现短字符串位。我现在遇到的问题是以下代码:
inline const char* c_str(void) const
{
if (compound.bytes.bytes[7] >= 0x80)
return compound.bytes.bytes;
return compound.string.m_string;
}
从 Visual Studio 观察者中,我知道 Compound.bytes.bytes[7] 是 0x82(字符串是“hi”)。所以它应该是 0x82 >= 0x80 和 true 一样并返回字节,但由于某种原因,这个比较得到 false 并返回一个普通字符串的 char*,这当然是一个虚假的指针(准确地说是 0xcc006968)。
另外值得指出的是,这段代码对于普通字符串仍然可以正常工作。
我错过了什么,我做错了什么?
【问题讨论】:
-
因为 0x80 是负字符(请记住,字符类型是有符号的,至少在您的平台上)。
-
你能发布一个完整的、最小的、可验证的例子吗?你描述的行为很奇怪。
标签: c++ visual-studio