是Visual c++ STL人工生成的还是代码生成的

Was the Visual C++ STL human-generated or code-generated?

本文关键字:代码生成 Visual c++ STL      更新时间:2023-10-16

每当我在调试代码时从Visual Studio的实现中打开任何与stl相关的代码时,我都会抓狂:

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

IMHO 这个更像是一个人写出来的,但话又说回来,我也不知道。

两件事:

  1. 缩进实际上很好,尽管现在不太常见(我个人讨厌它):他们使用4的缩进,这是通过空格实现的,但是对于8的所有倍数使用制表符。这曾经是几乎所有地方的标准(值得注意的是,它仍然是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++的活动源代码分支看起来与上面的代码完全相同,并且不是自动生成的。

vc++提供的STL是由Dinkumware编写的(也可能被改编)。

据我所知,它是由人类编写的,但经过了大量优化,这可能会给维护者留下酸味。毕竟,我们建议初学者不要对代码进行微优化是有原因的——因为这会让代码难以阅读。然而,我们确实希望像STL这样重要的库得到大量优化:无论如何我们都不必维护它。

我自己觉得它很好读:

  • 缩进得很好(无法正确地显示GCC的STL)
  • 没有混乱的预处理器指令(像Boost,但显然更容易迎合一个编译器)

您可能想看看libc++来说服自己,即使是人类编写的库,如果没有遗留代码(它是新的),也会变得相当复杂。示例<algorithm>(喜欢排序算法)。

MS STL最初的公司是Dinkumware。他们有这种糟糕的代码风格,即使微软不再使用它们,它看起来仍然存在。我确定这是手写的,可能是同一个人写的,我能说出他的名字,但我想我不会。