Подтвердить что ты не робот

Был ли Visual С++ STL сгенерированным человеком или сгенерированным кодом?

Я волнуюсь, когда я открываю любой код, связанный с STL, из реализации Visual Studio при отладке моего кода:

// From <xtree>

if (_Where == begin())
    {   // insert at beginning if before first element
    if (_DEBUG_LT_PRED(this->comp,
        this->_Kfn(_Val), _Key(_Where._Mynode())))
        return (_Insert(true, _Where._Mynode(), _Val));
    }
else if (_Where == end())
    {   // insert at end if after last element
    if (_DEBUG_LT_PRED(this->comp,
        _Key(_Rmost()), this->_Kfn(_Val)))
        return (_Insert(false, _Rmost(), _Val));
    }
//...
else if (_DEBUG_LT_PRED(this->comp,
    _Key(_Where._Mynode()), this->_Kfn(_Val))
    && (++(_Next = _Where) == end()
        || _DEBUG_LT_PRED(this->comp,
            this->_Kfn(_Val), _Key(_Next._Mynode()))))
    {   // insert after _Where
    if (_Isnil(_Right(_Where._Mynode())))
        return (_Insert(false, _Where._Mynode(), _Val));
    else
        return (_Insert(true, _Next._Mynode(), _Val));
    }

Присутствие комментариев заставляет меня чувствовать, что человек написал их, но плохое форматирование, либеральное использование подчеркиваний в начале всего (почему?) и чрезвычайно нечитаемые условия, такие как (++(_Next = _Where) == end() || _DEBUG_LT_PRED ...), заставляют меня чувствовать, что они были созданы из другого фрагмента исходного кода, не записанного как-есть.

Кто-нибудь знает, что из этого происходит? (Если бы он был создан из какого-то другого кода, мне было бы интересно узнать, как это сделать.)


Для записи здесь одно и то же, но "правильно отформатировано":

if (Where == begin())
{
    // insert at beginning if before first element
    if (DEBUG_LT_PRED(this->comp, this->Kfn(Val), Key(Where.Mynode())))
        return (Insert(true, Where.Mynode(), Val));
}
else if (Where == end())
{
    // insert at end if after last element
    if (DEBUG_LT_PRED(this->comp, Key(Rmost()), this->Kfn(Val)))
        return (Insert(false, Rmost(), Val));
}
//...
else if (DEBUG_LT_PRED(this->comp, Key(Where.Mynode()), this->_Kfn(Val))
    && (++(Next = Where) == end()
        || DEBUG_LT_PRED(this->comp, this->_Kfn(Val), Key(Next.Mynode()))))
{
    // insert after Where
    if (Isnil(Right(Where.Mynode())))
        return (Insert(false, Where.Mynode(), Val));
    else
        return (Insert(true, Next.Mynode(), Val));
}

ИМХО это больше похоже на то, как получилось бы, если бы человек написал это, но опять же, я понятия не имею.

4b9b3361

Ответ 1

Две вещи:

  • Отступ действительно хорош, хотя в настоящее время необычный (и я лично его ненавижу): они используют отступ в четыре, что достигается через пробелы, но используют вкладки для всех кратных восьми. Это обычно было стандартным почти везде (в частности, его по-прежнему значение по умолчанию в нескольких редакторах, таких как Vim). Но, как следствие, код имеет только отступы правильно, если вы установите ширину табуляции на 8. Таким образом, код выглядит примерно так:

    else if (_Where == end())
        {   // insert at end if after last element
            if (_DEBUG_LT_PRED(this->comp,
                _Key(_Rmost()), this->_Kfn(_Val)))
                return (_Insert(false, _Rmost(), _Val));
        }
    

    Какая, хотя и необычная, совершенно логичная и понятная.

  • Хороший стиль (или даже мандат?), что стандартная библиотека использует только зарезервированные идентификаторы, чтобы избежать конфликтов имен с кодами С++. Эти зарезервированные имена - это имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква (_DEBUG_LT_PRED, _Key) или два символа подчеркивания (не в этом коде, но GCC libstdС++ усеяно __x и т.д.).

Следовательно, суп алфавита.

Но да, этот код действительно написан вручную - по крайней мере, это относится к GCC. Активная ветвь источника libstdС++ выглядит точно так же, как и код выше, и не автогенерируется.

Ответ 2

STL, предоставляемый VС++, написан Dinkumware (и, возможно, адаптирован).

Насколько я знаю, это написано людьми, но сильно оптимизировано, что может оставить кислый вкус во рту поддерживающих. В конце концов, есть причина, что мы советуем начинающим не микро-оптимизировать свой код - это затрудняет чтение. Однако мы ожидаем от библиотеки такой же важной, как и STL, которая будет сильно оптимизирована: нам все равно не нужно поддерживать ее.

Я сам считаю это вполне читаемым:

  • Хорошо с отступом (никогда не мог правильно визуализировать GCC STL)
  • Комментарии
  • Отсутствие беспорядка препроцессорных директив (ala Boost, но, очевидно, проще обслуживать только один компилятор)

Возможно, вам захочется взглянуть на libС++, чтобы убедить себя, что даже написанная человеком библиотека, без устаревшего кода (она свежая), может стать довольно сложной. Пример <algorithm> (любите алгоритм сортировки).

Ответ 3

Оригинальная компания для MS STL была Dinkumware. У них был этот ужасный стиль кода, и он выглядит все еще там, хотя MS больше не использует их. Я уверен, что это написано вручную, вероятно, всем одним и тем же человеком, я мог бы назвать его, но я не думаю, что буду.