共用体和结构体所占内存大小的计算方法一
2017-07-08 17:09
281 查看
共同体作用:让几个不同类型的变量共享同一个内存地址。
共用体所占内存大小:共用体所占内存的大小即公用体中长度最大元素所占用的字节数。
方法一:
结构体的内存大小=最后一个成员的偏移量 + 最后一个成员的大小 + 末尾的填充字节数
偏移量:某个成员的实际地址和这个结构体首地址之间的距离。
例.1:
//一般来说,结构的对齐准测是:先按数据类型自身进行对齐,然后再按照整个结构体进行对齐。(两个)对齐。
如果一个类型先按自身n字节进行对齐,那么该类型的偏移量得是自身字节数的整数倍。数据自身的对齐值通常就是数据所占的空间大小。整个结构的对齐值一般是结构体中最大数据类型所占的空间大小。
共用体所占内存大小:共用体所占内存的大小即公用体中长度最大元素所占用的字节数。
方法一:
结构体的内存大小=最后一个成员的偏移量 + 最后一个成员的大小 + 末尾的填充字节数
偏移量:某个成员的实际地址和这个结构体首地址之间的距离。
例.1:
struct data { char a; int b; double c; }
比如说这个成员a,由于a是第一个成员,所以它的地址就是结构体的首地 址,它相对于结构体的首地址的偏移就是零。 第二个成员b,b成员距离结构体的首地址隔了一个变量a的大小,所以b的 偏移量为4.那么结构体做字节对齐的时候有这样一个准测: *每一个成员相对于结构体首地址的偏移量都得是当前成员所占大小的整 数倍,如果不是编译器就会在成员之间加上填充字节。* b的字节数是4,它的偏移量是1.这个时候,它的偏移量是1,1不是4的整 数倍,所以编译器就是在a成员的后面做一个字节填充,让从b的偏移量变 成4字节,这个时候b的偏移量就是b自身字节大小4的倍数了。 那么,现在再看一下c,对c来说,它的自身大小也是8字节,它目前的偏移量是4(b的偏移量)+4(b的大小)=8,8是c自身大小8的倍数,所以这里编译器不会在成员b和c之间填充字节。 此时c的偏移量 + c的字节大小 = 8 + 8 =16 此时还没有结束,编译器还要去判断,现在的结构体总大小是不是结构体中最宽的基本类型成员大小的整数倍(按整个结构对对齐,整个结构体的对齐值通常是结构体中最大数据类型所占的空间)。 此结构体中的最大数据类型为double,字节大小为8,16是8的倍数,所以c后面无需填充字节,即末尾的填充字节数为零。
//一般来说,结构的对齐准测是:先按数据类型自身进行对齐,然后再按照整个结构体进行对齐。(两个)对齐。
如果一个类型先按自身n字节进行对齐,那么该类型的偏移量得是自身字节数的整数倍。数据自身的对齐值通常就是数据所占的空间大小。整个结构的对齐值一般是结构体中最大数据类型所占的空间大小。
相关文章推荐
- [置顶] C/C++中结构体占用内存大小的计算方法
- C语言结构体,联合体,枚举体的内存大小计算方法
- 如何计算结构体大小和结构体中成员的内存偏移
- sizeof&结构体、共同体大小的计算方法笔记
- 结构体内存对齐后所占内存空间大小的计算
- 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte
- 如何计算结构体及共用体大小
- 结构体在内存中所占空间大小的计算
- 内存对齐方式的总结 如何计算结构体所占内存的大小
- 结构体在内存中所占字节大小计算
- java计算内存的大小方法
- 计算MYSQL需要的内存大小的估算方法
- 关于C语言字节对齐之结构体 共用体占用字节数的快速计算方法总结
- 如何计算一个结构体所占内存空间大小
- 使用计算总内存大小的方法确定jvm中为对象分配的存储空间大小
- 如何计算结构体所占内存大小
- Java程序计算各种对象所占内存的大小的方法
- 如何计算结构体及共用体大小
- C语言结构体内存对齐(计算结构体内存大小)
- 我计算结构体和联合体大小的方法