【发布时间】:2010-10-03 09:08:29
【问题描述】:
鉴于这段代码:
(void)someFunction(void) {
int array[] = {1,2,3,4,5,6,7,8,9,10};
}
数组的值存储在哪里?
- 堆栈?
- 堆?
- 连同那些字符串文字。 (是不是叫高频堆?)
- 其他地方?
我问这个问题是因为我不确定:
【问题讨论】:
鉴于这段代码:
(void)someFunction(void) {
int array[] = {1,2,3,4,5,6,7,8,9,10};
}
数组的值存储在哪里?
我问这个问题是因为我不确定:
【问题讨论】:
如果有人读到这篇文章是为 C# 看的,答案是不同的。数组是引用类型,因此值存储在堆上并在堆栈上引用。
【讨论】:
正如 Micheal 所说,初始化列表的值将存储在哪里取决于编译器和优化级别。例如,没有优化的 gcc 只会生成将常量移动到数组中适当位置的代码,即实际值将仅存储在代码本身中。如果您不编译为目标代码,而是让您的编译器输出汇编程序,您可以轻松检查会发生什么。
【讨论】:
数组本身将在堆栈上。在函数的入口处会有一些代码将存储在全局/静态内存区域中某个未命名数组中的值复制到堆栈上的本地数组中。具有初始值的未命名全局/静态数组很可能与字符串文字位于同一通用内存区域中。
但是请注意,标准都不需要这些 - 但几乎任何编译器都会实现它。足够聪明的编译器可能会注意到这些值只是递增的整数值,并且可能会生成一个循环来初始化本地数组,
(这个答案假设 C/C++ - 我不知道 Objective-C 是否会改变这一切)。
【讨论】: