结构体struct

Struct与C++类的不同

1. 成员变量和函数的默认范围方式不同:struct是public;类是private

2. struct 可以用 {} 初始化

3. C语言的struct不可以包含函数,C++中可以,但不能直接在结构体内实现,是将一个函数的地址直接付给结构体的成员函数

4. C++中的结构体可以包含构造函数

 

Struct {};  Struct A{};  Struct {}B;  Struct A{}B; 的区别:

结构体声明由三部分组成,tag, member-list, variable-list

struct tag
{
    member-list;
}variable-list;

 所有可选部分不能全部省略--它们至少出现2个。

//1.是错误定义形式,即没有该形式
//能编译通过,但无法使用该结构体
struct 
{
    int x;
    int y;
};

//---------------------------------------------------------------------------------------

//2.结构体类型定义,定义{}中的结构为一个名称是“A”的结构体
struct A{
    int x;
    int y;
};
//等价于第2种:struct A{};
typedef struct TagA{
    int x;
    int y;
}A;  //A为TagA的别名,是等同的。


//---------------------------------------------------------------------------------------


//3.
//结构体变量定义,以{}中的结构,定义一个名称为”B”的变量。
//这里的结构体称为匿名结构体,是无法被直接引用的 
// 这种写法是最没人用的,因为它的定义是一次性的
struct{
    int x;
    int y;
}B;

//这种写法的改良是,在前面加关键字:typedef,使B成为匿名结构体类型的别名。
typedef struct{
    int x;
    int y;
}A;  

//---------------------------------------------------------------------------------------

// 4. 即2和3 的结合
struct A
{
    int x;
    int y;
}B,C;


Struct前加typedef的区别

typedef strcut A{}a;

相当于定义了struct A该类型的别名为a,之后声明该类型时不需要再使用struct A variable1;

而可以直接使用类型别名a variable1;

该问题主要存在于C语言中,C++中声明该类型变量时也可以不用加struct,直接A variable1;

 

内存对齐问题

Union与struct

Union:C/C++关键字 共用体(联合)

在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。

所以union的长度是其中变量所占长度最长的那个,(不求和)之后还要补齐:即保证是最长变量类型的整数倍

union A  
{
    int a[5];       //20
    short b;     //2
    double c;    //8
    char p2;     //1
};

struct B { 
    int n; // 4字节 
    A a; // 24字节 
    char c[10]; // 10字节 
};

union的大小 = 20;-----------原本取最大,应该为20,但要和最大变量类型长度对齐,即和8字节的double对齐,应为其整数倍,所以大于20的最接近8的整数倍的数为24.

struct的大小 = 8+24+16 = 48;------------因为A是8字节对齐的,所以其他也要8字节对齐

对齐系数

程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数” 

将union的定义放struct外面,与放struct里面,占用内存大小不同:

union A
{
	int t;   //4
	short m; //2
	char p;  //1
};	

struct B  
{
    A a;          //4
    double c;    //8
    char p2;     //1
};

//注意,上面struct B{};等效于下面表达:
//区别于下一条代码框的内容
struct B  
{
    union A
    {
	int t;   //4
	short m; //2
	char p;  //1
    }a;                //定义union变量a;
    double c;    //8
    char p2;     //1
};

B的大小 = 8+8+1---即17---------- > 对齐为24;

struct B  
{
    union A
	{
	    int t;   //4
	    short m; //2
	    char p;  //1
	} ;
    double c;    //8
    char p2;     //1
};

B的大小 = 4+8+1----即13---------- > 对齐为16;

猜你喜欢

转载自blog.csdn.net/qian27enjoy/article/details/82813452