【问题标题】:Where is an array initialized by an initializer list stored?由初始化列表初始化的数组存储在哪里?
【发布时间】:2010-10-03 09:08:29
【问题描述】:

鉴于这段代码:

(void)someFunction(void) {
    int array[] = {1,2,3,4,5,6,7,8,9,10};
}

数组的值存储在哪里?

  • 堆栈?
  • 堆?
  • 连同那些字符串文字。 (是不是叫高频堆?)
  • 其他地方?

我问这个问题是因为我不确定:

Create an array of integers property in objective-c

【问题讨论】:

    标签: c memory


    【解决方案1】:

    如果有人读到这篇文章是为 C# 看的,答案是不同的。数组是引用类型,因此值存储在堆上并在堆栈上引用。

    【讨论】:

    • 这个问题是关于C的,和C#无关。
    • 您的答案没有用的原因是您只是在谈论 C#。想象一下,如果为除 C 之外的每种语言发布这样的答案会发生什么。但是,您的添加将是最受欢迎的,但是,作为评论说这严格适用于 C 和其他语言,例如 C#,数组存储在堆上.
    • 好肉汁。现在没人读书了吗?对于遇到问题并想知道 c# 答案的人,我必须有多清楚?
    【解决方案2】:

    正如 Micheal 所说,初始化列表的值将存储在哪里取决于编译器和优化级别。例如,没有优化的 gcc 只会生成将常量移动到数组中适当位置的代码,即实际值将仅存储在代码本身中。如果您不编译为目标代码,而是让您的编译器输出汇编程序,您可以轻松检查会发生什么。

    【讨论】:

      【解决方案3】:

      数组本身将在堆栈上。在函数的入口处会有一些代码将存储在全局/静态内存区域中某个未命名数组中的值复制到堆栈上的本地数组中。具有初始值的未命名全局/静态数组很可能与字符串文字位于同一通用内存区域中。

      但是请注意,标准都不需要这些 - 但几乎任何编译器都会实现它。足够聪明的编译器可能会注意到这些值只是递增的整数值,并且可能会生成一个循环来初始化本地数组,

      (这个答案假设 C/C++ - 我不知道 Objective-C 是否会改变这一切)。

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 2014-04-27
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        • 2023-02-04
        • 2011-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多