我正在尝试为大学课程练习优化一个String类。 正常字符串被存储为char *和size_t长度。 sizeof(String)是8,它应该保持这样。然而,如果我只有7个或更少字符的字符串(或6,如果你考虑空终止符),而不是使用指针,我想直接存储在指针/ size_t字节。为什么0x82小于0x80?
为此,我有两个结构体,一个用于char *和size_t,另一个用8个字符(字节)的数组构成。我都加入了一个工会,并且让这个String类成为这个工会的成员。
要确定一个字符串是一个正常的字符串还是一个短字符串,我使用长度为size_t或byte [7]的最高有效位。如果字节[7]大于或等于128(或0x80),则它是一个短字符串,字符直接存储在字节中。然后将该长度存储在字节[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是一个负数字符(记住,字符类型至少在您的平台上是有符号的)。 –
你能发布一个完整的,最小的,可验证的例子吗?你描述的行为很奇怪。 – templatetypedef