为什么在C 2011中将可变长度数组设为可选?


12

在C 1999中引入VLA时,我认为这是对该语言的一项伟大创新。但是,在了解到它在C 2011中成为可选功能后,我想知道是什么导致了它的状态更改,以及这是否意味着该功能实际上即将过时。如果是这样,是否有等效的自动大小动态数据管理概念被认为可以替代它?

我试图找到C 2011基本原理文档,但该文档似乎尚未发布。


缺乏收养?
Ryan Reich

@RyanReich:可能,但是为什么来自供应商的阻力?
jxh

Answers:


8

我听到过一些传说,从“它应该是可选的,因为某些小型编译器应该能够在不使用VLA的情况下符合C11”到“首先是一个错误”。不过,我对此还没有一个确定的答案。最终,我不相信任何人真的有一个理由(假设-并希望-有一个)从未被披露(就我以前的搜索而言)。


摘自《国际标准原理-编程语言-C 5.10(2003)》的第4章(第13页)。

通过根据接受的程序定义一致的实现,该标准为一致实现的一部分打开了广泛的扩展之门。通过定义一致的托管实现和一致的独立实现,标准认识到使用C编写诸如操作系统和基于ROM的应用程序以及更常规的托管应用程序之类的程序。除了这两个级别的方案之外,没有为C定义任何其他子集,因为C89委员会强烈认为过多的级别会削弱标准的有效性

强调我的。请注意,此决定违背了自己的理由。然而,另一件事成为可选的。现在,您将获得__STDC_NO_VLA__VLA支持。这是一个非常奇怪的决定。


@jxh甚至都没有看到。感谢您指出这一点,它已更改为更清晰,更不含糊的措词。在某些情况下,我已经将主题视为动机和目标的代名词,但我相信它仅在艺术场景中很常见。
Bernardo Sulzbach

仅具有两级方案的问题在于,有许多有用的功能和保证得到了广泛的支持,但并没有得到广泛的支持,并且可能使某些程序的编写效率比其他方式要高得多。缺乏任何测试此类功能可用性的标准方法,使得很多领域的实用程序(如果不是大多数)都需要利用标准中未包含的保证,并且很难确定确定性是否特别……
supercat

...该程序将与任何特定实现一起使用。定义各种各样的可选功能并保证哪些实现可以支持或拒绝(通过拒绝编译),将可能有一种很好的简单标准方法来测试正确指定其要求的程序是否可以在平台上正常工作:try建立它。如果它建立,它将起作用。如果没有,显然不会。增加可以保证成功构建将保证成功运行的程序的比例……
supercat 2016年

...似乎比仅仅增加能够处理很少部分程序的编译器的价值更大,这些程序无法从标准所要求的功能和保证中受益。
超级猫

4

据我从公共委员会的文件(尤其是N1395)中可以确定的,使VLA(以及复杂的算术和线程)成为可选项的主要原因之一是可以为小型嵌入式处理器创建符合标准的C编译器。

趋势是,针对嵌入式系统的编译器供应商一直遵循C90标准,因为引入了客户不需要的那些大功能。


在许多情况下,“要求放弃”。当您查看启用这些功能时的RAM占用空间变化时,很明显为什么有些人不想要它们。它会使处理器的成本增加一倍,这可能是系统中最昂贵的部分。
Ⴖuі'16

1
@JerryCoffin:是的,但是仅在数组上实际使用sizeof()时才生成代码。编译器需要跟踪信息,以便可以生成正确的代码,但是该信息无需嵌入到VLA的内存中表示中。
jxh 2016年

2
@jxh:按照最初的设想,独立和托管的实现使用相同的核心语言。差异仅限于图书馆。就VLA而言,语言本身存在差异(至少有些供应商认为)并不真正适用于较小的嵌入式系统。就嵌入大小而言:不,它绝对不是绝对必要的,但是可能是最简单的方法(例如,为该大小保留几个字节的存储可能会避免很多字节的代码来计算它)。
杰里·科芬

1
@supercat:我可以看到选择C库功能的逻辑,但是将语言功能设置为“可选”似乎对试图编写多平台C代码的人毫无帮助。它使用到是C组的近编程是很容易重新以不同的编译器和不同的硬件平台上的金属系统中的不二之选。现在,它不是那么明显。
jxh

1
@supercat:轰炸堆栈并不是VLA特有的。异常大的自动对象或不受约束的函数调用堆栈将具有类似的问题。如果该标准为这些情况定义了一种检测故障的方法,那么它也可能适用于VLA。就可选而言,这使得在新项目中使用新C代码中使用新C功能的争论变得更加困难,而新项目则需要使用来自多个供应商的编译器在多个平台上工作。
jxh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.