2010-03-08 107 views
4

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

例如:

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),有什么区别(内存方面)?

+7

你不能调用'foo(b)'或'foo(c)'。 – Yacoby

+3

也许值得了解的是,在C++中,'b'和'c'都有静态链接。在C中,'b'具有外部链接。 –

回答

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

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

所有这三个内存将被分配在可执行文件内部,禁止任何优化(有时编译器可以通过在常量的引用处填入常量值来消除为常量分配内存的需要)。

你的函数调用会为a但不工作的bc没有明确的铸造(因为你的函数需要一个指向非constint)。但是,如果您尝试将const值转换为非const值,则编译器应该对您抱怨。