C语言中结构体struct怎么对齐
这篇文章主要介绍“C语言中结构体struct怎么对齐”,在日常操作中,相信很多人在C语言中结构体struct怎么对齐问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中结构体struct怎么对齐”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
struct,相互关联的元素的集合,每个元素都有自己的内存空间;每个元素在内存中的存放是有先后顺序的,就是定义时候的顺序;一个struct所占的总的内存大小,并不是各个元素所占空间之和,而是存在字节对齐的问题.
struct中的每个元素相对于结构体的首地址的偏移量能被该元素的size整除(某些编译器,如果该元素的size > 4,则偏移量能被4整除即可).
测试代码:
[xdb@localhosttest]$cattest.cpp#include<cstdio>#include<iostream>usingnamespacestd;#defineLLlonglongstructE1{inta;charb;charc;}e1;structE2{charb;inta;charc;}e2;structE3{chara;shortb;intc;LLd;}e3;structE4{intc;LLd;chara;shortb;}e4;structE5{chara1,a2,a3,a4,a5,a6;}e5;structE6{chara1,a2,a3;}e6;structE7{structE5elem5;structE6elem6;LLa;}e7;structE8{chara[9];}e8;structE9{structE8elem8;LLa;}e9;structE10{chara;};intmain(){puts("---->E1");cout<<sizeof(E1)<<endl;printf("%x%x%x%x\n",&e1,&e1.a,&e1.b,&e1.c);puts("---->E2");cout<<sizeof(E2)<<endl;printf("%x%x%x%x\n",&e2,&e2.b,&e2.a,&e2.c);puts("---->E3");cout<<sizeof(E3)<<endl;printf("%x%x%x%x%x\n",&e3,&e3.a,&e3.b,&e3.c,&e3.d);puts("---->E4");cout<<sizeof(E4)<<endl;printf("%x%x%x%x%x\n",&e4,&e4.c,&e4.d,&e4.a,&e4.b);puts("---->E5");cout<<sizeof(E5)<<endl;puts("---->E6");cout<<sizeof(E6)<<endl;puts("---->E7");cout<<sizeof(E7)<<endl;printf("%x%x%x%x\n",&e7,&e7.elem5,&e7.elem6,&e7.a);puts("---->E8");cout<<sizeof(E8)<<endl;puts("---->E9");cout<<sizeof(E9)<<endl;printf("%x%x%x\n",&e9,&e9.elem8,&e9.a);puts("---->E10");cout<<sizeof(E10)<<endl;return0;}[xdb@localhosttest]$
编译,执行
[xdb@localhosttest]$g++test.cpp-otest[xdb@localhosttest]$./test---->E186021a06021a06021a46021a5---->E2126021a86021a86021ac6021b0---->E3166021c06021c06021c26021c46021c8---->E4246021d06021d06021d86021e06021e2---->E56---->E63---->E724602200602200602206602210---->E89---->E924602230602230602240---->E101[xdb@localhosttest]$
到此,关于“C语言中结构体struct怎么对齐”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。