问题标签 [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.

0 投票
13 回答
179277 浏览

c++ - 为什么可变长度数组不是 C++ 标准的一部分?

在过去的几年里,我没有经常使用 C。当我今天阅读这个问题时,我遇到了一些我不熟悉的 C 语法。

显然在C99中以下语法是有效的:

这似乎是一个非常有用的功能。是否曾经讨论过将其添加到 C++ 标准中,如果有,为什么将其省略?

一些潜在的原因:

  • 编译器供应商难以实现
  • 与标准的其他部分不兼容
  • 可以使用其他 C++ 结构来模拟功能

C++ 标准规定数组大小必须是常量表达式 (8.3.4.1)。

是的,我当然意识到在玩具示例中可以使用std::vector<int> values(m);,但这会从堆而不是堆栈分配内存。如果我想要一个多维数组,例如:

vector版本变得非常笨拙:

切片、行和列也可能分布在整个内存中。

从讨论comp.std.c++来看,很明显这个问题是相当有争议的,争论双方都有一些非常重量级的名字。当然,astd::vector总是更好的解决方案并不明显。

0 投票
4 回答
16719 浏览

c - 使用可变长度数组是否有任何开销?

使用可变长度数组是否有一些开销?数组的大小可以在运行时通过命令行参数传递吗?与自动和动态分配数组相比,为什么要引入它?

0 投票
9 回答
238091 浏览

c - C 编译错误:“可变大小的对象可能未初始化”

为什么我会收到错误“可变大小的对象可能未初始化”的错误代码?

0 投票
2 回答
1365 浏览

c++ - C ++中的可变长度数组开销?

看这个问题:为什么 C/C++ 编译器需要在编译时知道数组的大小?我想到编译器实现者现在应该有一些时间来涉足(这是 10 年前的 C99 标准的一部分)并提供有效的实现。

然而,它似乎(从答案)仍然被认为是昂贵的。

这不知何故让我感到惊讶。

当然,我知道静态偏移在性能方面比动态偏移要好得多,并且与一个建议不同,我实际上不会让编译器执行数组的堆分配,因为这可能会花费更多[这没有被测量了;)]

但我仍然对假定的成本感到惊讶:

  • 据我所知,如果函数中没有 VLA,那么就不会有任何成本。
  • 如果只有一个 VLA,那么可以将它放在所有变量之前或之后,因此可以获得大部分堆栈帧的静态偏移量(或者在我看来,但我并不精通堆栈管理)

当然,多个 VLA 的问题出现了,我想知道是否有一个专用的 VLA 堆栈会起作用。这意味着 VLA 将由一个计数和一个指针(因此具有已知大小)表示,并且在辅助堆栈中占用的实际内存仅用于此目的(因此实际上也是一个堆栈)。

[改写]

VLA 如何在 gcc / VC++ 中实现?

成本真的那么可观吗?

[结束改写]

在我看来vector,即使使用当前的实现,它也只能比使用 a 更好,因为您不会产生动态分配的成本(以不可调整大小为代价)。

编辑:

这里有部分回应,但是将 VLA 与传统阵列进行比较似乎不公平。如果我们事先知道尺寸,那么我们就不需要 VLA。在同一个问题中,AndreyT 给出了一些关于实现的指示,但它并不像我想要的那样精确。

0 投票
4 回答
4102 浏览

sql - 数据库中的可变长度字段

有没有办法在 SQL 或任何其他数据库引擎中将可变长度列表存储到数据库中?

这里的列表意味着没有。数组中的元素。例如,一个数字数组。

但是在我的实际应用程序中,要存储的东西是对象,因此不能简单地存储为逗号分隔的列表。

0 投票
5 回答
114625 浏览

java - 如何在不知道数组大小的情况下初始化数组?

我有一种情况,我必须在输入数组上应用一个标准,然后将另一个数组作为输出返回,该输出将根据过滤标准具有更小的大小。

现在的问题是我不知道过滤结果的大小,所以我不能用特定的值初始化数组。而且我不希望它太大,因为我使用的是 array.length;稍后的。

一种方法是首先循环原始输入数组并设置一个计数器,然后使用该计数器长度进行另一个循环并初始化并填充此数组[]。但是有没有办法只在一个循环中完成这项工作?

0 投票
2 回答
1284 浏览

python - 在 Numpy C 扩展中返回可变长度数组?

在此站点的大力帮助下,我之前做了一些 Numpy C 扩展,但据我所知,返回的参数都是固定长度的。

有没有办法让 Numpy C 扩展返回一个可变长度的 numpy 数组?

0 投票
5 回答
20468 浏览

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”:未知大小

0 投票
2 回答
382 浏览

c - 桌面操作系统上的 C 编译器使用多少内存页来检测堆栈溢出?

这个问题与C99 中的可变长度数组有关但不同于这个问题

答案指出,在堆栈中分配可变长度数组(或仅是固定大小的大数组)的一个危险是分配可能会默默地失败,而不是调用malloc,它明确告诉调用者分配是否成功。

现代非嵌入式编译平台使用无效内存区域来检测一些堆栈溢出,无需额外费用(检查只是 MMU 已经免费进行的检查)。这并不能 100% 避免上述问题,因为非常大的本地数组可能会导致堆栈指针跳过无效区域。

有谁知道通常为此检测分配多少页?我猜它至少是 4KiB,但可能更多。这是编译器还是操作系统做出的选择,无论哪种情况,有没有办法改变它?

0 投票
4 回答
10355 浏览

c - 没有malloc的C中的动态数组?

我一直想知道我怎么能摆脱这个:

char 数组copy无论如何都会被分配,程序运行良好,打印出原始和副本。Valgrind 没有抱怨任何事情。

我认为如果没有 malloc,动态数组在 C 中是不可能的。我错了吗?