64,011
社区成员




#include <iostream>
using namespace std;
const int i = 100;
int n = 0;
class CTest
{
public:
CTest():j(0),l(0){};
int l;
const int j;//静态成员变量必须由默认构造函数初始化
static const int k = 102;
};
void main()
{
CTest ct ;
int m = 0;
const int o = 0;
long addri = (long)&i;
long addrl = (long)&ct.l;
long addrj = (long)&ct.j;
long addrk = (long)&ct.k;
long addrm = (long)&m;
long addrn = (long)&n;
long addro = (long)&o;
cout<<"addr i="<<addri<<endl; //addr i=4290560(符号表)
cout<<"addr l="<<addrl<<endl; //addr l=1310556
cout<<"addr j="<<addrj<<endl; //addr j=1310560
cout<<"addr k="<<addrk<<endl; //addr k=4290564(符号表)
cout<<"addr m="<<addrm<<endl; //addr m=1310544
cout<<"addr n="<<addrn<<endl; //addr n=4297032(符号表)
cout<<"addr o="<<addro<<endl; //addr o=1310532
getchar();
}
cout<<"addr i="<<addri<<endl; //addr i=4290560(符号表)
C++中的const默认为内部连接,也就是说,const仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到。当定义一个const时,必须赋一个值给它,除非用extern作出了清楚的说明。
通常C++编译器并不为const创建存储空间,相反它把这个定义保存在它的符号表里。但是extern强制进行了存储空间分配(另外还有一些情况,如取一个const的地址,也要进行存储空间分配),由于extern意味着使用外部连接,因此必须分配存储空间,这也就是说有几个不同的编译单元应当能够引用它,所以它必须存储空间。
另外,发现楼主对符号表的理解错了,
符号表,仅仅是在编译器编译时,在编译器编译过程中编译器内部产生的一个临时的列表而已。
编译结束后就不再需要的。所以,它是不会占用程序的内存
public main
main proc near
push ebp
mov ebp, esp
and esp, 0FFFFFFF0h
sub esp, 10h
mov dword ptr [esp+4], 3
mov dword ptr [esp], offset _ZSt4cout@@GLIBCXX_3_4
call __ZNSolsEi ; std::ostream::operator<<(int)
xor eax, eax
leave
retn
main endp
public main
main proc near
push ebp
mov ebp, esp
and esp, 0FFFFFFF0h
sub esp, 20h
mov dword ptr [esp+1Ch], 1
mov dword ptr [esp+18h], 2
mov dword ptr [esp+14h], 3
mov eax, [esp+14h]
mov [esp+4], eax
mov dword ptr [esp], offset _ZSt4cout@@GLIBCXX_3_4
call __ZNSolsEi ; std::ostream::operator<<(int)
mov eax, 0
leave
retn
main endp