原题:问该结构体输出所占内存大小。
考点:结构体数据对齐。
例一:默认情况下:
#include <iostream> using namespace::std;
/*
* pack( [show] | [push | pop] [identifier], n )
*show,push,pop,identifier为可选参数,由编译器进行负责
*n默认以结构体变量类型最大为对齐大小。
*/
//#pragma pack(4)
typedef struct _A{ char a; int b; float c; double d; int *pa; char* pc; short e; }A; int main(int argc, char *argv[]) { printf("size = %d ",sizeof(A)); system("pause"); return 0; }
输出结果:
算法步骤:默认情况先按数据对齐,之后按整体对齐。
数据对齐:按变量类型长度对齐
a=1->a%1=0;->a=1 补0 按长度1对齐
b=4->(a+b)%4=1; ->a+3+b=8 补3 按长度4对齐
c=4->(a+3+b+c)%4=0;->a+3+b+c=12 补0 按长度4对齐
d=8->(a+3+b+c+d)%8=4;-> a+3+b+c+d+4=24 补4 按长度8对齐
pa=4->(a+3+b+c+d+4+pa)%4=0;-> a+3+b+c+d+4+pa=28 补0 按长度4对齐
pc=4->(a+3+b+c+d+4+pa+pc)%4=0;-> a+3+b+c+d+4+pa+pc=32 补0 按长度4对齐
e=2->(a+3+b+c+d+4+pa+pc+e)%2=0;-> a+3+b+c+d+4+pa+pc+e=34 补0 按长度2对齐
整体对齐:按结构体变量类型当中长度最大进行对齐。
a+3+b+c+d+4+pa+pc+e%8=2 ;->a+3+b+c+d+4+pa+pc+e+6=40 补6 按长度8对齐
例二:指定长度大小4对齐。
#include <iostream> using namespace::std; /* * pack( [show] | [push | pop] [identifier], n ) *show,push,pop,identifier为可选参数,由编译器进行负责 *n默认以结构体变量类型最大为对齐大小。 */ #pragma pack(4) typedef struct _A{ char a; int b; float c; double d; int *pa; char* pc; short e; }A; int main(int argc, char *argv[]) { printf("size = %d ",sizeof(A)); system("pause"); return 0; }
算法步骤:按指定对齐长度大小(4)对齐:
a=1->a%4=1;->a+3= 补3 按长度4对齐
b=4->(a+3+b)%4=0; ->a+3+b=8 补0 按长度4对齐
c=4->(a+3+b+c)%4=0;->a+3+b+c=12 补0 按长度4对齐
d=8->(a+3+b+c+d)%4=0;-> a+3+b+c+d=20 补0 按长度4对齐
pa=4->(a+3+b+c+d+pa)%4=0;-> a+3+b+c+d+pa=24 补0 按长度4对齐
pc=4->(a+3+b+c+d+pa+pc)%4=0;-> a+3+b+c+d+pa+pc=28 补0 按长度4对齐
e=2->(a+3+b+c+d+4+pa+e)%4=2;-> a+3+b+c+d+4+pa+e+2=32 补2 按长度4对齐