我总是对静态变量以及内存分配的发生方式感到困惑。
例如:
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)
,有什么区别(就记忆而言)?
答案 0 :(得分:7)
我总是对静态变量感到困惑
在全局范围内,static
仅表示链接时其他文件不可见。
如何为a,b和c分配内存?
所有这些文件都将存在于可执行文件中(例如__DATA段),该文件将在执行时映射到RAM中。如果编译器是好的,b
和c
将存在于只读数据区域(例如__TEXT段),甚至在优化中消除。
如果我调用foo(a),foo(b)和foo(c),有什么区别(就记忆而言)?
foo(b)
和foo(c)
将是编译器错误,因为const int&
无法转换为int&
。
否则没有区别。通过引用传递相当于在CPU意义上通过指针传递。因此,每个内存的地址都被占用,并且foo
被调用。
答案 1 :(得分:1)
为三个变量分配相同的内存。不同之处在于编译器如何处理它们。由于b
和c
声明为const
,因此如果您尝试修改其值,编译器会抱怨您。由于c
已定义为static
,因此无法在当前文件之外访问a
和b
都可以使用extern
进行访问。
所有这三个内存都将在可执行文件中分配,除非进行任何优化(有时编译器可以通过在引用的任何地方填充常量值来消除为常量分配内存的需要。)
您的函数调用适用于a
但不适用于b
或c
而没有显式转换(因为您的函数需要指向非const
{{ 1}})。但是,如果您尝试将int
值转换为非const
值,则编译器应该抱怨您。