首页 > 代码库 > 存储区域
存储区域
前言:类型定义后,存储在哪里?变量定义后存储在哪里?程序代码存储在哪里?
1. 全局数据区和程序代码区
类型定义后,存在内存的只读区域,不可见,无法取得地址。类变量记录的是地址偏移,与对象绑定才能取得地址。
变量:
全局变量存在全局数据区,全局静态变量存在全局数据区的全局静态变量段。(两者相临或相差几个字节)。
名空间变量存在全局数据区,和全局变量同一存储区域,名空间静态变量存在全局数据区的名空间静态变量段,和全局静态变量同一存储区域。
类变量名称列表中记录的是地址偏移,和对象绑定才能取得地址。类静态变量存在全局数据区的类静态变量段,和全局静态变量不同存储区域。
函数(函数也是变量一种):
全局函数存在程序代码区,全局静态函数存在程序代码区的全局静态函数段。(两者相邻即同一存储区域)。
名空间全局函数存在程序代码区,和全局函数同一存储区域,名空间静态函数存在程序代码区的名空间静态函数段,和全局静态函数同一存储区域。
类函数存在程序代码区,和全局函数不同存储区域,类静态函数存在程序代码去的类静态函数段,和全局静态函数不同存储区域。
先看如下程序:
#include <iostream> #include <iostream> #include <cstdlib> #include <cstdio> using namespace std; typedef void (*FUNC)(); const int X = 1; int x; int *p; void (*func_a)(); void func_b(){}; class C1 { public: typedef int INT; typedef void (*FUNC)(); public: int i; int j; INT k; static int m; static int n; public: void FuncA() {}; void FuncB() {}; static void FuncC() {}; static void FuncD() {}; static void FuncE() {}; FUNC FuncF; void (*FuncG)(); //int C1::*FuncH(); void Test() { FuncF = FuncE; FuncG = FuncE; printf("void FuncA 地址:%p\n", &C1::FuncB); printf("void FuncA 地址:%p\n", &C1::FuncC); printf("void FuncA 地址:%p\n", FuncC); } }; const int Y = 2; int y; void func_c(){}; C1::FUNC func_d = func_c; int C1::m = 1; int C1::n = 2; class C2 { public: int i; int j; int k; static int m; static int n; public: void FuncA() {}; void FuncB() {}; static void FuncC() {}; static void FuncD() {int i = 0; int j = 0; }; static void FuncE() {}; }; int C2::m = 1; int C2::n = 2; namespace n1 { int i; int j; static int m = 0; static int n = 0; void FuncA() {}; void FuncB() {}; static void FuncC() {}; static void FuncD() {}; } int main() { printf("class C1 长度:%d\n", sizeof(C1)); printf("const int X 地址:%p\n", &X); printf("int x 地址:%p\n", &x); printf("int *p 地址:%p\n", &p); printf("void (*func_a)() 地址:%p\n", &func_a); printf("void func_b(){} 地址:%p\n", &func_b); printf("const int Y 地址:%p\n", &Y); printf("int y 地址:%p\n", &y); printf("void func_c(){} 地址:%p\n", &func_c); printf("C1::FUNC func_d = func_c 地址:%p\n", &func_d); printf("C1 int i 地址:%p\n", &C1::i); printf("C1 int j 地址:%p\n", &C1::j); printf("C1 int k 地址:%p\n", &C1::k); printf("C1 static int m 地址:%p\n", &C1::m); printf("C1 static int n 地址:%p\n", &C1::n); printf("C1 void FuncA() {} 地址:%p\n", &C1::FuncA); printf("C1 void FuncB() {} 地址:%p\n", &C1::FuncB); printf("C1 static void FuncC() {} 地址:%p\n", &C1::FuncC); printf("C1 static void FuncD() {} 地址:%p\n", &C1::FuncD); printf("C1 static void FuncE() {} 地址:%p\n", &C1::FuncE); printf("C1 FUNC FuncF 地址:%p\n", &C1::FuncF); printf("C1 void (*FuncG)() 地址:%p\n", &C1::FuncG); printf("C2 int i 地址:%p\n", &C2::i); printf("C2 int j 地址:%p\n", &C2::j); printf("C2 int k 地址:%p\n", &C2::k); printf("C2 static int m 地址:%p\n", &C2::m); printf("C2 static int n 地址:%p\n", &C2::n); printf("C2 static void FuncC() {} 地址:%p\n", &C2::FuncC); printf("C2 static void FuncD() {} 地址:%p\n", &C2::FuncD); printf("C2 static void FuncE() {} 地址:%p\n", &C2::FuncE); printf("n1 int i 地址:%p\n", &n1::i); printf("n1 int j 地址:%p\n", &n1::j); printf("n1 static int m 地址:%p\n", &n1::m); printf("n1 static int n 地址:%p\n", &n1::n); printf("n1 void FuncA() {} 地址:%p\n", &n1::FuncA); printf("n1 void FuncB() {} 地址:%p\n", &n1::FuncB); printf("n1 static void FuncC() {} 地址:%p\n", &n1::FuncC); printf("n1 static void FuncD() {} 地址:%p\n", &n1::FuncD); return 0; }
运行结果:
class C1 长度:32
const int X 地址:0x400fd0 程序代码区(常量段)
int x 地址:0x602060 全局数据区
int *p 地址:0x602068 全局数据区(64位编译环境,指针占块大小为64位)
void (*func_a)() 地址:0x602070 全局数据区
void func_b(){} 地址:0x400674 程序代码区(整个函数定义占48位,不同编译环境所占块大小不同)
const int Y 地址:0x400fd4 程序代码区(常量段)
int y 地址:0x602078 全局数据区
void func_c(){} 地址:0x40067a 程序代码区
C1::FUNC func_d = func_c 地址:0x602038 全局数据区(类内声明的类型定义的变量,与类的static变量相同,存储位置相邻)
C1 int i 地址:(nil) 不可见区域,与类对象帮定,取得的地址为地址偏移
C1 int j 地址:0x4
C1 int k 地址:0x8
C1 static int m 地址:0x602040 全局数据区(类静态变量段)
C1 static int n 地址:0x602044
C1 void FuncA() {} 地址:0x400a26 程序代码区(类函数段)
C1 void FuncB() {} 地址:0x400a30
C1 static void FuncC() {} 地址:0x400a3a 程序代码区(类静态函数段,与类函数同同一存储区域,与全局函数不同存储区域)
C1 static void FuncD() {} 地址:0x400a40
C1 static void FuncE() {} 地址:0x400a46
C1 FUNC FuncF 地址:0x10
C1 void (*FuncG)() 地址:0x18
C2 int i 地址:(nil)
C2 int j 地址:0x4
C2 int k 地址:0x8
C2 static int m 地址:0x602048 全局数据区(类静态变量段,不同类的静态变量在同一存储区域)
C2 static int n 地址:0x60204c
C2 static void FuncC() {} 地址:0x400a4c 程序代码区(类静态函数段)
C2 static void FuncD() {} 地址:0x400a52
C2 static void FuncE() {} 地址:0x400a66
n1 int i 地址:0x60207c 全局数据区(名空间变量段,与全局变量同一存储区域)
n1 int j 地址:0x602080
n1 static int m 地址:0x602088 全局数据取(名空间静态变量段,与全局静态变量同一存储区域,与全局名空间变量、全局变量不同存储区域)
n1 static int n 地址:0x60208c
n1 void FuncA() {} 地址:0x400680 程序代码区(名空间函数段,与全局函数同一存储空间)
n1 void FuncB() {} 地址:0x400686
n1 static void FuncC() {} 地址:0x40068c 程序代码区(名空间静态函数段,与名空间函数段、全局函数段同一存储区域)
n1 static void FuncD() {} 地址:0x400692
存储区域