Я пытаюсь оптимизировать класс 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 (строка «привет»). Поэтому он должен быть 0x82> = 0x80, как в true, и возвращать байты, но по какой-то причине это сравнение получает false и возвращает char * нормальной строки, что, конечно же, является фиктивным указателем (точнее, 0xcc006968).
Также стоит отметить, что этот код по-прежнему работает правильно для обычных строк.
Что мне не хватает, что я делаю неправильно?
Поскольку 0x80 является отрицательным символом (помните, что тип символа подписан, по крайней мере, на вашей платформе). –
Можете ли вы опубликовать полный, минимальный, проверенный пример? Поведение, которое вы описываете, довольно странно. – templatetypedef