c++ 中是否有"implicit" 声明的数组分配?
Is there "implicit" allocation of arrays in c++ by declaration?
我想为数组分配内存,在 C++ 中,数组的大小直到 运行 时间才知道。
我经常使用常量(编译时)分配;但希望使用 运行 时间分配在 "always" 方面取得进展。我实际上通过声明摆脱了 "implicit" 分配。 (我对发生的事情的术语。)我想知道它到底叫什么,为什么它有效。我认为讲述这个故事的片段:
std::ifstream infile;
infile.open("input_info");
if (infile.is_open()) {
infile >> number;
std::cout << number << " " << std::endl;
}
std::pair<int, int> incident_subdomains[number];
int sd[number][2];
也就是说;读入所需数组的大小后,我声明数组 incident_subdomains 和 sd.然后我在后续代码中使用这些数组;例如,从 "input_info" 中读取信息以填充数组。该程序已编译并运行。这是C++的新特性吗?我喜欢。 (我用过"new",和"vector"。)我用的c++编译器是g++ 7.3.0.
And I wonder what it is really called
可变长度数组。
Is this a new feature of C++?
没有。这不是 standard C++ 的特性。在 C++ 中,非动态分配数组的大小必须是编译时常量。
and why it works
大概是因为它是你的编译器提供的语言扩展。它是 C99 中的一个特性(在 C11 中是可选的),因此一些也兼容 C99 的 C++ 编译器(C++ 编译器也是 C 编译器是很常见的)可能具有这样的特性。这就是 GCC 对您的程序的评价:
warning: ISO C++ forbids variable length array 'incident_subdomains' [-Wvla]
当 Clang 说:
warning: variable length arrays are a C99 feature [-Wvla-extension]
在标准 C++ 中创建动态大小数组的最简单方法是使用 std::vector
.
感谢大家提供的信息丰富的答案。我确实使用 "vector";除了一个变量。虽然我可以设置和使用成对的向量,但我没有(弄清楚如何)将相关指针传递给函数。所以,我使用了 "new",效果很好。
我无法想象不使用我的主要(网格相关)阵列的 运行 时间分配。
我经历了几个版本的代码。
其中一个,我尝试使用 "implicit" 分配——只是在 运行 时声明一个数组大小;尽管这显然不是标准,正如你们都指出的那样。让它工作是一个惊喜。
顺便说一句:我认为这是进步,因为它更容易。但我尽量遵循标准。
蒂姆
我想为数组分配内存,在 C++ 中,数组的大小直到 运行 时间才知道。
我经常使用常量(编译时)分配;但希望使用 运行 时间分配在 "always" 方面取得进展。我实际上通过声明摆脱了 "implicit" 分配。 (我对发生的事情的术语。)我想知道它到底叫什么,为什么它有效。我认为讲述这个故事的片段:
std::ifstream infile;
infile.open("input_info");
if (infile.is_open()) {
infile >> number;
std::cout << number << " " << std::endl;
}
std::pair<int, int> incident_subdomains[number];
int sd[number][2];
也就是说;读入所需数组的大小后,我声明数组 incident_subdomains 和 sd.然后我在后续代码中使用这些数组;例如,从 "input_info" 中读取信息以填充数组。该程序已编译并运行。这是C++的新特性吗?我喜欢。 (我用过"new",和"vector"。)我用的c++编译器是g++ 7.3.0.
And I wonder what it is really called
可变长度数组。
Is this a new feature of C++?
没有。这不是 standard C++ 的特性。在 C++ 中,非动态分配数组的大小必须是编译时常量。
and why it works
大概是因为它是你的编译器提供的语言扩展。它是 C99 中的一个特性(在 C11 中是可选的),因此一些也兼容 C99 的 C++ 编译器(C++ 编译器也是 C 编译器是很常见的)可能具有这样的特性。这就是 GCC 对您的程序的评价:
warning: ISO C++ forbids variable length array 'incident_subdomains' [-Wvla]
当 Clang 说:
warning: variable length arrays are a C99 feature [-Wvla-extension]
在标准 C++ 中创建动态大小数组的最简单方法是使用 std::vector
.
感谢大家提供的信息丰富的答案。我确实使用 "vector";除了一个变量。虽然我可以设置和使用成对的向量,但我没有(弄清楚如何)将相关指针传递给函数。所以,我使用了 "new",效果很好。
我无法想象不使用我的主要(网格相关)阵列的 运行 时间分配。 我经历了几个版本的代码。
其中一个,我尝试使用 "implicit" 分配——只是在 运行 时声明一个数组大小;尽管这显然不是标准,正如你们都指出的那样。让它工作是一个惊喜。
顺便说一句:我认为这是进步,因为它更容易。但我尽量遵循标准。
蒂姆