【发布时间】:2016-01-22 08:34:50
【问题描述】:
[这个问题的灵感来自最近在其他地方的讨论,我将立即提供答案。]
我想知道数组“衰减”到指针的奇怪 C 现象,例如当用作函数参数时。这似乎太不安全了。明确地传递长度也是不方便的。而且我可以很好地传递另一种类型的聚合——结构——值;结构不会衰减。
这个设计决策背后的基本原理是什么?它是如何与语言相结合的?为什么结构有区别?
【问题讨论】:
-
它节省了大量(不必要的)复制。 C 是为速度而不是安全而设计的。
-
因为在大多数情况下复制作为参数传递的数组会很昂贵且不必要。此外,C 最初不支持将结构体作为函数参数传递,因此没有明确的设计选择来使数组与结构体不同。
-
@Kninnug 当然,如果需要,仍然可以传递地址,就像其他任何事情一样。
-
这种设计选择有特定的原因,所以我不会说它会因为“主要基于意见”而关闭。
-
如果它采用另一种方式,一些开发人员现在会发布“我将我的 50MB 视频缓冲区传递给 someFunc() 进行处理,它被复制进来,然后我处理它,因为调用者需要结果而不是原始,它必须在返回中复制回来。我 90% 的 CPU 周期都浪费在无意义地复制大型视频缓冲区上。多么愚蠢的设计决定!'