静态变量情况下的内存分配

时间:2010-03-08 17:44:21

标签: c++ c memory static memory-management

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

例如:

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),有什么区别(就记忆而言)?

2 个答案:

答案 0 :(得分:7)

  

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

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

  

如何为a,b和c分配内存?

所有这些文件都将存在于可执行文件中(例如__DATA段),该文件将在执行时映射到RAM中。如果编译器是好的,bc将存在于只读数据区域(例如__TEXT段),甚至在优化中消除。

  

如果我调用foo(a),foo(b)和foo(c),有什么区别(就记忆而言)?

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

否则没有区别。通过引用传递相当于在CPU意义上通过指针传递。因此,每个内存的地址都被占用,并且foo被调用。

答案 1 :(得分:1)

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

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

您的函数调用适用于a但不适用于bc而没有显式转换(因为您的函数需要指向非const {{ 1}})。但是,如果您尝试将int值转换为非const值,则编译器应该抱怨您。