关于结构体大小怎样计算的文章,我想网上一搜到处都有人总结,本人之所以在此基础上还要发表这样的文章是想用最简单的计算方法来总结前人给出的结论,以致我们在以后在对结构体相关编程中不会陷入字节对齐的陷阱中。想必想弄清楚这个问题的小伙伴都迫不及待了吧,废话不多说,下面分析过程。

  首先大家应该知道有个叫默认对齐字节的概念吧,#pragma pack(n) 在代码中可以手动设置默认对齐字节的大小为n,VS编译器 n只能为(1、2、4、8、16)。默认为8 ,可以通过#pragma pack(show) 来看到编译的输出值为8. 在下面的讨论中我将这个默认对齐字节叫做n.

  然后我们计算结构体中每个成员变量所存放位置相对于前一个的偏移量x,不同类型x值不同,如char 、short、 int、 long long  x分别为1 、2  、4、8。

注意,如果n>=x, 实际偏移量 T=x, 如果 n<=x, 实际偏移量 T= n*m >=x  m是使T大于等于x的最小整数。 记住这个T。

  举例说明  假设n=8.

struct s
{
char a
int b;
char c;
long long d;
}

 

成员变量 x T
a 1 1
b 4 4
c 1 1
d 8 8

内存分布:  a   T=1 字节对齐,所以暂用第1个字节

            b    T=4 字节对齐,b占用  4-7。

c   T=1 字节对齐, c占用 8

      d  T= 8字节对齐, d占用9-15 。

到此,s成员变量占用16字节。

分下面两种情况:如果n大于所有成员变量类型所占用的字节数16,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;

否则必须为n的倍数.

结论:1.想确定成员变量的对齐大小,如果比默认的对齐字节(一般是8)小,则成员变量的对齐字节就是自身的对齐字节,如果比默认的大,那么成员变量的对齐字节就是n的整数倍并且不小于自身的对齐字节。

2.根据对齐字节初步算出结构体大小m.   最后拿m如n比较,如果m>=n, 那么总大小必须为n的倍数,否则为为结构体最大成员变量的倍数。

sizeof(结构体) = ?的更多相关文章

  1. sizeof(结构体)的计算

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

  2. sizeof(结构体)和内存对齐以及位域

    Win32平台下的微软C编译器的对齐策略: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该 ...

  3. sizeof结构体

    规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数 ...

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

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

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

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

  6. 结构体变量的sizeof计算

    结构体字节对齐准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: ...

  7. C++面试常见问题——13结构体与共用体的sizeof

    结构体与共用体的sizeof 结构体的sizeof 结构体变量占用的内存空间大小通常是其基本类型的大小,但是由例外(字节对齐机制) struct S1{ char c[5]; int a; doubl ...

  8. C语言中结构体对齐问题

    C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...

  9. C++之 自定义数据类型 枚举、结构体、共用体

    1.枚举 枚举类型的声明形式为:   enum  枚举类型名   {  变量值列表 };    变量值列表里都是整型变量,另外不要忘记最后面的分号! 比如,enum  weekday   { sun, ...

  10. C语言中 不定义结构体变量求成员大小

    所谓的求成员大小, 是求成员在该结构体中 用 sizeof(结构体名.结构体成员名) 求来的. 很多时候我们需要知道一个结构体成员中的某个成员的大小, 但是我们又不需要定义该结构体类型的变量(定义的话 ...

随机推荐

  1. AfxMessageBox和MessageBox区别

    如果用MFC的话,请尽量使用afxmessagebox,因为这个全局的对话框最安全,也最方便.    但是在WIN32 SDK的情况下只能使用MESSAGEBOX. MessageBox()是Win3 ...

  2. ssh那些事儿

    第一次使用ssh是上学期搭建hadoop集群的时候,当时照着各种配置文档费了九牛二虎之力终于把环境搭建成功,现在想想当时还真是不容易呢.好了废话不扯了,进入正题. 计算机发展早期能实现两台机器之间的通 ...

  3. 如何查看屏幕touch driver是否在正常工作

    1. adb shell cat proc/bus/input/devices查看touch对应的是哪个event,如是event3: 2. adb shell getevent dev/input/ ...

  4. equal与==

    首先做的是比较引用,引用的如果是同一个对象,直接返回true.做完return就结束了.如果引用不是同一个地址,就往下走,判断是否是String的一个实例.同样,不是的话直接返回.是的话,拿字符串的长 ...

  5. Eclipse导入Tomcat源码(转)

    想要研究下Tomcat的体系结构或者源码,最好将Tomcat的源码导入到ide中,编写实例进行代码跟踪(debug). 这里参考了网上一些资料,将自己操作过程记个流水账. 准备: 1.Tomcat源码 ...

  6. 学习总结——Selenium元素定位

    读一本好书,不能读读就算了,做一下总结,变成自己的,以备查阅. 1.         driver.findElement(By.id(<element ID>)) ID是独一无二的,使用 ...

  7. django--模板(七)

    1.模板加载 一个项目可以有多个应用,每个应用下都可以有模板,思考模板的查找顺序?

  8. RabbitMQ消息机制单人分发

    static void Main(string[] args) { // More.SendMessage(); var factory = new ConnectionFactory(); fact ...

  9. C语言指针变量作为函数参数

    0x01 指针变量作为函数参数的作用是:将一个变量的地址传送到另一个函数中. 0x02 简单的例子:虽然都能实现功能,但意义不同. 正确的写法: #include <stdio.h> vo ...

  10. MSBI - KPI

    KPI - common members: Value, Target, Status, Trend.