sizeof(结构体) = ?

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

  首先大家应该知道有个叫默认对齐字节的概念吧,#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的倍数,否则为为结构体最大成员变量的倍数。

时间: 2024-10-27 13:34:17

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

结构体变量的sizeof计算

结构体字节对齐准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2. 结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节: 3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节. 4. 在嵌套结构中需要把内部‘打散'后再进行对齐计算. // sizeof(结构体).cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #inc

C++结构体中sizeof(1)

sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的头文件stddef.h的C++版本.他是一个和机器相关的unsigned类型,其大小足以保证内存中对象的大小. 1.什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, as

C语言结构体的字节对齐原则

转载:http://blog.csdn.net/shenbin1430/article/details/4292463 为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址

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

1.枚举 枚举类型的声明形式为:   enum  枚举类型名   {  变量值列表 };    变量值列表里都是整型变量,另外不要忘记最后面的分号! 比如,enum  weekday   { sun,mon,tue,wed,thu,fri,sat }; 这里的枚举元素sun.mon...都没有指定值,它们就使用默认值,依次为0,1,2....即sun就是0,mon就是1,...sat是6.也可以在声明枚举类型时指定枚举元素的值,比如 enum  weekday  { sun=7, mon=1,

数组强制转换成结构体指针,结构体内部指针的指向问题

如果直接操作结构体成员是不会取到不期望的值 但是对于要求连续数据格式的时候需要考虑对齐的问题 例如通讯中的数据帧格式等 ,如 ip数据包等#pragma   pack(1) struct   tagStruct {     ... } t; #pragma   pack() 的方式来强制连续存放 其中前面   pack(1)   是指对齐边界为   1 1.几个结构体例子: struct{short a1;short a2;short a3;}A; struct{long a1;short a2

3.结构体与链表

转载请标明出处:http://blog.csdn.net/u012637501 一.结构体 struct Student *p:p是一个struct Student *类型的指针变量, 用于存放struct Student类型变量的地址 1.结构体:把一些基本类型数据组合在一起形参的一个新的复合数据类型,用来表示一些复杂的事物,即称为结构体. 2.定义结构体方法 (1)第一种方法:指定结构体名,不定义结构体变量 struct Student { int age; float score; cha

【转】C语言结构体的字节对齐原则

原文链接:http://blog.csdn.net/shenbin1430/article/details/4292463 为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定

结构体,公用体,枚举类型的sizeof

1)枚举类enum型空间计算 enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当做int来存储的,所以枚举类型的sizeof值都为4 1 enum color(red,pink,white,black)c; 2 void main() 3 { 4 cout<<sizeof(enum); //值为4 5 } 2)公用体union空间计算 公用体中的成员公用同一段内存,所以整个联合体的sizeof是所有成员中占用内存最大的成员的sizeof,联合体要考虑内存对齐,具体规则下面会讲 1

结构体的sizeof

首先有几条规则: 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

结构体,联合体union,枚举,sizeof

结构体中的位字段 有些信息在存储时并不需要占用一个完整的字节,有时只需要占用一个或者几个二进制位,为了节省存储空间并使得处理简便,C语言提供了一种数据结构,成为“位域”或者“位段”. C与C++允许指定占用特定位数的结构成员,字段的类型应为整型或者枚举型 ,接下来是冒号:,然后后面跟一个数字,它指定了使用的位数,且可以使用没有名字的字段来提供间距.每个成员都被称为位字段(bit field).例: 1 struct reg 2 { 3 unsigned int SN:4; 4 unsigned