我一直对静态变量和它们的内存分配方式感到困惑。
例如:
int a = 1;
const int b = 2;
static const int c = 3;
int foo(int &arg){
arg++;
return arg;
}
对于变量 a
,b
和 c
,内存是如何分配的?
如果我调用 foo(a)
、foo(b)
和 foo(c)
,它们之间在内存上有什么区别?
我一直对静态变量和它们的内存分配方式感到困惑。
例如:
int a = 1;
const int b = 2;
static const int c = 3;
int foo(int &arg){
arg++;
return arg;
}
对于变量 a
,b
和 c
,内存是如何分配的?
如果我调用 foo(a)
、foo(b)
和 foo(c)
,它们之间在内存上有什么区别?
你的三个变量分配的内存是相同的。区别在于编译器对它们的处理方式不同。由于b
和c
被声明为const
,如果你试图修改它们的值,编译器会报错。由于c
被定义为static
,它将无法在当前文件之外访问(a
和b
可以使用extern
访问)。
这三个变量的内存将在可执行文件中分配,除非进行了优化(有时编译器可以通过在引用常量的地方填充常量的值来消除分配内存的需要)。
你的函数调用将适用于a
,但对于b
或c
而言,需要显式转换(因为你的函数期望一个指向非const
的int
)。然而,如果你试图将一个const
值转换为非const
值,你的编译器应该会报错。
foo(b)
或者foo(c)
。 - Yacobyb
和c
都拥有静态链接。而在C语言中,变量b
具有外部链接。 - Steve Jessop