【问题标题】:Interview with Bjarne Stroustrup - abstraction and hand-crafted code采访 Bjarne Stroustrup - 抽象和手工代码
【发布时间】:2013-11-22 00:16:31
【问题描述】:

我已经阅读了interview 与 Bjarne Stroustrup 关于 C++ 及其设计的文章。我对他在那里使用的术语感到困惑,所以我希望能澄清一些这样的时刻。

我在“C++ 的设计与实现”一书和我的两篇编程语言历史会议论文中记录了我的设计目标和设计限制,但简而言之,我的目标是

  • 与使用抽象的手工代码相比,零开销,
  • 一种与 C 非常相似的机器模型,
  • 一套极其灵活的抽象机制,以及
  • 静态类型安全。
  1. 在这种情况下,“手工编写的代码”是什么意思?.. Stroustrup 意味着一些手工制作的工具,用于抽象概念程序员 可以创造吗?
  2. 在这种情况下,“机器型号”是什么意思?一种语言与硬件交互的方式?

我看了他提到的那本书(我相信这实际上是“C++ 的设计和演变”),但我仍然不确定。这两个术语也不是很好用谷歌搜索。

【问题讨论】:

  • 可能更适合 stackExchange 程序员站点,溢出特别涉及 code 相关问题。好问题,但希望仍然可以在这里得到回答。
  • @Gmercer015 哎呀。好的,抱歉,我不知道。
  • @remyabel 我读过这个。我确实明白iteslf所说的“手工制作”的意思,我不明白的是这里的手工制作。

标签: c++


【解决方案1】:

“机器模型”是指计算机在语言中表现自己的方式。因此,例如,C 和 C++ 以或多或少相同的方式处理字节、内存位置、指针、整数类型。

这里的“手工制作”是指不使用 C++ 中提供的抽象的等效代码,而是用 C 或汇编(或 C++,只是不包括该抽象)高效编写的。这是一个“目标”,而不是“约束”——C++ 并非在所有情况下都能准确地实现它。

举个例子,vector<int> 并不总是能获得与使用mallocfree 编写的类似可调整大小数组完全相同的性能,因为该代码可以(并且自然会)使用realloc 来调整大小必要时存放。 realloc 不会经常为您节省任何时间,但当它这样做时,它会节省一大块。 vector 不能这样做,因为分配器接口没有与 realloc 等效的东西,因此引入了一个小的开销。但是vector 几乎在所有时间都具有大致相同的性能,因此几乎可以实现零开销的目标。

再举一个例子:在发布模式下使用一个不错的 C++ 编译器,与编写 my_int_pointer[3] 相比,编写 myvector_of_int[3] 确实具有零开销。与访问指针类型的局部变量 (my_int_pointer) 相比,为什么访问局部变量的数据成员(存储在 myvector_of_int 中的数据指针)没有开销,这可能不是很明显,但它不需要任何成本额外的。

【讨论】:

  • 所以你是说 Bjarne 的目的是使用 c++ 提供的抽象?
  • 不,我是说如果你使用抽象,他的目标是零开销。与“手工制作”代码相比,开销与使用抽象的代码执行相同的操作,但在 C 中明确显示,而不是让 C++ 编译器/库为您完成。
  • “机器模型”会包括例如 POSIX 多线程实现吗?就像,C 和 C++ 中的 fork() 都应该以相同的方式进行。
  • @kazarey:是的,尽管在最新版本(2011 年)之前多线程不是这两个标准的一部分,而fork() 仍然不是这两个标准的一部分。任何多线程模型中最重要的部分是执行线程和数据竞争(以及如何防止)的定义,这在两者中基本相同。用于启动新线程的函数名称等细节不属于“机器模型”。
【解决方案2】:

对于“手工制作”的代码,Stroustrup 是指抽象的手写实现;例如,手工制作的for 循环将是循环体的 N 个副本。 (有关重要​​的实现,请参阅Duff's Device。)

对于“机器模型”,Stroustrup 是指编译器对机器的看法。例如,C 和 C++ 提供大致等效的字节、内存位置、内存访问顺序等视图;相比之下,Fortran 没有任何“字节”的概念,并且内存位置(或数组访问,就此而言)与 C/C++ 视图完全不对应。

【讨论】:

  • “一个手工制作的 for 循环将是循环体的 N 个副本”——或者取决于你如何看待它,手工制作的 for 循环将涉及一个 if 和一个goto 在 C 或 C++ 中,或在程序集中的条件分支。这是一个你认为抽象的重要属性是什么的问题,这可能因上下文而异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
相关资源
最近更新 更多