Большой и прямой порядок в безумии Facebook
Я прочитал код глупости, созданный Facebook, На этой странице https://github.com/facebook/folly/blob/master/folly/FBString.h я обнаружил, что автор рассматривает большой порядок байтов и порядок байтов, когда он устанавливает некоторые значение ,, например, емкость_, код выглядит следующим образом:
void setCapacity(size_t cap, Category cat) {
capacity_ = kIsLittleEndian
? cap | (static_cast<size_t>(cat) << kCategoryShift)
: (cap << 2) | static_cast<size_t>(cat);
}
Я хочу знать, почему автору следует учитывать порядковый номер с прямым и обратным порядком, я думаю, что нам не нужно рассматривать их на одной и той же машине, получая и устанавливая стоимость имеют дело с машинами, и мы можем их игнорировать
1 ответ
Эта строковая реализация обладает определенным умением распределять память в зависимости от размера строки. В частности, здесь вы можете найти, где объединение используется для обмена стратегиями.
На 64-битной машине с 8-битными символами структура MediumLarge имеет длину 24 байта и может содержать 24 символа. Однако два бита из последнего байта зарезервированы для определения стратегии хранения, поэтому короткие строки могут иметь длину до 23 символов.
Именно эта вещь "последнего байта" оправдывает необходимость беспокоиться о порядке байтов: этот "последний байт" является самым старшим адресом, и, следовательно, на машине с прямым порядком байтов, и эти флаги хранятся в двух старших битах, и вы можно извлечь длину емкости, маскируя эти два бита. На старшем байте последний байт является наименее значимым байтом, флаги хранятся в двух младших битах, и вы можете извлечь емкость, выполнив 2-битное смещение вправо.
Теперь тот факт, что код использует kIsLittleEndian
и условный оператор для переключения между этими поведениями, кажется, предполагает, что эти проверки происходят во время выполнения. Тем не мение, kIsLittleEndian
объявлен как constexpr
и все условные выражения могут быть оценены во время компиляции.