Visual C++ STL是人为生成的还是代码生成的?

Meh*_*dad 31 c++ stl visual-studio visual-c++

吓坏了,每当我打开从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));
    }
Run Code Online (Sandbox Code Playgroud)

评论的存在让我感觉好像是人类写的,但是格式不好,在一切开始时自由使用下划线(为什么?),以及非常难以理解的条件(++(_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));
}
Run Code Online (Sandbox Code Playgroud)

恕我直言,更像是一个人如果写出来的结果,但话又说回来,我不知道.

Kon*_*lph 32

两件事情:

  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));
        }
    
    Run Code Online (Sandbox Code Playgroud)

    虽然仍然不寻常,但它完全合乎逻辑且易读.

  2. 标准库仅使用保留标识符以避免与客户的C++代码发生名称冲突,这是一种很好的风格(甚至是强制性的?).这些保留名称是以下划线后跟大写字母(_DEBUG_LT_PRED,_Key)开头的名称,或两个下划线(不在此代码中,但GCC libstdc ++中充斥着__x等等).

因此,字母汤.

但是,是的,这段代码确实是手工编写的 - 至少在GCC的情况下.libstdc ++的活动源分支看起来与上面的代码完全相同,并且不会自动生成.

  • C++中的@Mehrdad范围规则很糟糕,因为C++有宏.那些可以摧毁一切.关于(4):嗯,由于同样的两个原因,所有标准库实现看起来都像这样.我不确定你在'if`条件下遇到的问题是什么 - 除了它们包含的调试代码使得它们更难理解...... (5认同)
  • +1*非常有趣的关于点#1的注释,但是(2)为什么标识符与任何东西冲突?C++中没有范围规则吗?(3)这仍然无法解释为什么'if`条件如此丑陋/不可读:\,以及(4)这与GCC有什么关系? (2认同)
  • @Konrad:关于`if`s:这对你来说看起来有点难以理解,伴随着扩展的条件和副作用吗?... 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()))))... (2认同)
  • @Mehrdad我不这么认为.请记住,使用适当的标签宽度设置,它看起来像这样:https://gist.github.com/1164541 - 非常逻辑缩进.当然,我个人不会在条件限制中使用副作用,如果可以预防的话.但是你的"格式正确"的代码也仍然有这些. (2认同)

Mat*_* M. 15

VC++提供的STL由Dinkumware编写(可能已经改编).

据我所知,它是由人类编写的,但经过大量优化,可能会在维护者的口中留下酸味.毕竟,有一个原因,我们建议初学者不要微观优化他们的代码 - 这使得它很难阅读.但是,我们确实希望从库中获得重要优化的STL:我们无论如何都不必维护它.

我自己发现它很可读:

  • 缩进(无法正确显示GCC的STL)
  • 评论
  • 没有预处理器指令的混乱(ala Boost,但显然它更容易满足一个编译器)

你可能想看看libc ++来说服自己即使是一个人类编写的库,没有遗留代码(它是新鲜的),也会变得非常复杂.示例<algorithm>(喜欢排序算法).

  • @Matthieu - 据我所知,Dinkumware有一个配置系统,可以从更大的代码库中选择系统特定的代码.这隐藏了他们的配置"宏". (2认同)

joh*_*ohn 7

MS STL的原始公司是Dinkumware.他们有这种糟糕的代码风格,即使MS不再使用它们,它看起来仍然存在.我确定这是手写的,可能都是由同一个人写的,我可以给他起名但我不认为我会.

  • 编写这样的代码并不是一种耻辱.STL的目标是最佳,它不是在应用程序级别,读取的容易性比速度和大小更重要. (2认同)
  • 从评论来看,我假设他们正在谈论"STL",Steven T Lavavej,根据他的网站,他是一个非常酷的人.在STL存在之前,他已经离开了"STL". (2认同)