静态变量的内存分配

4

我一直对静态变量和它们的内存分配方式感到困惑。

例如:

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

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

对于变量 a,bc,内存是如何分配的?

如果我调用 foo(a)foo(b)foo(c),它们之间在内存上有什么区别?


7
你不能调用 foo(b) 或者 foo(c) - Yacoby
3
值得一提的是,在C++中,变量bc都拥有静态链接。而在C语言中,变量b具有外部链接。 - Steve Jessop
2个回答

7
在静态变量方面,全局范围内的 "static" 只是表示在链接时不会对其他文件可见。
所有这些变量都将存在于可执行文件中(例如 __DATA 段),并在执行时映射到 RAM 中。如果编译器很好,b 和 c 将位于只读数据区域(例如 __TEXT 段),甚至在优化中被消除。
调用 foo(a)、foo(b) 和 foo(c) 的内存差异是什么?
foo(b) 和 foo(c) 会导致编译器错误,因为 const int& 无法转换为 int&。
否则没有差异。按引用传递在 CPU 看来等同于按指针传递。因此,取每个内存的地址,并调用 foo。

1

你的三个变量分配的内存是相同的。区别在于编译器对它们的处理方式不同。由于bc被声明为const,如果你试图修改它们的值,编译器会报错。由于c被定义为static,它将无法在当前文件之外访问(ab可以使用extern访问)。

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

你的函数调用将适用于a,但对于bc而言,需要显式转换(因为你的函数期望一个指向非constint)。然而,如果你试图将一个const值转换为非const值,你的编译器应该会报错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接