【问题标题】:Are const arrays declared within a function stored on the stack?函数中声明的 const 数组是否存储在堆栈中?
【发布时间】:2010-11-22 23:22:40
【问题描述】:

如果这是在函数中声明的,它会在堆栈上声明吗? (它是 const 让我感到奇怪)

void someFunction()
{

     const unsigned int actions[8] = 
     {       e1,
             e2,
             etc...
     };
 }

【问题讨论】:

    标签: c++ stack


    【解决方案1】:

    是的,它们在堆栈上。您可以通过查看这段代码 sn-p 看到这一点:它将必须打印 5 次销毁消息。

    struct A { ~A(){ printf( "A destructed\n" ); } };
    
    int main() {
        {
          const A anarray  [5] = {A()} ;
        }
        printf( "inner scope closed\n");
    }
    

    【讨论】:

    • 出于好奇——有谁知道这种行为是否已定义?也就是说,如果标准中规定了常量的存储?谢谢。
    • 或多或少。该标准根本没有谈论“堆栈”。但是它确实说变量默认为自动存储持续时间,也就是说,它们在超出范围时被销毁。实现的方式是使用堆栈。所以不,你不能保证它分配在(或a)堆栈上,但你可以保证它的行为就像它一样
    • const-ness 不会影响这一点。 static 会给它静态存储持续时间。 const 只是指定它不能被修改,它不影响生命周期。
    • 这是一个不好的例子。无论 anarray 的存储位置如何,所有元素都必须在程序退出时销毁。您应该添加范围块和打印以确保: struct A { ~A(){ printf( "A destructed\n" ); } }; int main() { { const A anarray[5]; } printf("主要退出\n"); };
    • @arolson:谢谢,你是对的。顺便说一句,您可以通过用反引号括起来将代码放入 cmets(和其他文本)中。
    【解决方案2】:

    据我了解:是的。有人告诉我,您需要使用 static 限定常量才能将它们放入数据段中,例如

    void someFunction()
    {
         static const unsigned int actions[8] = 
             {
                 e1,
                 e2,
                 etc...
             };
    }
    

    【讨论】:

      【解决方案3】:

      如果您不希望在堆栈上创建数组,请将其声明为静态。作为 const 可能允许编译器优化整个数组。但如果它被创建,它将在堆栈 AFAIK 上。

      【讨论】:

        【解决方案4】:

        是的,非静态变量总是在堆栈上创建。

        【讨论】:

        • 你不是暗示它是静态的会占用堆栈空间吗?
        • @Dynite,我的一个同事曾经提到过。但是,我不确定,所以我将删除我的帖子的那部分。
        • @Dynite,我说的是废话。正确的信息可以在这里找到:stackoverflow.com/questions/93039/…
        猜你喜欢
        • 1970-01-01
        • 2021-06-19
        • 2015-05-03
        • 2011-07-25
        • 2013-07-11
        • 2013-12-04
        • 2016-02-04
        • 1970-01-01
        相关资源
        最近更新 更多