Был ли Visual C ++ STL сгенерирован человеком или сгенерирован код? - PullRequest
30 голосов
/ 23 августа 2011

I волнуется всякий раз, когда я открываю любой связанный с 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));
}

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

Ответы [ 3 ]

31 голосов
/ 23 августа 2011

Две вещи:

  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));
        }
    

    Что, хотя все еще необычно, являетсясовершенно логично и разборчиво.

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

Отсюда и алфавитный суп.

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

15 голосов
/ 23 августа 2011

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

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

Я сам нахожу ее вполне читабельной:

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

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

7 голосов
/ 23 августа 2011

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

...