问题标签 [variable-length-array]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为什么可变长度数组不是 C++ 标准的一部分?
在过去的几年里,我没有经常使用 C。当我今天阅读这个问题时,我遇到了一些我不熟悉的 C 语法。
显然在C99中以下语法是有效的:
这似乎是一个非常有用的功能。是否曾经讨论过将其添加到 C++ 标准中,如果有,为什么将其省略?
一些潜在的原因:
- 编译器供应商难以实现
- 与标准的其他部分不兼容
- 可以使用其他 C++ 结构来模拟功能
C++ 标准规定数组大小必须是常量表达式 (8.3.4.1)。
是的,我当然意识到在玩具示例中可以使用std::vector<int> values(m);
,但这会从堆而不是堆栈分配内存。如果我想要一个多维数组,例如:
vector
版本变得非常笨拙:
切片、行和列也可能分布在整个内存中。
从讨论comp.std.c++
来看,很明显这个问题是相当有争议的,争论双方都有一些非常重量级的名字。当然,astd::vector
总是更好的解决方案并不明显。
c - 使用可变长度数组是否有任何开销?
使用可变长度数组是否有一些开销?数组的大小可以在运行时通过命令行参数传递吗?与自动和动态分配数组相比,为什么要引入它?
c - C 编译错误:“可变大小的对象可能未初始化”
为什么我会收到错误“可变大小的对象可能未初始化”的错误代码?
c++ - C ++中的可变长度数组开销?
看这个问题:为什么 C/C++ 编译器需要在编译时知道数组的大小?我想到编译器实现者现在应该有一些时间来涉足(这是 10 年前的 C99 标准的一部分)并提供有效的实现。
然而,它似乎(从答案)仍然被认为是昂贵的。
这不知何故让我感到惊讶。
当然,我知道静态偏移在性能方面比动态偏移要好得多,并且与一个建议不同,我实际上不会让编译器执行数组的堆分配,因为这可能会花费更多[这没有被测量了;)]
但我仍然对假定的成本感到惊讶:
- 据我所知,如果函数中没有 VLA,那么就不会有任何成本。
- 如果只有一个 VLA,那么可以将它放在所有变量之前或之后,因此可以获得大部分堆栈帧的静态偏移量(或者在我看来,但我并不精通堆栈管理)
当然,多个 VLA 的问题出现了,我想知道是否有一个专用的 VLA 堆栈会起作用。这意味着 VLA 将由一个计数和一个指针(因此具有已知大小)表示,并且在辅助堆栈中占用的实际内存仅用于此目的(因此实际上也是一个堆栈)。
[改写]
VLA 如何在 gcc / VC++ 中实现?
成本真的那么可观吗?
[结束改写]
在我看来vector
,即使使用当前的实现,它也只能比使用 a 更好,因为您不会产生动态分配的成本(以不可调整大小为代价)。
编辑:
这里有部分回应,但是将 VLA 与传统阵列进行比较似乎不公平。如果我们事先知道尺寸,那么我们就不需要 VLA。在同一个问题中,AndreyT 给出了一些关于实现的指示,但它并不像我想要的那样精确。
sql - 数据库中的可变长度字段
有没有办法在 SQL 或任何其他数据库引擎中将可变长度列表存储到数据库中?
这里的列表意味着没有。数组中的元素。例如,一个数字数组。
但是在我的实际应用程序中,要存储的东西是对象,因此不能简单地存储为逗号分隔的列表。
java - 如何在不知道数组大小的情况下初始化数组?
我有一种情况,我必须在输入数组上应用一个标准,然后将另一个数组作为输出返回,该输出将根据过滤标准具有更小的大小。
现在的问题是我不知道过滤结果的大小,所以我不能用特定的值初始化数组。而且我不希望它太大,因为我使用的是 array.length;稍后的。
一种方法是首先循环原始输入数组并设置一个计数器,然后使用该计数器长度进行另一个循环并初始化并填充此数组[]。但是有没有办法只在一个循环中完成这项工作?
python - 在 Numpy C 扩展中返回可变长度数组?
在此站点的大力帮助下,我之前做了一些 Numpy C 扩展,但据我所知,返回的参数都是固定长度的。
有没有办法让 Numpy C 扩展返回一个可变长度的 numpy 数组?
c - 在 MS Visual C++ 中启用 VLA(可变长度数组)?
如何启用 VLA、C99 中定义的可变长度数组、MS Visual C++ 或根本不可能的使用?
是的,我知道 C++ 标准基于 C89,并且 VLA 在 C89 标准中不可用,因此在 C++ 中不可用,但 MSVC++ 也应该是 C 编译器,可以使用 / TC 编译器参数 ( Compile as C Code (/TC)
)。但是这样做似乎并没有启用 VLA,并且编译过程在构建为 C++ ( Compile as C++ Code (/TP)
) 时会失败并出现相同的错误。也许 MSVC++ C 编译器只兼容 C89,或者我遗漏了一些东西(一些特殊的构造或编译指示/定义)?
代码示例:
编译错误:
错误 C2057:预期的常量表达式
错误 C2466:无法分配常量大小 0 的数组
错误 C2133:“pc”:未知大小
c - 桌面操作系统上的 C 编译器使用多少内存页来检测堆栈溢出?
这个问题与C99 中的可变长度数组有关但不同于这个问题。
答案指出,在堆栈中分配可变长度数组(或仅是固定大小的大数组)的一个危险是分配可能会默默地失败,而不是调用malloc
,它明确告诉调用者分配是否成功。
现代非嵌入式编译平台使用无效内存区域来检测一些堆栈溢出,无需额外费用(检查只是 MMU 已经免费进行的检查)。这并不能 100% 避免上述问题,因为非常大的本地数组可能会导致堆栈指针跳过无效区域。
有谁知道通常为此检测分配多少页?我猜它至少是 4KiB,但可能更多。这是编译器还是操作系统做出的选择,无论哪种情况,有没有办法改变它?
c - 没有malloc的C中的动态数组?
我一直想知道我怎么能摆脱这个:
char 数组copy
无论如何都会被分配,程序运行良好,打印出原始和副本。Valgrind 没有抱怨任何事情。
我认为如果没有 malloc,动态数组在 C 中是不可能的。我错了吗?