【问题标题】:C++ static array like dynamic array [duplicate]C ++静态数组,如动态数组[重复]
【发布时间】:2017-12-25 12:30:32
【问题描述】:

似乎记得C++中的静态数组只能从const表达式初始化,但如果你写:

#include <iostream>

int main() {
  int n;
  std::cin >> n;
  int a[n];
  std::cout << sizeof(a);

  return 0;
}

此程序成功编译 (gcc C++17) 并打印 n * sizeof(int)。 但是为什么会这样呢?

【问题讨论】:

  • 为什么不使用std::vector
  • Gcc(不幸的是)默认情况下允许 VLA 作为扩展。使用-std=c++17 和/或-Wvla -Werror 编译,它不会。
  • 但是 VLA 是如何工作的呢?有没有预留栈?
  • 使用-pedantic编译。
  • 编译器可以解决问题。例如,它将在堆中分配内存空间,并在每个退出点将其删除(例如函数中的所有返回语句)。

标签: c++ arrays static


【解决方案1】:

Variable-length arrays 不是标准的一部分。它们可以作为编译器扩展出现,GCC 就是这种情况。编译时您可能会收到以下警告:

警告:ISO C++ 禁止变长数组 'a' [-Wvla]

当应用于数组时,sizeof 运算符返回整个数组的大小,即基础类型的大小乘以元素的数量。参考说明,强调我的:

每个 VLA 实例的大小在其生命周期内不会改变,但 在另一次通过相同的代码时,它可能被分配一个 大小不同

标题为 6.19 Arrays of Variable Length 的官方 GCC 文档指出:

这些数组的声明方式与任何其他自动数组一样,但带有 不是常量表达式的长度。存储分配在 块作用域时的声明点和释放点 包含声明退出。

也就是说,与原始(C 风格)数组相比,更喜欢 std::vectorstd::array

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2018-07-29
    • 1970-01-01
    • 2014-04-12
    • 2011-02-09
    • 2021-02-08
    • 2013-07-20
    • 2012-05-09
    • 2012-11-15
    相关资源
    最近更新 更多