精华内容
下载资源
问答
  • typedef union record { LONG lIndex; SHORT sLevel[6]; CHAR cPos; } REC_S; REC_S stMax,*pMax;...Sizeof(stMax/pMax/str/pChar/ulGrade/usClass/dWeight/pCharArray)的取值分别是多少?
  • sizeof计算联合体大小

    千次阅读 2016-04-03 16:39:13
    引言:本篇文章有一部分是在sizeof计算结构体大小的基础上进行说明的 1.联合体union特性 联合体所有成员变量共享内存,相对于联合体首地址偏移量都为0 同一时间只能存储1个被选择的变量,对其他成员变量赋值会覆盖原...

    引言:本篇文章有一部分是在sizeof计算结构体大小的基础上进行说明的

    1.联合体union特性

    • 联合体所有成员变量共享内存,相对于联合体首地址偏移量都为0
    • 同一时间只能存储1个被选择的变量,对其他成员变量赋值会覆盖原变量

    2.联合体大小计算准则

    • 联合体大小要至少能容纳最大的成员变量
    • 联合体大小要是所有成员变量类型大小的整数倍

    3.例子

    typedef union u
    {  
        char a;
        int b[5];
        double c;
        int d[3];     
    }U;  
    typedef struct s    
    {     
        int  e;    
        double f;       
        short g;            
        U h;          
        char i[2]; 
    }S;   
    • U大小至少要容纳最大的b[5]=4*5=20字节,同时要是变量类型最大值得整数倍,即sizeof(double)=8的整数倍,所有sizeof(U)=24
    • s的大小计算需要看上一篇关于结构体大小的计算的文章sizeof计算结构体大小,联合体的自身对齐值为成员变量的最大对齐值,也就double的自身对齐值8,所以s得大小为0+4+4+8+2+6+24+2+6=56
    展开全文
  • 先看个例子: #include #include using namespace std; int main(int argc, char *argv[]) { struct B{ char a;//1 char c;//1 int e;//4 double d;... 因为uinon联合体是共享内存的,所以取最大的为sizeof值。

    先看个例子:

    #include <QCoreApplication>
    #include<iostream>
    using namespace std;
    int main(int argc, char *argv[])
    {
        struct B{
            char a;//1 
            char c;//1 
            int  e;//4  
            double d;//8  所以1+1+4+8 补 2
        };//16
        struct P{
          struct B w[2]; //32 按结构体中最大的对齐double 8
          short b;//2   //
          struct B* p;//4 ,为什么是4,看下面的解释
        };
    
        std::cout<<sizeof(P);//40  16*2 + 2 +4 补 2
    
    }
    
    

    struct B* p;的字节为4,为什么呢?C++面试必考内容:是因为所有的指针类型在32位编译器上无论是何种数据类型的指针,它的大小都是4字节,64位编译器上都是8字节。但是容易混淆的是数组名也是指针,那对数组名计算sizeof值是多少呢?也是4吗?要分情况:
    1.数组作为形参时,实质传的是首地址,说白了传的一个指针,所以sizeof值为4.例如:
    void foo(int a[4]){cout<<sizeof(a)} //结果为4
    2.除1外的其他情况,sizeof计算的数组字节数为数组总元素所占的字节数。比如:int a[4] = {1,2,3,4}; sizeof(a) = 4 * 4 = 16

    总之结构体对齐就一个要点,将变量的字节数一直加,加完了超过了最大对齐数时,按照最大对齐数的整数倍进行补齐就好,举个简单例子:
    struct A {char a ; int b; double c;} // 1+4+8 补3 (最大对齐数为8)
    struct B{char a; char b; char c;} //1+1+1 (这个最大对齐数是1吗?当然不是,如果是32位编译器,此时最大对齐数是4,则要补1,是64位的话最大对齐数就是8,则要补5)

    测试:

    struct C{char a;   char b; char c; int d; double e; short f; float g;}
    

    计算:
    1.判断最大对齐数:最大对齐数8
    2.直接加就对了:1 + 1 +1 + 4+8+2+4 补多少呢?补 3
    结果为24
    就这么简单。从上面看出,面试重点:存储上来说:结构体里面的元素是不会共享内存的。结构体的总字节数其实是最大字节数的整数倍

    接下来说union联合体:

    union A{
    	int b; //4
    	char c; //1
    }
    union B{
    	char d[3]; //3
    	double e; //8
    }
    
    union C{
    	int f;
    	double g[4];//32
    }
    

    sizeof(A) = 4;
    sizeof(B) = 8
    sizeof© = 32
    此刻应该发现规律了吧。union是取的最大对齐数的字节数作为sizeof值的。有没有想过为什么呢?
    因为uinon联合体是共享内存的,所以取最大的为sizeof值

    展开全文
  • 当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。联合体有几个注意点:1)联合体是一个结构;2)它的所有成员相对于基地址的偏移量都为0;3)此结构空间要大到足够容纳最"宽"的...

    当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。联合体有几个注意点:

    1)联合体是一个结构;

    2)它的所有成员相对于基地址的偏移量都为0;

    3)此结构空间要大到足够容纳最"宽"的成员;

    4)其对齐方式要适合其中所有的成员;

    联合体的大小取决于它所有的成员中占有空间最大的一个成员的大小。并且对于复合数据类型,按照成员中最大成员的对齐方式对齐。

    而struct结构体与类则需要计算所表示空间中所有成员的大小之和。

    演示代码如:

    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. union U1  
    5. {  
    6.     int n;  
    7.     char s[11];  
    8.     double d;  
    9. };  

    联合体U1中,n占4字节,s[11]占11字节(因为一个char类型的数据占一个字节),d占8字节。那么联合体的大小取决于最大成员的大小即为11字节,但要考率最大字节的对齐方式,则在本例中最大字节为double类型的8字节,所以联合体要扩充成8字节的倍数,离11最接近的字节数,即为16字节。所以联合体的大小为16字节。

    对齐是可以更改的,使用#pragma pack(x)可以改变编译器的对齐方式。C++固有类型的对齐取编译器对齐方式与自身大小中较小的一个。拿上面的代码为例:

    1. #include<iostream>  
    2. using namespace std;  
    3. #pragma pack(2)  
    4. union U1  
    5. {  
    6.     int n;  
    7.     char s[11];  
    8.     double d;  
    9. };  
    由于使用手动更改对齐方式为2,所以double的对齐也变成了2(double本身的对齐为8),所以此时sizeof(u1)=12.


    展开全文
  • sizeof联合体

    2017-04-06 11:37:00
    U大小至少要容纳最大的b[5]=4*5=20字节,同时要是变量类型最大值得整数倍,即sizeof(double)=8的整数倍,所有sizeof(U)=24 s的大小计算需要看上一篇关于结构体大小的计算的文章 sizeof计算结构体大小 ,联合体的...

    .联合体union特性

    • 联合体所有成员变量共享内存,相对于联合体首地址偏移量都为0
    • 同一时间只能存储1个被选择的变量,对其他成员变量赋值会覆盖原变量

    2.联合体大小计算准则

    • 联合体大小要至少能容纳最大的成员变量
    • 联合体大小要是所有成员变量类型大小的整数倍

    3.例子

    typedef union u
    {  
        char a;
        int b[5];
        double c;
        int d[3];     
    }U;  
    typedef struct s    
    {     
        int  e;    
        double f;       
        short g;            
        U h;          
        char i[2]; 
    }S;   
    •  
    • U大小至少要容纳最大的b[5]=4*5=20字节,同时要是变量类型最大值得整数倍,即sizeof(double)=8的整数倍,所有sizeof(U)=24
    • s的大小计算需要看上一篇关于结构体大小的计算的文章sizeof计算结构体大小,联合体的自身对齐值为成员变量的最大对齐值,也就double的自身对齐值8,所以s得大小为0+4+4+8+2+6+24+2+6=56

    转载于:https://my.oschina.net/lmoon/blog/873939

    展开全文
  • 使用sizeof计算联合体的大小

    千次阅读 2017-04-08 22:16:27
    #include using namespace std; union u { double a ; int b ; }; union u2 { char a[13] ; int b ; }; union u3 { char a[13] ; char b ; }; int main() ... cout<<sizeof(u);... cout<<sizeof
  • sizeof(结构体/联合体)

    2016-10-18 17:43:19
    #define COMBINE_STRUCT \ struct TTestStruct {double b;int c;}A struct TTestStructD { ...// 嵌套结构体(联合体)COMBINE_STRUCT,8字体对齐,大小为16,所有int d超始为16,再者前方字段
  • 使用sizeof计算联合体(union)的大小

    千次阅读 2018-02-01 09:47:19
    联合体的大小取决于他所有成员中占用空间最大的一个成员的大小。并且对于复合数据类型,如union,struct, class 的对齐方式为成员中最大成员的对齐方式。 #include using namespace std; union u //u...
  • sizeof

    2014-06-03 10:23:06
    9.联合体sizeof 结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个联合体sizeof也就是每个成员sizeof的最大值。结构体的成员也可以是复合类型,这里,复合类型成员是被作为整体...
  • #include <stdio.h> union u1 { char a[13]; int b; ... printf("%d\n", sizeof(u1));...联合体的大小取决于它所有的成员中占用空间最大的一个成员的大小。u2最大的空间是char[13],但是因为另一个成...
  • 首先,明白什么是struct结构体,什么事union联合体,以及sizeof struct和union都属于复合数据结构,其中可以包含多种数据类型,包括int,short,double,甚至数组和struct,union。 既然是数据结构,那么一定需要...
  • 首先解释一下什么叫做联合体: 1:联合体的各个成员都是从同一个地址开始存放,每次只可以存放一个成员。即:它的所有成员相对于基地址的偏移量都为0。 2:此结构空间要大到足够容纳最“宽”的成员。 3:其对齐...
  • 1.sizeof问题: char *p="12345"; sizeof(p) 结果为4, char p[]="12345"; sizeof(p) 结果为6 请问下上面p不都是地址吗?sizeof是如何区分是指针还是数组? 2.请教一个联合体的问题: union tag_u { int ...
  • printf("联合体的大小为%d\n", sizeof(Foo1)); enum Day{ saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday } workday; //变量workday的类型为枚举型enum DAY printf("enum的大小为%d\n", ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,121
精华内容 4,048
关键字:

联合体的sizeof