c++ 是否允许运行时数组大小不进行动态分配?[duplicate]

kx5bkwkv  于 2023-02-10  发布在  其他
关注(0)|答案(8)|浏览(113)
    • 此问题在此处已有答案**:

Why aren't variable-length arrays part of the C++ standard?(10个答案)
3天前关闭。
我已经使用C++几年了,今天我看到了一些代码,但这怎么可能是完全合法的呢?

int main(int argc, char **argv)
{
    size_t size;
    cin >> size;
    int array[size];
    for(size_t i = 0; i < size; i++)
    {
        array[i] = i;
        cout << i << endl;
    }

    return 0;
}

在GCC下编制。
如果没有newmalloc,如何在运行时确定大小?
只是为了再次检查,我已经谷歌了一些和所有类似的代码,以我声称给存储大小错误。
甚至Deitel的《C++如何编程》第261页也在《常见编程错误4.5:
只能使用常量声明自动数组和静态数组的大小。
启发我。

lyr7nygr

lyr7nygr1#

这在C99中有效。
C99标准支持堆栈上的可变大小数组。可能您的编译器也选择支持这种结构。
注意,这与mallocnew不同。gcc在堆栈上分配数组,就像int array[100]一样,只需要调整堆栈指针。没有进行堆分配。这与_alloca非常相似。

gpfsuwkq

gpfsuwkq2#

这被称为VLA(可变长度数组),它是c99中的标准,但是gcc允许它在c++代码中作为扩展,如果你想让它拒绝代码,尝试使用-std=standard-ansi-pedantic选项。

pb3s4cty

pb3s4cty3#

它只在C99中是valid。下次您可以尝试在reliable compiler中检查代码。

0md85ypi

0md85ypi4#

它是有效的C99,它不是有效的C++。这是这两种语言之间不少的区别之一。

uwopmtnx

uwopmtnx5#

此代码在GNU GCC编译器中运行。

#include<bits/stdc++.h>

int main(int argc, char **argv)

{
    size_t size;

   std:: cin >> size;

    int array[size];

    for(size_t i = 0; i < size; i++)

{

array[i] = i;

        std:: cout << i;

 }

    return 0;
}
7jmck4yq

7jmck4yq6#

如果你使用的是Dev-Cpp编译器,你可以动态地给数组给予大小,我试过了,没有错误,但是在visual c和visual studio编译器上,这是不可能的。我认为原因是dev-c给未初始化的int赋一个正数,当我们给它一个数字时,它会被给定的数字替换。但是也许其他编译器给未初始化的变量赋null。

h4cxqtbf

h4cxqtbf7#

我最近遇到了一个需要堆栈分配数组的场景(它是v8的一个 Package 器,在每个方法调用上都需要一个args数组)。
一个std::vector将执行堆内存分配,其性能是不可接受的。
下面是我的解决方案,使用模板来分配数组的情况下:

template<size_t Argc>
static void call(...) {
    v8::Local<v8::Value> v8Args[Argc];

    // use v8Args
    ...
}

template<typename It>
static void callV8Function(size_t argc, It argvBegin, It argvEnd,) {
    // C++ don't have dynamic stack allocation (like C99 does)
    // try to avoid heap-allocation...
    if (argc <= 4) {
        return callV8FunctionOnStack<4>(...);
    } else if (argc <= 8) {
        return callV8FunctionOnStack<8>(...);
    } else if (argc <= 16) {
        return callV8FunctionOnStack<16>(...);
    } else if (argc <= 32) {
        return callV8FunctionOnStack< 32>(...);
    } else {
        std::vector<v8::Local<v8::Value>> v8Args(argc);
        // fallback to vector
   }
}

(And当然,我可以使用大小为32的数组,但这不是很优雅。)

mbjcgjjk

mbjcgjjk8#

可变长度数组(Variable Length Arrays,VLA)在C++14标准中得到支持,该标准最近被接受,正在等待发布。

相关问题