首先有几条规则:

1. 结构体的成员相对于结构体的偏移量,是该成员所包含的最大简单类型(指占用内存数)的整数倍(如果该成员本身又是一个结构体,就要递归查找其简单类型,简单类型就是char short int float double,long)

比如struct a1{

char a[5];

int b;

}aa;

struct a2{

double a;

char b;

a1 c;

char d;

}bb;

此例中,aa.b相对于aa的偏移值是int的整数倍,所以aa.b的偏移值是8,aa.a后面有三字节填充;

a2中bb.c的偏移值是a1所含的最大简单类型的整数倍,a1包含的最大简单类型是int,所以bb.c的偏移值是4的倍数,所以bb.c的偏移值是12,char类型的偏移值是1的倍数,double偏移值是8的倍数。long的长度根据规范,sizeof(long)>=sizeof(int),我的64位机器,vc2005,发现int=long=4字节,64位数据类型必须使用longlong或者其他windows自己定义的类型。

2. 结构体的最终大小,还要通过在结构体的末尾填充字节,使得结构体大小是结构体最大简单类型(如果需要递归查询简单类型的话就要递归取出最大简单类型)的整数倍

上述例子中,bb的大小,必须是8的整数倍. aa的大小为12,a1类型的成员在结构体中的起始位置应该是4的整数倍。这样,a2的大小就是8+1+offset(bb.c) + sizeof(a1) + sizeof(d)+padding = 12+sizeof(a1)+1+ padding = 25+padding = 8的倍数, 所以sizeof(a2)应该取整到32,最后填充了7个字节。

3. 联合类型union也是类似,union的成员的起始偏移(这是指,当union作为复合结构的成员变量时,相对于所在复合体)也要对齐到该成员所含最大简单类型的整数倍上,union的最终大小也要补齐到最大简单类型的整数倍上

比如union b1{

char a[5];

int b;

};

struct b2{

char a[3];

b1 b;

char c;

};

则b1的大小为8(最终大小要对齐到int类型的整数倍上), b2中的b的偏移值,应该是b的子成员的最大简单类型的倍数,也就是b的偏移是4的倍数,所以b的偏移是4,b2的大小为12,b2的成员c的末尾还要补上3个字节,保证b2的大小是其成员中最大简单类型的整数倍。

4. 如果加入了#pragma pack(n) , 这里n只能=1,2,4,8,16... 那么, 之前的“最大简单类型”的计算就要变成 “最大简单类型”的大小和n的最小值

比如

#pragma push //保存一下当前的对齐值

#pragma pack(4)

struct testT

{

char a1;

double a2;

char a3;

};

#pragma pop //恢复编译期记忆的对齐值

那么,计算 sizeof(testT)== 16,默认应该是计算为24。这里,a2偏移不在是8的倍数,而是min(sizeof(dobule), 4) = 4, 所以a2的偏移是4。从这里也可以看出来,由于最大简单类型是double=8或者64位的longlong=8, n>=16没有意义(一般来说,除非你还有更大的简单类型,16字节的超级cpu。。。)

结构体的sizeof的更多相关文章

  1. C++结构体中sizeof(1)

    sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的 ...

  2. C++结构体中sizeof

    说明: 结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题.这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,一.解释 现代计 ...

  3. 怎样求结构体成员的偏移地址 || 结构体的 sizeof 总结

    C 语言中同意将值为 0 的变量强制转换成任一类型的指针,转换结果是一个NULL指针. (type*)0 // 一个 type 类型的NULL指针 用这个指针訪问结构体内的成员是非法的,可是 & ...

  4. C语言各类型大小,结构体大小 sizeof(struct A)

    C语言类型大小总览 编译器pack指令 #pragma pack(n)——定义n字节对齐 C++固有类型的对齐取编译器对齐与自身大小中较小的一个 32位C++默认8字节对齐.gcc编译器默认4字节对齐 ...

  5. 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)

    一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...

  6. sizeof(结构体)的计算

    摘要: 经常被计算结构体的sizeof给搞晕,于是找了个时间,静下心来,搞定它. 一.为什么结构体计算这么乱? 答案是字节对齐,计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如 ...

  7. sizeof strlen strncpy用法总结 结构体实际所占内存大小 以及memset用法

    sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型 #include <stdio.h> #include <stdlib.h> #inclu ...

  8. 计算结构体、数组、指针的sizeof

    1. 结构体的sizeof 题目: sturct aa{ in num; char name[10];}; struct bb{ int a; float b; struct aa c;}; stru ...

  9. sizeof()计算结构体的大小

    简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题. 一.没有成员的结构体 ...

随机推荐

  1. 移植strace调试工具到arm平台

    strace工具是一个非常强大的工具,是调试程序的好工具.要移植到arm平台,就需要使用交叉编译工具编译生成静态链接的可执行文件.具体步骤如下:1.下载 strace-4.5.16     移植str ...

  2. SEO的URL如何优化才是最佳

    原文地址:http://www.chinaz.com/web/2007/0413/6841.shtml 很多人都知道URL对SEO的重要之处,但是很多站点却忽略了站点的路径优化.今天本人在这里写几点关 ...

  3. iOS 大牛

    1,http://lixing123.com 2,http://kayosite.com

  4. 《Java程序员面试笔试宝典》之switch使用时有哪些注意事项

    switch语句用于多分支选择,在使用switch(expr)的时候,expr只能是一个枚举常量(内部也是由整型或字符类型实现)或一个整数表达式,其中整数表达式可以是基本类型int或其对应的包装类In ...

  5. 一个简陋的 CSS 样式

    有些网友对 Smart Framewok 中的 Sample 示例的样式比较感兴趣.由于本人对前端不太精通,但为了满足网友们的需求,只好献丑了. 以下这个简陋的 CSS 样式: ? 1 2 3 4 5 ...

  6. 2016-XCTF Final-Richman

    抽时间将XCTF Final中Richman这个题总结了下.题目及ida idb所在的链接在:http://files.cnblogs.com/files/wangaohui/richman-blog ...

  7. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  8. Javascript进阶篇——( JavaScript内置对象---下)--Math对象---笔记整理

    Math对象使用 Math 的属性和方法: <script type="text/javascript"> var mypi=Math.PI; var myabs=Ma ...

  9. Chrome开发者工具详解 (5):Application、Security、Audits面板

    Application面板简介 该面板主要是记录网站加载的所有资源信息,包括存储数据(Local Storage.Session Storage.IndexedDB.Web SQL.Cookies). ...

  10. Xcode 中添加 .pch文件

    1  新建工程 2  创建  .pch文件 3   在setting里面进行设置: