Был ли 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));
}
ИМХО это больше похоже на то, как получилось бы, если бы человек написал это, но опять же, я понятия не имею.
Ответы
Ответ 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 больше не использует их. Я уверен, что это написано вручную, вероятно, всем одним и тем же человеком, я мог бы назвать его, но я не думаю, что буду.