静态变量的内存分配

Posted

技术标签:

【中文标题】静态变量的内存分配【英文标题】:Memory allocation in case of static variables 【发布时间】:2010-03-08 17:44:20 【问题描述】:

我总是对静态变量以及它们的内存分配方式感到困惑。

例如:

int a = 1;
const int b = 2;
static const int c = 3;

int foo(int &arg)
  arg++;
  return arg;

abc 的内存是如何分配的?

如果我调用foo(a)foo(b)foo(c),有什么区别(在内存方面)?

【问题讨论】:

你不能打电话给foo(b)foo(c) 也许值得知道的是,在 C++ 中,bc 都具有静态链接。在 C 中,b 具有外部链接。 【参考方案1】:

我总是对静态变量感到困惑

在全局范围内,static 仅表示链接时对其他文件不可见。

a、b 和 c 的内存是如何分配的?

它们都将存在于可执行文件中(例如 __DATA 段),该文件将在执行时映射到 RAM。如果编译器不错,bc 将位于只读数据区域(例如 __TEXT 段),甚至在优化中被淘汰。

如果我调用 foo(a)、foo(b) 和 foo(c),有什么区别(在内存方面)?

foo(b)foo(c) 将是编译器错误,因为const int& 无法转换为int&

否则没有区别。引用传递相当于 CPU 意义上的指针传递。所以每个内存的地址都被取出来了,foo被调用了。

【讨论】:

【参考方案2】:

为您的三个变量分配相同的内存。不同之处在于编译器如何处理它们。因为bc 是用const 声明的,所以如果你试图修改它们的值,编译器会抱怨你。由于c 定义为static,因此在当前文件之外将无法访问它(ab 都可以使用extern 访问)。

所有这三个的内存都将在可执行文件中分配,除非进行任何优化(有时编译器可以通过在引用常量的任何地方填写常量的值来消除为常量分配内存的需要)。

您的函数调用将适用于a,但不适用于bc,无需显式转换(因为您的函数需要指向非constint 的指针)。但是,如果您尝试将 const 值强制转换为非 const 值,您的编译器会抱怨您。

【讨论】:

以上是关于静态变量的内存分配的主要内容,如果未能解决你的问题,请参考以下文章

静态变量的内存分配

java内存分配实例

Java静态内存与动态内存分配的解析

程序的内存分配

如何为静态变量分配内存?

内存的分配方式