我在C ++及其设计上读过一篇关于Bjarne Stroustrup的interview。我对他在那里使用的术语感到困惑所以我希望能澄清一些这样的时刻。
我在我的“C ++的设计与实现”一书和我的两篇“编程语言历史”会议论文中记录了我的设计目标和设计约束,但简单地说,我的目标是
- 与使用抽象的手工编写的代码相比,开销为零,
- 非常类似于C的机器模型,
- 一套非常灵活的抽象机制,
- 静态类型安全。
我看了他提到的那本书(实际上是“C ++的设计和进化”,我相信)但我还是不太确定。这两个术语也没有用Google搜索过。
答案 0 :(得分:7)
“机器模型”是指计算机在语言中表现出来的方式。因此,例如,C和C ++以大致相同的方式处理字节,内存位置,指针,整数类型。
“手工制作”这里意味着不使用C ++中提供的抽象的等效代码,并且在C或汇编(或C ++,只是排除抽象)中有效编写。这是一个“目标”,而不是“约束” - 在所有情况下,C ++并没有精确地实现它。
所以,作为一个例子,vector<int>
并不总能达到与使用malloc
和free
编写的类似可调整大小数组完全相同的性能,因为该代码可以(并且自然会)必要时使用realloc
调整存储大小。 realloc
不会经常为您节省时间,但是当它发生时,它会节省一大块。 vector
不能这样做,因为分配器接口没有任何等价于realloc
的东西,因此引入了一个小的开销。但是vector
几乎在所有时间都具有大致相同的性能,因此几乎满足零开销的目标。
另一个例子:在发布模式下使用一个不错的C ++编译器,与编写myvector_of_int[3]
相比,写my_int_pointer[3]
真的没有开销。可能不是很明显为什么访问局部变量的数据成员(存储在myvector_of_int
中的数据指针)与访问指针类型的局部变量(my_int_pointer
)相比没有开销,但它不需要不花费任何额外费用。
答案 1 :(得分:6)
通过“手工制作”代码,Stroustrup意味着抽象的手写实现;例如,手工制作的for
循环将是循环体的N个副本。 (有关非平凡的实现,请参阅Duff's Device。)
通过“机器模型”,Stroustrup意味着编译器对机器的看法。例如,C和C ++提供大致相同的字节视图,内存位置,内存访问顺序等等;相比之下,Fortran没有任何“字节”概念,而内存位置(或数组访问)与C / C ++视图完全不一致。