用于定义数组大小的运行时常量
run-time const to define array size
可能重复:
C/C++:运行时的数组大小是否允许动态分配?
在下面的列表中,buf
的大小显然是由运行时常数j
决定的。编译器如何生成代码来分配堆栈上的存储(在编译时不知道j
的值)?
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
srandom(time(NULL));
int i = random();
cout<< "random number: "<<i<<endl;
if(i%2==0)
i=2;
else
i=1;
const int j=i;
char buf[j];
std::cout<<"size of buf array: "<<sizeof(buf)<<endl;
return 0;
}
我假设您使用的是gcc,因此使用的是VLA扩展。这不是标准C++,它是从C++0x(1x)中删除的。
理由是它并没有那么有用,而且由于类型系统更强,C++实现将比C中的实现复杂得多。
实际上,如果您在堆栈中分配未知大小的数组,那么您同时也在编写可能会破坏堆栈的危险代码。如果你知道大小,那么它就不是问题,否则就动态分配它。当然有非常有效的用例,这是一个"很好的拥有"功能,但他们最终决定不这样做。
这是关于这个问题的一个很好的总结。
符合要求的C++编译器不会接受您的代码。尽管j
是一个const
,但它并不是一个常数表达式。
gcc在C++代码中接受这一点作为扩展(根据语言标准,它只允许在C99代码中使用)。基本上,它在堆栈上为buf
分配空间。它(通常)通过从当前堆栈指针中减去一些量来实现这一点。从生成的代码的角度来看,在一台典型的机器上处理非常量代码是非常琐碎的。
编译器只需要增加堆栈大小,并将buf变量指向堆栈上新创建的空间。给定运行时的大小,没有理由不能动态地执行此操作。(尽管从编程的角度来看,这样做可能不明智。)
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在声明中合并两个常量"std::set"(不是在运行时)
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- 使用运行时常量实例化的函数模板
- 常量操作是否在运行时计算
- 如何在模板中定义浮点常量.避免在运行时强制转换
- C++ 运行时计算的常量变量
- 如何在运行时在通过 Cython 导入的 c++ 头文件中设置常量
- 用于定义数组大小的运行时常量
- 在运行时定义的C++全局外部常量可用于多个源文件
- 编译-vs运行时常量变量赋值和C++中vlas的分配
- 编译时常量与运行时常量
- 扩展std::chrono功能以处理运行时(非编译时)常量周期
- 在编译时或运行时将常量字符 * 映射到鸭型 T