动态数组 (GCC) 和指针之间的区别

Sim*_*onC 2 c++ dynamic-memory-allocation

考虑以下代码片段:

void foo() {
    int arraySize = getMyComputedValue();
    int dynamicArray[arraySize];

    fillDynamicArray(&dynamicArray[0]);

    for (int i = 0; i < arraySize; i++) {
        // Do something with data
    }
}

void bar() {
    int arraySize = getMyComputedValue();
    int* dynamicArray = new int[arraySize];

    fillDynamicArray(dynamicArray);

    for (int i = 0; i < arraySize; i++) {
        // Do something with data
    }

    delete[] dynamicArray;
    dynamicArray = NULL;
}
Run Code Online (Sandbox Code Playgroud)

两者都在内存中创建一个包含整数的不同长度的动态区域。我发现第一个示例foo()(至少在我的构建环境中)只能使用 GCC 进行编译。

两者之间的确切区别是什么?第一个示例仅仅是一个 GNU 扩展,它是底部示例的简写,允许编译器确定取消分配的正确时间是什么时候?或者第一个例子是否完全按照代码说的那样在堆栈上分配内存?

cma*_*ter 5

  1. foo() allocates the memory on the stack, bar() allocates it on the heap. This has two effects: Lifetime (stack memory is automatically reclaimed at function exit), and max array size (stack space is rather limited to a range of a few MB at most, heap space is only limited by available RAM).

  2. foo()是有效的 C99,但不是任何标准的 C++。C++ 根本就没有接受 VLA。这是您需要意识到 C 和 C++ 是两种截然不同的语言的核心点。有非 C++ 的有效 C 程序(如foo()),也有非 C 的有效 C++ 程序(如bar())。C++ 不再是它开始时的严格超集。

然而,编译器可以选择实现语言的超集作为扩展。g++这样做,但是如果您使用严格的 C++ 标准合规性 ( g++ -std=c++14 -pedantic -Werror) 进行编译,甚至g++会在foo().