5.1局部存储分配 ·例在SPARC/Solaris工作站上,下面两个结 构体的size分别是24和16,为什么不一样? typedef struct a{ typedef struct b{ char c1; char c1; long i; char c2; char c2; long i; double f; double f; }a; }b; 对齐:char:1,long:4,double:8
5 1. 局部存储分配 • 例 在SPARC/Solaris工作站上,下面两个结 构体的size分别是24和16,为什么不 样一 ? typedef struct _a{ typedef struct _b{ char c1; char c1; long i; char c2; char c2; long i; double f; double f; }a; }b; 对齐:char : 1, long : 4, double : 8
5.1局部存储分配 ·例在SPARC/Solaris工作站上,下面两个结 构体的size分别是24和16,为什么不一样? typedef struct_af typedef struct b{ char c1;0 char cl;0 long i; 4 char c2;1 char c2;8 long i; 4 double f;16 double f;8 }a; }b; 对齐:char:1,long:4,double:8
5 1. 局部存储分配 • 例 在SPARC/Solaris工作站上,下面两个结 构体的size分别是24和16,为什么不 样一 ? typedef struct _a{ typedef struct _b{ char c1; 0 char c1; 0 long i; 4 char c2; 1 char c2; 8 long i; 4 double f; 16 double f; 8 }a; }b; 对齐:char : 1, long : 4, double : 8
5.1局部存储分配 ·例在x86 Linux机器的结果和SPARC/Solaris 工作站不一样,是20和16。 typedef struct_af typedef struct_b{ char cl;0 char c1;0 long i; 4 char c2;1 char c2;8 long i; 4 double f;12 double f;8 }a; }b; 对齐:char:1,long:4,double:4
5 1. 局部存储分配 • 例 在x86/Linux机器的结果和SPARC/Solaris 工作站不 样一 ,是20和16。 typedef struct _a{ typedef struct _b{ char c1; 0 char c1; 0 long i; 4 char c2; 1 char c2; 8 long i; 4 double f; 12 double f; 8 }a; }b; 对齐:char : 1, long : 4, double : 4
5.1局部存储分配 5.1.5程序块 本身含有局部变量声明的语句 可以嵌套 作用域按最接近的嵌套规则给出 并列程序块不会同时活跃 并列程序块的变量可以重叠分配
5 1. 局部存储分配 5.1.5 程序块 • 本身含有局部变量声明的语句 • 可以嵌套 • 作用域按最接近的嵌套规则给出 • 并列程序块不会同时活跃 • 并列程序块的变量可以重叠分配
5.1局部存储分配 main()/*例*/ 声明 作用域 /begin of Bo * int a 0; B。-B2 int a 0; int b=0; int b=0; B。-B1 /begin of B * int b=1; B1-B3 int b 1; int a 2; B, {/begin of B,* int b=3; int a 2; }/end 0fB2*/ {/begin of B,* int b=3; /end of B3 * /end of B1 * }/end of Bo * 重叠分配存储单元
5 1. 1 局部存储分配 mai ( n ( ) / 例 / 声 明 作 用 域 { / begin of B 0 / i 0 声 明 作 用 域 int a = 0; B0 B 2 int a = 0 ; int b = 0 ; { / b i f B / int b = 0; B0 B 1 { / beg in o f B int b = 1; B B 1 / int b = 1 ; {/ i f / int b = 1; B 1 B 3 int a = 2; B 2 {/ beg in o f B 2 / int a = 2 ; int b = 3; B 3 }/ end o f B 2 / {/ begin of B 3 / a 0 b 0 int b = 3 ; }/ end of B 3 / b 0 b 1 a 2, b 3 }/ end o f B 1 / }/ end of B 0 / a 2 , b 3 重叠分配存储单元