C++ 是否在堆栈上存储的函数中声明常量数组?
如果这是在函数中声明的,它会在堆栈上声明吗? (这让我好奇)C++ 是否在堆栈上存储的函数中声明常量数组?,c++,stack,C++,Stack,如果这是在函数中声明的,它会在堆栈上声明吗? (这让我好奇) 据我理解:是的。我被告知,您需要使用static限定常量,以便将它们放入数据段中,例如 void someFunction() { static const unsigned int actions[8] = { e1, e2, etc... }; } 如果不希望在堆栈上创建数组,请将其声明为静态数组。常量可
据我理解:是的。我被告知,您需要使用
static
限定常量,以便将它们放入数据段中,例如
void someFunction()
{
static const unsigned int actions[8] =
{
e1,
e2,
etc...
};
}
如果不希望在堆栈上创建数组,请将其声明为静态数组。常量可能允许编译器优化整个数组。但是如果要创建,它将在堆栈AFAIK上。是的,它们在堆栈上。您可以通过查看以下代码片段看到这一点:它必须将销毁消息打印5次
struct A { ~A(){ printf( "A destructed\n" ); } };
int main() {
{
const A anarray [5] = {A()} ;
}
printf( "inner scope closed\n");
}
是的,非静态变量总是在堆栈上创建。出于好奇——有人知道是否定义了这种行为吗?也就是说,如果标准中规定了常数的存储?谢谢,多多少少。标准根本没有提到“堆栈”。但它确实指出,变量默认为自动存储持续时间,也就是说,当它们超出范围时会被销毁。实现的方法是使用堆栈。因此,不,您不能保证它被分配到(或)堆栈上,但可以保证它的行为就像它不约束一样,不会影响它<代码>静态会给它静态存储时间。Const只是指定它不能被修改,它不会影响生存期。这是一个糟糕的例子。无论
anarray
的存储位置如何,程序退出时必须销毁所有元素。您应该添加作用域块和打印以确保:struct a{~a(){printf(“a destructed\n”);};int main(){{const A anarray[5];}printf(“main exiting\n”);}代码>@arolson:谢谢,你说得对。顺便说一句,你可以用反引号将代码放在注释(和其他文本)中。你不是在暗示它是静态的会占用堆栈空间吗?@Dynite,我的一位同事曾经提到过这一点。然而,我不确定,所以我将删除我帖子的这一部分。@Dynite,我说的是废话。可在此处找到正确的信息:
struct A { ~A(){ printf( "A destructed\n" ); } };
int main() {
{
const A anarray [5] = {A()} ;
}
printf( "inner scope closed\n");
}