为什么C不提供像C ++和Java这样的语法透明引用?

Dan*_*Dan 4 c language-lawyer

我试图了解有关在C中按值传递的历史原因的更多信息。有一篇Stack Overflow帖子涉及与C ++有关的该主题。但是,我对C感兴趣。我回想起做出此决定时,可能会选择做我们现在所说的“通过引用传递”。但是,这不是做出的选择。是否存在优化,多线程等问题?

我尝试使用Google进行搜索,但没有成功。通过值传递为变量在引擎盖下未更改提供了一些保证。这是唯一原因吗?我以为当时“复制胖对象”的概念已不是什么大问题,而按值传递会产生少量开销。因此,这可能被认为是正确的选择。除了这个决定,还有更多的决定吗?

Eri*_*hil 14

用Kernighan和Ritchie在1978年的C编程语言中的第1.8节“参数—按值调用”,第24页:

价值召唤是一种资产,但不是负债。它通常会导致程序更紧凑,外部变量更少,因为在调用的例程中可以将参数视为方便地初始化的局部变量。例如,…

…如有必要,可以安排一个函数在调用例程中修改变量。调用者必须提供要设置的变量的地址(技术上是指向变量的指针),…


JL2*_*210 7

  1. 每次使用参数时,按值传递通常比按引用传递和取消引用指针要快。由于结构不是早期C语言的一部分,后来又需要作为指针传递,因此这不是一个大问题。

  2. 许多旧的编译器无法优化取消引用,或者无法优化取消引用,并且每次要使用参数时都对引用进行引用会非常缓慢。

  3. 老式计算机需要微优化的代码才能更快地运行,因为处理器本身并不很快。

  4. 它使程序员可以自由选择是否要使用指针或值来访问数据。

所有这些加在一起可能等于C为什么使用值传递。

  • @P__J__:按值传递参数时,结构不是性能问题,因为最初不允许将结构作为参数传递。根据Kernighan和Ritchie的* C编程语言*,1978年,第209页,第14.1节“结构和联合”,“其他操作,例如为其分配或传递参数或将其作为参数传递,将产生错误消息。” (4认同)