是Visual c++ STL人工生成的还是代码生成的
Was the Visual C++ STL human-generated or code-generated?
每当我在调试代码时从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 这个更像是一个人写出来的,但话又说回来,我也不知道。
两件事:
-
缩进实际上很好,尽管现在不太常见(我个人讨厌它):他们使用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)); }
-
标准库只使用保留标识符以避免与客户的c++代码发生名称冲突,这是一种很好的风格(甚至是强制的?)这些保留名要么是以下划线开头,然后是大写字母(
_DEBUG_LT_PRED
,_Key
),要么是两个下划线(不在此代码中,但GCC libstdc++中到处都是__x
等)。
因此有了字母汤。
但是,这些代码确实是手工编写的——至少在GCC的情况下是这样。libstdc++的活动源代码分支看起来与上面的代码完全相同,并且不是自动生成的。
vc++提供的STL是由Dinkumware编写的(也可能被改编)。
据我所知,它是由人类编写的,但经过了大量优化,这可能会给维护者留下酸味。毕竟,我们建议初学者不要对代码进行微优化是有原因的——因为这会让代码难以阅读。然而,我们确实希望像STL这样重要的库得到大量优化:无论如何我们都不必维护它。
我自己觉得它很好读:
- 缩进得很好(无法正确地显示GCC的STL)
- 没有混乱的预处理器指令(像Boost,但显然更容易迎合一个编译器)
您可能想看看libc++来说服自己,即使是人类编写的库,如果没有遗留代码(它是新的),也会变得相当复杂。示例<algorithm>
(喜欢排序算法)。
MS STL最初的公司是Dinkumware。他们有这种糟糕的代码风格,即使微软不再使用它们,它看起来仍然存在。我确定这是手写的,可能是同一个人写的,我能说出他的名字,但我想我不会。
- LLVM |如何实现逻辑非操作的 IR 代码生成
- 代码在Visual Studio 2017中不起作用,但在VS代码中工作
- 默认/样板代码在Visual Studio 2017中给我错误.E1574.虚幻.但构建成功了
- C++基于输入参数的动态代码生成
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- MSBuild 由于缺少属性文件(可能与 IDE 相关)而无法生成 Visual Studio 项目
- C++使用代码生成错误
- C++代码生成核心文件,就像 gdb >> gcore 一样
- 卤化物:X86汇编代码生成
- 当代码在Visual Studio C++中正常工作时,MSB6006错误
- 如何将 MATLAB 图像处理库内置函数转换为 MATLAB 编码器代码生成不支持的 C++?
- 为什么我的代码为同一代码生成不同的值
- 使用CMAKE生成Visual Studio 2017项目
- 我应该担心动态代码生成与用C++编写的其他模块不匹配吗?
- 企业架构师 - 单独的代码生成标头和实现
- C++ 代码生成和模板专用化
- 在Visual Studio 2013中编译的STL列表代码在Visual Studio 2019中给出了错误.想知道原
- 在Visual C++中为几乎相同的代码生成极其奇怪的代码;3倍速度差
- Visual Studio中的Cuda并行代码生成
- 是Visual c++ STL人工生成的还是代码生成的