Опирается ли оптимизация небольших строк FBString на неопределенное поведение?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Опирается ли оптимизация небольших строк FBString на неопределенное поведение?

Сообщение Anonymous »

Класс fbstring_core Facebook использует описанную в этом докладе «оптимизацию малых строк», при которой хранилище для элементов данных класса — Char*, size и емкости — будет перепрофилировано для хранения символьных данных, если строка достаточно мала. Биты флагов, используемые для различения этих случаев, расположены в «самом правом символе хранилища». Мой вопрос заключается в том, представляет ли доступ к этим битам через член объединения bytes_, который на самом деле никогда не записывается, неопределенное поведение в соответствии со стандартом C++11? Ответ на вопрос «Доступ к неактивному члену союза и неопределенному поведению»? предполагает, что это так.

Следующий отрывок содержит объявление этих членов и функцию-член категории(), которая используется для определения того, действует ли эта оптимизация.

Код: Выделить всё

    typedef uint8_t category_type;

enum class Category : category_type {
isSmall = 0,
isMedium = kIsLittleEndian ? 0x80 : 0x2,
isLarge = kIsLittleEndian ? 0x40 : 0x1,
};

Category category() const {
// works for both big-endian and little-endian
return static_cast(bytes_[lastChar] & categoryExtractMask);
}

struct MediumLarge {
Char * data_;
size_t size_;
size_t capacity_;

size_t capacity() const {
return kIsLittleEndian
? capacity_ & capacityExtractMask
: capacity_ >> 2;
}

void setCapacity(size_t cap, Category cat) {
capacity_ = kIsLittleEndian
? cap | (static_cast(cat) 

Подробнее здесь: [url]https://stackoverflow.com/questions/45900169/does-fbstrings-small-string-optimization-rely-on-undefined-behavior[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»