【问题标题】:Hidden memory allocation? [duplicate]隐藏内存分配? [复制]
【发布时间】:2018-05-05 05:56:33
【问题描述】:

我知道在C99中你可以声明一个数组,它的大小是一个参数的值,像这样:

void foo(int size) {
  int array[size];
  // do stuff
}

据我了解,它是在调用函数时分配在堆栈上的。显然这不应该在 C++ 中工作。

最近我用 C++ 写了这样的东西:

void bar(vector<Thing> vec) {
  for (Thing t : vec) {
    int n = t.get_n();
    int array[n];
    // do stuff
  }
}

令人惊讶的是编译器(G++)没有抱怨,为什么? 那里有隐藏的内存分配吗?

【问题讨论】:

标签: c++ c arrays c++11 memory-management


【解决方案1】:

可变长度数组不是 C++ 标准的一部分。它是 G++ 提供的扩展。

如果您将使用-pedantic 标志编译它,那么编译器将发出警告。

【讨论】:

    【解决方案2】:

    Gcc 默认允许 C++ 中的可变长度数组(又名 VLA),即使它不符合标准。

    如果您通过传递(例如)-std=c++14 选项告诉它严格遵守标准,那么它将正确拒绝您的代码。

    【讨论】:

    • 我使用 cmake 构建了示例所在的项目,选项为 set (CMAKE_CXX_STANDARD 11)。这应该将-std=c++11 传递给编译器,但根据你所说的它没有传递,否则它会抱怨数组。
    • No: cmake.org/cmake/help/v3.1/prop_tgt/CXX_STANDARD.html => "对于某些编译器,这会导致在编译行中添加一个标志,例如 -std=gnu++11。" 因此它可能允许 GNU 扩展,默默地。愚蠢的是,没有证件。
    • @DBLouis 我猜(你应该检查一下),但它可能通过了 gnu++11 而不是允许 GNU 扩展的 c++11。
    • 没想到,谢谢
    • @DBLouis "在我的第二个示例中,数组是分配在堆上还是堆栈上?" - 该标准不包含诸如“堆”或“堆栈”之类的语言。它只谈论“自动存储”或“动态存储”。但即使将其解释为“堆”或“堆栈”,该标准也不承认 VLA 是有效的,所以从这个角度来看,它可能是任何东西,因为它们实际上并不存在。在 gcc 扩展方面;它可能在堆栈上。但是,您不在 C++ 范围内 - 任何事情都会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多