目录

前言:

1、结构体:

1.1 结构体的基础知识:

1.2 结构体的声明:

         1.3 结构体的特殊声明:

         1.4 结构体的自引用: 

         1.5 结构体变量的定义和初始化 :

         1.6 结构体内存对齐 :

     1.6.1 结构体内存对齐方法一:

     1.6.2 结构体内存对齐方法二:

     1.6.3 为什么要存在内存对齐呢?:

1.7 修改默认对齐数 :

1.8 结构体传参 :

1.9 通过结构体实现位段 (位段的填充&可移植性):

1.9.1 什么是位段:

1.9.2 位段的内存分配:

1.9.3 位段的跨平台问题 :

1.9.4 位段的应用:


前言:

     所谓自定义类型即指:自己定义的类型,包括:结构体,枚举,联合,其中,结构体部分的内容主要包括:结构体类型的声明、结构的自引用、结构体变量的定义和

初始化 、结构体内存对齐、结构体传参、结构体实现位段(位段的填充&可移植性)枚举部分的主要内容包括:枚举类型的定义、枚举的优点、枚举的使用 联合部

的内容主要包括:联合类型的定义 、联合的特点、联合大小的计算

1、结构体:

1.1 结构体的基础知识:

     结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。数组是一种相同类型元素的集合,结构体也是一些值的集合,,但是不同的

是,结构的每个成员的类型可以是不同的。

1.2 结构体的声明:

     

struct是结构体关键字tag是结构体名字,也称为结构体标签名struct tag整体称为结构体类型,,struct tag下面的{ }内部的内容都是结构体成员变量,这些成员变量

一般不需要初始化它的值,只需要定义一下类型即可,要注意{ }后面的分号;不要省略掉;

其中{ }后面的 variable-list 也是一个结构体变量,且是一个全局变量,结构的作用就是用来描述一个复杂对象的。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{//例如描述一个学生struct Stu{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号}; //分号不能丢return 0;
}

1.3 结构体的特殊声明:

     在声明结构的时候,可以不完全的声明,此时的不完全的声明,指的就是匿名结构体类型,比如:

//匿名结构体类型
struct
{int a;char b;float c;
}x;struct
{int a;char b;float c;
}a[20], *p;

该匿名结构体类型省略了结构体名字,即,结构体标签名,这就称为是匿名结构体类型,即结构体的不完全声明。

//匿名结构体类型的指针
struct
{int a;char b;float c;
}* ps;

此时{ }后面的*和ps不是一起的,和前面的匿名结构体类型组合成为匿名结构体类型的指针,用该指针类型创建了一个全局变量叫做ps,由上述两个图我们发现,匿名结

构体类型和匿名结构体类型的指针中的结构体成员变量都是一样的,那能不能把结构体变量x的地址存放在结构体指针变量ps中呢,即:

//匿名结构体类型
struct
{int a;char b;float c;
}x;//匿名结构体类型的指针
struct
{int a;char b;float c;
}* ps;int main()
{ps=&x;return 0;
}

经过编译可知:

会报警告,在编译器看来,虽然两者中的结构体成员变量都是一样的,但是两种类型仍不相同,如果两者类型不同的话,该结构体指针ps中就不能存放该结构体变量x的

地址,所以这种写法是错误的,不合理的,编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。

不完全声明的结构,即匿名结构体类型创建好了之后,只能使用一次,后面就不可以使用该匿名结构体类型去创建变量了,并且只能使用在创建全局变量的时候使用那

么一次,这一次使用可以创建>=0个全局变量,然后在后面创建局部变量的时候,就不能再使用了,,因为不知道结构体名字,即不知道结构体标签名,就够不成一个完

整的结构体类型,所以该匿名结构体类型具有一定的局限性。

1.4 结构体的自引用:

     其作用主要是用来实现像链表这样的结构,结构体里面可以包含结构体变量的,即,一个结构体里面包含另外一个结构体类型的变量作为它的成员,这是没有问题

的,比如:

但是,要注意的是,虽然,结构体里面可以包含结构体变量,即,一个结构体里面包含另外一个结构体类型的变量作为它的成员,是可以的,但是,一个结构体里面

能包含他自身的结构体类型的变量作为他的成员,比如: 

我们先假设这是可以的,现在拿着结构体类型struct N 去创建一个局部变量sn,,如果让求该结构体变量sn所占内存空间的大小的话,我们就发现,当求该结构体所

占内存空间大小的时候,会出现死递归的现象,,所以这是不允许的,是错误的,所以对于结构体来说,自己里面不能包含自己,这是错误的, 

那结构体如何实现自引用呢?

数据结构即,数据在内存中存储的结构,比如:

现在有一组数字,1,2,3,4,5 如果想把这一组数字存储在内存里面,可以怎么样存储呢?

1.

给一块连续的空间,把数字存放进去,这就是使用了数组,,像这种,能够在内存中找到一块连续的空间把该数字存储起来的情况, 这种数据结构我们称之为:顺序

表,即,按照一定的顺序把数据存储在内存中。

2.

另外一种存储方式就是,把数据任意存储在内存中,并不是按照一定的顺序进行存储的,就是随机存储的,虽然是随机任意存储的,但是,我们可以找得到,1找2,2找

3,..4找5,等5找到之后,就不需要再找了,停下来即可,,所以,只要能够知道1的位置,就可以通过后面来把所有的数字全部找到,像这种用链条一样的形式把每一

个元素都找,并且每个元素在内存中并不是连续存放的情况时,,我们这种数据结构为:链表。

顺序表和链表统称为线性数据结构,即:

其次还有树形数据结构,典型的就是二叉树,

我们把链表每个存储数据的东西叫做节点,如何通过节点把每个数据串起来呢,,那么此时的节点应该怎么设计呢?

节点分为数据域和指针域,前一部分是数据域,后一部分是指针域,为了使得通过前面一个数据找到后面一个数据,,我们可以把后面一个数据的地址存放到前面一个

数据的指针域中去,对于数据5来说,没有下一个节点了,,所以就在存放数据5的节点中的指针域里面放置一个空指针NULL,就可以满足要求了,数据域里面存放的就

是该节点要存放的数据,而指针域是用来存放下一个节点中数据的地址的,如果把下一个节点中数据的地址存放在前一个节点的指针域中的话,就需要指针来存储,那

么就需要的是结构体指针。

struct Node
{int date;struct Node* next;
};

对于指针变量的大小,是可以计算的,4byet或者8byte,,上图整体就是一个节点,该节点中的数据可以找到与自己同类型的下一个节点中的数据,这就称为是结构体

的自引用,在此假设节点中数据的类型是结构体类型。

所以结构体的自引用的实现过程中,结构体里面不是包含一个同类型的结构体变量,而是包含一个同类型的结构体指针。

正确的结构体自引用的方式即为:

//代码2
struct Node
{int data;struct Node* next;
};

通过上图我们可以联想,是否能够改写成匿名结构体类型,即:

//代码2
struct 
{int data;struct Node* next;
};

就是把结构体名字,即结构体的标签名省略掉,,这样也是不可以的,,因为,如果再这里省略掉了结构体标签名,那么结构体成员变量中的 struct Node* next是怎么

来的呢,,所以,这样是不行的,错误的。

我们知道typedef是用来重命名的,既然上图不行,那我们能不能把该匿名结构体类型重新命名为一个新的名称呢,比如:

该图就表示,把这个匿名结构体类型加上typedef重新命名为红色框里面的Node,然后再拿着这个重命名后的Node结构体类型去定义指针变量next,这也是不行的,这

是因为,,你要产生新的Node,前提是你必须要有这个结构体类型,即下图蓝色的匿名结构体类型才可以

但是,我们观察蓝色框中发现,Node* next目前还不知道是什么意思呢,,因为,首先要有该匿名结构体类型才可以去重命名Node,但是,该匿名结构体类型中有参数

是不确定的,因为现在还没命名出来新的Node,,所以,Node* next 系统是不认识的,所以就不能进行重命名,更不用说去定义指针next了,,所以这也是不行的,就

是,我们首先要明确这个匿名结构体类型之后才可以去重命名Node,,然后再拿着Node去定义指针变量next,,但是,现在第一步中的匿名结构体类型就不明确,所

以,就无法得到重命名后的Node,更不用说再拿着Node去定义指针变量next了,,前后顺序出现错误,这种写法错误,

即使在C++中,也是不对的,所以只能写成:

typedef struct Node
{int date;struct Node* next;
}Node;

 这样的话,就是先有了结构体类型,并且参数都明确,然后再加上typedef再去重命名为Node,,这样才是可以的。

1.5 结构体变量的定义和初始化

有了结构体类型,那如何使用该结构体类型定义结构体变量,其实很简单:

关于变量的初始化和定义以及访问:

 

1.6 结构体内存对齐 

     已知,一个int整型所占内存空间大小为4byte、一个char字符类型所占内存空间大小为1byte、一个float单精度浮点型所占内存空间大小为4byte、一个short短整型所

占内存空间大小为2byte、一个long长整型所占内存空间大小为4byte、一个long long长长整型所占内存空间大小为8byte、一个double双精度浮点型所占内存空间大小为

8byte、除此之外,还知道数组所占内存空间的大小可以根据该数组元素个数乘以该数组每个元素的类型所占内存空间大小就可以知道整个数组所占内存空间的大小为多

少, 那么在这里,怎么计算一个结构体所占内存空间的大小呢?

例题:

struct S
{char c1;//1byteint i;//4bytechar c2;//1byte
};
int main()
{struct S s = { 0 };//不完全初始化printf("%d\n", sizeof(s));//6 ?//答案不是6byte,而是12byte,这是为什么呢?return 0;
}

当计算一个结构体所占内存空间大小的时候,不能简单的把每个结构体成员变量的类型的大小进行累加,这是不对的,因为计算结构体所占内存空间大小的时候,会涉

及到内存布局的问题,即内存对齐的问题结构体成员变量在内存中到底是怎么放置的呢?

1.6.1 结构体内存对齐方法一:

一、结构体成员变量都是变量的基本类型:

总体上遵循两个原则: 

(1)、整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。 

(2)、数据对齐原则---内存按结构体成员的先后顺序排列,当排到该成员时,其前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够则补齐,依次向后类推。

例1、

struct  A
{char  a;double  b;int  c;char  d;
};

那么,这个结构体占用多少字节呢?

1、它的第一个成员是char 类型的 a,占 1 个字节,放入结构的0地址处:

2、下来要存储的是第二个成员是double 类型的 b,占 8 个字节,它该怎么存放呢?

我们回想到原则(2)中说,存储到某个成员时,前面已经存放的所有成员所占的总空间大小是该成员大小的整数倍,不够则补齐!

也就是1图中显示的下一个存储成员起始地址应该是 8 的整数倍,而上图中显示的起始地址为 1 ,并不是 8 的整数倍,所以需要补齐。向后增加地址数到 8 (补齐操

作),这时 8 是 8 的整数倍,可以存储。则将成员 b 存放到 8 地址处:

3、下来要存储的是第三个成员是 int 类型的 c,占 4 个字节,由上图所知,下一个存储成员的起始地址是16,刚好是 4 的倍数。所以不用补齐,直接用 4 个字节来存储成员 c:

4、最后存储的是第四个成员是 char 类型的 d,占 1 个字节。由上图所知,下一个存储成员的起始地址是20,刚好是 1 的倍数。所以不用补齐,直接用 1 个字节来存储 成员 d: 

5、把所有成员都存储到位,这就完了吗? 

   No!我们还要考虑最后一个要素:原则(1),整体空间是占用空间最大的成员(的类型)所占字节数的整数倍!而这个结构的占用空间最大的成员是 double 类型的

b,占用 8 个字节。而现在整体空间由上图所知是 21 个字节,并不是 8 的倍数,所以仍需要补齐!补多少呢? 比 21 大的最小的 8 的倍数是 24,所以就补到 24 字节:

所以最终算下来,结构体 A 的大小是 24字节!

6、测试:

 

 

二、结构体成员变量中包含另外一个结构体时:

我们把本结构体称为父结构体,把成员结构体变量称为子结构体

(1)、整体空间是子结构体与父结构体中占用空间最大的成员(的类型)所占字节数的整数倍。

(2)、数据对齐原则---父结构体内存按结构体成员的先后顺序排列,当排到子结构体成员时,其前面已摆放的空间大小必须是该子结构体成员中最大类型大小的整数

倍,如果不够则补齐,依次类推。

(3)、数据对齐原则---内存按结构体成员的先后顺序排列,当排到该成员时,其前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够则补齐,依次向后类

推。

例2、

struct  A        //子结构体
{char  a;double  b;int  c;char  d;
};struct  B        //父结构体
{char a;struct  A  b;int  c;
}; 

那么,结构体 B 占多少字节呢?通过之前分析,我们已知结构体 A 的大小为 24 字节:

1、首先存储成员 a ,占用 1 个字节,下一个存储地址是 1:

2、其次存储成员 b,而 b 是结构体 A 的变量,结构体A中最大类型大小double,占8 个字节,所以存储该变量地址应是 8 的倍数,所以需要补齐地址到 8 ,然后存储大

小为 24 字节的变量 b,因为b是结构体A的变量,所以要存储A所占的空间大小,即24byte,而不是存储double  b里面的8byte,所以,当遇到子结构成员(b)的时候,

往里存放的应该是整个子结构所占空间的大小;

3、最后存储成员 c,成员 c 类型是 int,占用 4 个字节。由上图可知 c 的存储始地址是 32 ,刚好是 4 的倍数,并不用补齐,所以直接存储:

4、最后也要看整体空间大小是否满足原则(1) :

我们发现,当前结构体总大小是 36 ,而子结构体和父结构体中最大类型是double,要注意,这时候要把struct A b这个数值24byte排除,他不能算入,所以占 8 个字

节。而 36 并非是 8 的整数倍,所以需要补齐为 8 的整数倍。即  40 字节。

所以最后,结构体B的大小是 40 字节。

5、测试: 

三、结构体成员变量中包含数组类型时:

之前的理解了,那么这个也就不难理解!

只要不把数组看作数组,而把它看成一个个类型相同的成员变量序列!然后用前面的计算方法计算即可。

struct Stu
{char name[20];int age;
};
int main()
{printf("sizeof(struct Stu) = %d\n", sizeof(struct Stu));return 0;
}

比如,这里是一个char类型的数组,我们可以不把他看成一个数组,而是看成20个char类型的变量,即:

struct Stu
{char 1;char 2;..char 20;int age;
};
int main()
{printf("sizeof(struct Stu) = %d\n", sizeof(struct Stu));return 0;
}

首先存储的是成员1,占用1byte,下一个存储地址是1,我们发现结构体里面没有结构体成员是另外一个结构体,即没有子结构体和父结构体的概念,所以我们就要用第

一种方法的规律来做,再往下走,前面摆好的空间大小是1,是我char 2结构体成员变量的所占的1byte的整数倍,即1/1=1,是整数倍,所以不需要补,直接存储就行,

再往下走,前面摆好的空间大小是2,是我char 3结构体成员变量的所占的1byte的整数倍,即2/1=2,是整数倍,所以不需要补,直接存储就行.......一直等到把20个char

类型存放完,然后就开始存放int整型,,我们前面摆好的空间大小是20byte,他是我,int age结构体成员变量所占的4byte的整数倍,即:20/4=5,是整数倍,,所以不

需要补,直接存储,再存进去4byte,所以整体空间就是24byte,然后,在整个结构体中,占空间最大的成员就是age,类型是int,所占空间为4byte,,我们的整体空间

是24byte,又是我占用空间最大的成员age,类型为int的所占空间大小为4byte的整数倍,即:24/4=6,是整数倍,所以就不需要补,,最后所占空间就是24byte;

测试:

 

四、包含位域成员的结构体大小计算:

  使用位域的主要目的是压缩存储,其大致规则为:

(1)、如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止。

(2)、如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍。

(3)、如果相邻的位域字段的类型不同,则各编译器的具体实现有差异。VC6采取不压缩方式,gcc采取压缩方式。

(4)、如果位域字段之间穿插着非位域字段,则不进行压缩。

(5)、整个结构体的总大小为最宽的基本类型成员大小的整数倍。

例题1:

//在Linux + gcc 环境下,以下结构体的sizeof值是多少? 
struct A
{int f1 : 3;char b;char c;
};

解析: sizeof( struct A ) 的值为 4, 由于 f1 只占用了 3 个位,不足一个字节,假设 f1 摆放在地址 0 处,则地址1可用,故 b 摆放在地址 1 处,则 c 摆放在 2 处, 0 ~ 2

共 3 个字节不是 int 的整数倍(整个结构体的总大小为最宽基本类型成员int大小的整数倍),故地址 3 处补齐,共四个字节。如下图:

例题2、

//如果在VC环境下,sizeof(struct A)的值为 8!
struct B
{char f1 : 3;char f2 : 4;char f3 : 5;
};

解析: 按照之前规则,第一个字节仅能容下f1 和 f2,所以 f2 被压缩存储到 第一个字节中,而f3 只能从下一个字节开始存储,所以sizeof( struct B )的值为 2 ;如下图:

例题3、

//相邻位域类型不同的情况
struct  C
{char  f1:3;short  f2 : 4;char f3 : 5;
};

解析: 由于相邻位域类型不同,在VC中不压缩,所以sizeof值为 6 ,而在gcc中压缩,其值为 2 。 

例题4、

  struct  D{char  f1:3;short  f2 : 4;char f3 : 5;};

解析:非位域字段穿插其中,不会产生压缩,在VC和gcc中sizeof大小均为 3 。

1.6.2 结构体内存对齐方法二:

一、结构体成员变量都是变量的基本类型:

1. 第一个成员要从与结构体变量偏移量为0,即相对于起始位置的偏移量为0的地址处进行存放,第一个成员变量永远都从该位置开始往后存放。
2. 其他成员变量要放从与结构体变量偏移量的值是对齐数整数倍的地址处开始存放,即其他成员变量要从与相对于起始位置的偏移量值是对齐数的整数倍的地址处进
行存放,,其中,对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值,VS中默认的对齐数的值为8 ,Linux中,gcc编译器下没有默认对齐数的概念,本质上就
是以该成员所占内存空间的大小作为对齐数的。
3. 结构体总大小最大对齐数(每个成员变量都有一个对齐数 )整数倍。  
例题1、
struct S
{char c1;//1byteint i;//4bytechar c2;//1byte
};
int main()
{struct S s = { 0 };//不完全初始化printf("%d\n", sizeof(s));//6 ?//答案不是6byte,而是12byte,这是为什么呢?return 0;
}

1、第一个成员要从与结构体变量偏移量为0,即相对于起始位置的偏移量为0的地址处进行存放。

第一个成员是char类型的c1,他要从相对于起始位置的偏移量为0的地址进行存放,由于c1是char类型的,所以占1byte,

2、 其他成员变量要从与结构体变量偏移量的值是对齐数整数倍的地址处开始存放,即其他成员变量要从相对于起始位置的偏移量值是对齐数的整数倍的地址处开始

存放,,其中,对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值,VS中默认的对齐数的值为8 ,Linux中gcc编译器下没有默认对齐数的概念,本质上就是以

该成员所占内存空间的大小作为对齐数的。

其他成员变量即指,除了第一个成员变量之外的成员变量,接下来就是其他成员变量中的整型变量i,,该变量的大小是4byte,VS下默认的对齐数是8,所以取两者较小
值得到的对齐数就是4,所以存放整型变量i的话,按理说应该从字符变量c1后面的地址开始存放,但是,该地址与起始位置的偏移量是1,1不是4的倍数,所以不能从这里
开始存放整型变量 i,再看要求,是指,把整型变量i存放到与结构体变量偏移量的值是对齐数的整数倍处,即整型变量i要放在相对于起始位置的偏移量的值是对齐数的
整数倍处,这里的对齐数就是4,所以整型变量i要从与起始位置的偏移量为4的地址处开始存放,又因整型变量i的类型是int类型,,占4byte,则有:

再看字符变量C2,,C2所占内存空间的大小就是1byte,VS下默认的对齐数就是8,,所以取较小值得到的就是1,所以,字符变量C2要从相对于起始位置的偏移量的值

是1的倍数的地址处进行存放, 而在int整型变量 i 存放在内存后的下一个位置相对于起始位置的偏移量是8,8又是1的倍数,所以,字符变量C2就可以从与起始位置偏移

量为8的地址处进行存放,C2是char类型,占1byte,则有:

此时,从相对于起始位置的偏移量为0的位置到相对于起始位置的偏移量为8的位置,两者中间的空间,就分配给了C1,i,C2了,,一共占据9byte,但是9byte并不是结

构体所占内存空间的总大小,还要满足第三个条件

3. 结构体总大小最大对齐数(每个成员变量都有一个对齐数 )整数倍。  

目前来说,结构体的大小是9byte,成员变量C1的对齐数就是1,成员变量 i 的对齐数是4,成员变量 C2的对齐数是1,所以所有的成员变量的对齐数的最大值就是4,

而,结构体的总大小应该是最大对齐数的整数倍,,现在结构体的大小是9byte,不是4的整数倍,所以不可以作为结构体的总大小,所以要再浪费3个字节,即,浪费3

个空间,即得,结构体的总大小是12byte。 

由上图可知,从偏移量为0的地方到偏移量为11的地址,都开辟给了结构体变量,所以该结构体变量所占内存空间的大小就是12byte。

4、测试:

例题2、

//练习2
struct S2
{char c1;char c2;int i;
};
printf("%d\n", sizeof(struct S2));
//按照上述方法得出的结果是8byte。

例题3、

//练习3
struct S3
{double d;char c;int i;
};
printf("%d\n", sizeof(struct S3));
//按照上述方法得出来的结果就是 16 byte、

二、结构体成员变量中包含另外一个结构体时:

1. 第一个成员要从与结构体变量偏移量为0,即相对于起始位置的偏移量为0的地址处进行存放,第一个成员变量永远都从该位置开始往后存放。
2. 其他成员变量要放从与结构体变量偏移量的值是对齐数整数倍的地址处开始存放,即其他成员变量要从与相对于起始位置的偏移量值是对齐数的整数倍的地址处进
行存放,,其中,对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值,VS中默认的对齐数的值为8 ,Linux中,gcc编译器下没有默认对齐数的概念,本质上就
是以该成员所占内存空间的大小作为对齐数的。
3. 结构体总大小最大对齐数(每个成员变量都有一个对齐数 )整数倍。  
4.如果嵌套了结构体的情况,嵌套的结构体,即子结构体,要从与相对于起始位置的偏移量的值是子结构体自己的结构体成员变量最大对齐数的整数倍处的地址进行存
放,结构体的整体大小就是所有结构体成员变量的最大对齐数的整数倍,包括子结构体里面的成员变量父结构体里面除了子结构体之外的成员变量。
//练习4-结构体嵌套问题
struct S4     //子结构体
{double d;char c;int i;
};
struct S5     //父结构体
{char c1;struct S4 s4;double d;
};
int main()
{struct S5 s5 = { 0 };//不完全初始化printf("%d\n", sizeof(s5));return 0;
}

由之前的题可知,sizeof(struct S4)= 16byte,,现在要在内存中放置结构体变量s4,已知:

如果嵌套了结构体的情况,嵌套的结构体,即子结构体,要从与相对于起始位置的偏移量的值是子结构体自己的结构体成员变量最大对齐数的整数倍处的地址进行存
放,结构体的整体大小就是所有结构体成员变量的最大对齐数整数倍,包括子结构体里面的成员变量父结构体里面除了子结构体之外的成员变量。
子结构体,要从与相对于起始位置的偏移量的值是子结构体自己的结构体成员变量最大对齐数的整数倍处进行存放,而子结构体自己的成员变量有的d,它的对齐数是
8,还有c,它的对齐数是1,还有 i ,它的对齐数是4,三者中最大对齐数就是8,所以,子结构体要从与相对于起始位置的偏移量的值是子结构体自己的结构体成员变量
中最大对齐数8的整数倍处开始存放,则有:

 最后要放置的变量是双精度的double b,它的大小是8byte,VS下默认的对齐数也是8,所以,取较小值作为对齐数就是8,,现在双精度类型的浮点型变量b要从与相对

于起始位置的偏移量值是8的整数倍的地址处行存放,,因为24是8的倍数,所以直接从偏移量是24的位置处开始存放双精度浮点型变量b,,则有:

现在结构体所占内存空间的大小就是32byte,,又因为:结构体的整体大小就是所有结构体成员变量的最大对齐数整数倍,包括子结构体里面的成员变量父结构体

里面除了子结构体之外的成员变量。

此时,子结构体里面的成员变量的最大对齐数是8,父结构体里面,除了子结构体之外的成员变量的最大对齐数是、也是8,所以综合在一起,就是所有的结构体成员变

量,除了父结构体里面的子结构体之外的所有的结构体成员变量的最大对齐数就是8,而32又是8的整数倍,所以,该结构体总大小就是32byte。

1.6.3 为什么要存在内存对齐呢?:

因为通过上述可知,如果存在内存对齐的话,,就避免不了会浪费内存空间,那为什么还要存在内存对齐呢?

1. 平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特 定类型的数据,否则抛出硬件异常。

2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访
问。
总体来说:
结构体的内存对齐是拿空间来换取时间的做法。

那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:
让占用空间小的成员尽量集中在一起。
//例如:
struct S1
{char c1;int i;char c2;
};
struct S2
{char c1;char c2;int i;
};
struct S3
{int i;char c1;char c2;
};
int main()
{printf("%d\n", sizeof(struct S1));//答案是12byteprintf("%d\n", sizeof(struct S2));//答案是8byteprintf("%d\n", sizeof(struct S3));//答案是8byte//S1和S2类型的结构体成员变量是一模一样,但是S1和S2所占空间的大小有了一些区别。//所以,在结构体成员变量一样的情况下, 如果调整各结构体成员变量的顺序,在对齐的过程中,所占内存空间的大小是可能不一样的。//所以,只要设计得当,是可以节省内存的,即,只要保证尽量让占用空间小的成员尽量集中在一起,就会节省空间,观察S2,S3,只要保证让//占用空间小的成员尽量集中在一起,看成一个整体,不需要考虑整体的顺序,都是可以节省空间的。return 0;
}

1.7 修改默认对齐数 

已知,在VS编译器下, 默认对齐数是8,那么该默认对齐数的数值是否能够发生改变呢?

之前我们见过了 #pragma 这个预处理指令,这里我们再次使用,可以改变我们的默认对齐数。
#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8// #pragma pack(8) === #pragma pack(),,两者都是默认对齐数是8.
struct S1
{char c1;int i;char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认,原来的默认本来就是8,所以,这里的 #pragma pack 没起作用。#pragma pack(1)//设置默认对齐数为1
struct S2
{char c1; //1  1 —— 1int i;   //4  1 —— 1    三者最大对齐数就是1,相当于是没有对齐。char c2; //1  1 —— 1
};
#pragma pack()//取消设置的默认对齐数,还原为默认,默认是8#pragma pack(2)//设置默认对齐数为2
struct S3
{char c1; // 1  2 —— 1int i;   // 4  2 —— 2    三者最大对齐数就是2;char c2; // 1  2 —— 1
};
#pragma pack()//取消设置的默认对齐数,还原为默认,默认是8int main()
{//输出的结果是什么?printf("%d\n", sizeof(struct S1)); //12printf("%d\n", sizeof(struct S2)); //6printf("%d\n", sizeof(struct S3));//8//根据上述总结的方法即可得到这些结果。return 0;
}

默认对齐数就是限制了结构体成员变量的最大对齐数就是该默认的数字。

当把默认对齐数设置为1的时候,就相当于是没有进行对齐,在设置默认对齐数的时候,一般不会设置成奇数,都是设置成偶数,除非在特定的情况下,比如,就是不需

要对齐的情况下,就可以把默认对齐数设置成1

结构体在对齐方式不合适的时候,我么可以自己更改默认对齐数

百度笔试题:
写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明:
考察: offsetof 宏的实现 ,注:这里还没学习宏,可以放在宏讲解完后再实现。
offsetof (type,member) === int offsetof (type,member)        头文件是:#include<stddef.h>

type:结构体类型,       member:结构体成员变量的成员名,返回的是结构体成员变量相对于起始位置的偏移量,是一个整型数字。

 

1.8 结构体传参 


struct S 
{int data[1000];int num;
};
//结构体变量的值进行传参
void print1(struct S s) 
{printf("%d\n", s.num);
}
//结构体变量地址传参
void print2(struct S* ps)
{printf("%d\n", ps->num);
}
int main()
{struct S s = { { 1, 2, 3, 4 }, 1000 };//不完全初始化print1(s);   //传值调用   把结构体变量的值传过去//传值调用,形参就是实参的一份临时拷贝,当实参所占内存空间较大的时候,形参也要开辟一个与之大小相同的空间,传递的时候内存很大,用时较多,//传过去之后,形参部分还要开辟相同的空间进行存储,所以会造成时间和空间上的双重浪费,//改变形参不会影响实参,把数据拷贝过去之后,只能使用,不能更改实参中的数据,不好。print2(&s);  //传址调用   把结构体变量的地址传过去//只把地址传过去了,地址和指针变量所占内存空间的大小是4/8byte,所以不会浪费很多空间,并且传递的时候由于内存较小,时间也较短,效率很高//改变形参会影响实参,功能强大, 较好。return 0;//传址调用会更好一些,函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。//如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。//当使用传址调用的时候,如果不想通过形参改变实参的话,只需要在形参部分*的左边加上const即可,可以做到想改就改,不想改就不改。//结构体变量传参的时候,一般都是传地址。
}

1.9 通过结构体实现位段 (位段的填充&可移植性):

1.9.1 什么是位段:

位段的声明和结构体是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int,或者char类型(整形家族) 。
2.位段的成员名后边有一个冒号和一个数字。
比如:
struct A 
{int _a:2;int _b:5;int _c:10;int _d:30;
};
A就是一个位段类型,那位段A的大小是多少?
struct A 
{int _a : 2;    //_a占2个bit位int _b : 5;    //_b占5个bit位int _c : 10;   //_c占10个bit位int _d : 30;   //_d占30个bit位
};
int main()
{printf("%d\n", sizeof(struct A));//8bytereturn 0;
}

1.9.2 位段的内存分配:

1. 位段的成员可以是 int      unsigned int      signed int 或者是 char (属于整形家族)类型
2. 位段的空间上是按照需要以 4个字节( int,包括上面三种)或者1个字节( char )的方式来开辟的。
3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
struct A 
{//看到int,是按照4byte进行开辟的,一个整型一个整型的开辟,所以,在这里先开辟一个整型//4byte === 32bit//_a要走2个bit,还剩30bit,_b再要走5bit,还剩25bit,_c再要走10个bit,还剩15bit位,后者如果所要的bit位的个数在前面还够提供的时候//会先使用上一次剩余的,而不会再开辟新的,当_c要完10个bit位时,还剩15个bit,_d再要30个bit,不够用了,所以会再开辟一个整型,即再开辟4byte//32bit,现在出现一个问题,在新的4byte开辟之前还剩余了15个bit,那这15个bit会先使用掉呢,即新的和旧的4byte中各使用了15个bit,//还是直接不使用,而去使用了新开辟的4byte中的30bit位呢? —— 答案是不使用之前剩下的,而去直接使用新开辟的4byte中的30bit位。//C语言本身并没有规定上述实现过程,这只是在VS编译器下的实现方式,在别的编译器下不一定是直接使用新的4byte,所以说,位段涉及到了很多的不确定因素,不可以跨平台使用,如果避免不了不使用位段,就需要把各个平台的实现方式搞清楚,从而写出不同的代码来实现功能,在VS编译器下,每个字节内部的bit位使用顺序不清楚是从低到高使用还是从高到低使用,不确定因素。//不管怎么样,在此过程中,一共开辟了2次4个byte,所以共开辟了8byte,所以所占内存空间的大小就是8byte,结果就是8.int _a : 2;    //_a占2个bit位int _b : 5;    //_b占5个bit位int _c : 10;   //_c占10个bit位int _d : 30;   //_d占30个bit位
};
int main()
{printf("%d\n", sizeof(struct A));//8bytereturn 0;
}

现在问题出现了,我们知道,一个int占4byte,32bit,好好的int为什么要规定成占2,5,10,30个bit位呢

主要是为了用来节省空间,比如:假设性别共有3种情况,男,女,保密,如果使用二进制数字,即比特位来表示的话,只需要两个二进制数字,两个bit位就可

以表示出所有情况,因为两个bit位可以表示2^2=4种情况,00,01,10,11 ,这四种情况,就完全可以把上面3种性别表示出来,如果不写成位段的情况,_a就会开

4个byte,32bit,可以表示2^32种情况,只用来表示3种性别,就会造成内存空间浪费,所以,如果一些结构体成员变量取值不是很大的时候,就可以使用

段来节省空间,避免浪费,根据实际的需求,通过位段来分配所需要的内存块的大小,根据实际需求来设置位段的大小;

我们常见的通过结构体来实现的位段,结构体成员变量的类型,即位段的类型一般都是相同的,也有不相同的情况,在这里不进行讨论,默认为位段的类型都是

相同的即可。

由上面的位段来看,_a,_b,_c,_d中能存储的数据大小肯定被限制了,因为bit位数不同,存储能力也不同。

还有就是:int _d:50 这是不对的,因为,int占4byte,最多有32bit,现在要求有50个bit位,肯定是不行的,位段的大小不可以超过该类型本身占据的bit位的个

数,最多相等。

使用位段来节省内存空间的时候,在VS编译器下一个字节(char)/四个字节(int)内部的地址从低位向高位来使用的,当bit位不够用的时候,会进行开

辟新的空间,,在VS编译器下,会去直接使用新开辟的字节中的bit位,而不使用旧空间中的bit位,直接浪费掉。

对于数组来说,随着下标的增加,地址从低到高进行使用,对于结构体中的结构体成员变量来说,按照顺序从低地址往高地址进行使用,同时,监视内存中的地

址,是从左往右地址依次增加,所以,当我们绘制数组和结构体成员变量所占内存空间的时候,常默认为从左到右地址依次增加,而位段是由结构体实现的,所

以位段中的结构体成员变量内存开辟和结构体是一样的,所以在绘制图形的时候,也是从左往右进行绘制

例题:

//一个例子
struct S {char a:3;char b:4;char c:5;char d:4;
};
struct S s = {0};
s.a = 10; 
s.b = 12;
s.c = 3; 
s.d = 4;
//空间是如何开辟的?

 1.9.3 位段的跨平台问题

1. int 位段被当成有符号数还是无符号数是不确定的。
2. 位段中最大位的数目不能确定。(16位机器int最大16bit,2byte,32位机器int最大32bit,4byte,写成27,在16位机器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的
总结:
跟结构体相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

1.9.4 位段的应用:

 今天的分享到底结束,如果对您有用,请点赞收藏哦~

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 今天面了个大厂拿38K出来的程序员,让我见识到了基础的天花板

    各大论坛和社区里看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石&#xff0c;可以攻玉&#xff0c;多看多借鉴还是有帮助的&#xff0c;这次腾讯也在疯狂招…...

    2024/4/15 22:43:27
  2. 基于SYN7318智能家居语音识别系统的设计

    摘要:随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放,尤其是最近几年,人工智能AI技术以及智能家居得到了飞速的发展。本项目将近年来发展迅速的嵌入式技术和非特定语音识别芯片SYN7318有机的结合,设计开发了一种能够通过语音来控制家用电器的开启和关闭、拨打…...

    2024/4/14 9:51:29
  3. MySQL基础(3)--韩顺平老师课

    24.23合计/统计函数 24.23.1 count -- 统计一个班级共有多少学生&#xff1f; -- 统计数学成绩大于 90 的学生有多少个&#xff1f; -- 统计总分大于 250 的人数有多少&#xff1f; -- count(*) 和 count(列) 的区别 -- 解释 :count(*) 返回满足条件的记录的行数 -- count(列…...

    2024/4/17 21:43:43
  4. 技术员如何开发一个DAPP区块链应用(以宠物商店为例)

    1. 文章摘要 【本文目标】 通过逐步的指导和截图举证&#xff0c;一步步带领一个技术新手完成一个宠物商店DAPP应用的开发和部署。 【环境前置条件】 参考《第一课 如何在WINDOWS环境下搭建以太坊开发环境》&#xff0c;已完成Ubuntu的安装&#xff0c;已完成TRUFFLE&#…...

    2024/4/14 9:51:14
  5. 三面阿里Android开发岗无理由挂了,被HR一句话噎死,网友:HR有一票否决

    前言 进入互联网大厂一般都是“过五关斩六将”&#xff0c;难度堪比西天取经&#xff0c;但当你真正面对这些大厂的面试时&#xff0c;有时候又会被其中的神操作弄的很是蒙圈。 近日&#xff0c;某位程序员发帖称&#xff0c;自己去阿里面试&#xff0c;三面都过了&#xff0…...

    2024/5/2 0:31:58
  6. 刷题笔记:PAT-B1032-挖掘机技术哪家强

    PAT-B1032-挖掘机技术哪家强 题目&#xff08;20分&#xff09; 为了用事实说明挖掘机技术到底哪家强&#xff0c;PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。 输入 输入在第 1 行给出不超过 10**5 的正整数 N&#xff0c;即参赛人数。随…...

    2024/4/14 9:50:54
  7. Liunx下Nginx的相关配置

    Liunx下Nginx的相关配置 一、创建用户和用户组 创建用户组&#xff0c;用户组名可以自定义 /usr/sbin/groupadd nginx创建用户&#xff0c;用户名可以自定义 /usr/sbin/useradd -g nginx nginx二、修改配置文件信息 打开配置文件目录 cd /usr/local/webserver/nginx/conf…...

    2024/4/14 9:52:25
  8. LPC_2136 PLC,扩展方案,兼容西门子S7-200 CPU 224XP,兼容西门子软件。测试可用。bom,烧录文件,无源码

    LPC_2136 PLC,扩展方案&#xff0c;兼容西门子S7-200 CPU 224XP,兼容西门子软件。测试可用。bom&#xff0c;烧录文件&#xff0c;无源码id645840469445&...

    2024/4/14 9:52:05
  9. (Python语法篇)1.Python简介

    &#xff08;1&#xff09;&#xff0c;Python是一种解释型的&#xff0c;面向对象的语言&#xff0c;由C语言开发出来。 Python的特点&#xff1a; 1&#xff0c;可读性强。 2&#xff0c;简洁&#xff0c;生产效率高&#xff08;解决同一问题&#xff0c;Python的代码量一…...

    2024/4/14 9:52:05
  10. 自制轮式机器人

    摘要:制作这个项目的起因是大一下学期那会儿我通过学校图书馆里的《无线电》杂志开始接触Raspberry Pi卡片式计算机和Arduino微控制器,其中Raspberry Pi给当初什么都不懂的我留下了非常深刻的印象:一个信用卡大小的板子竟然可以跑带有图形界面的GNU/Linux操作系统。 在强烈…...

    2024/4/14 9:52:20
  11. Postgresql源码(29)Postgresql复制冲突的发生和处理逻辑分析

    复制冲突发生 备库起事务在读&#xff0c;主库truncate表&#xff0c;备库复制冲突发生&#xff1a; -- 发生前&#xff0c; 5833是startup&#xff0c;7444是持锁的后台进程。后台进程拿表的读锁和虚拟事务ID的ex锁。 postgres# select * from pg_locks where pid ! pg_back…...

    2024/4/19 18:00:31
  12. Ubuntu 【常用命令篇】--快速使用

    Ubuntu 快速使用 特此郑重声明&#xff01;该文章是原创作品&#xff0c;小编编写实属不易 &#xff0c;帮忙点赞关注一下~转载小伙伴请注明出处&#xff01;谢谢 概述 Ubuntu Linux是基于Debian Linux的操作系统&#xff0c;也是我们日常经常使用的命令信息 查看ubuntu版本号…...

    2024/4/11 19:29:04
  13. 报package requirement‘ta-lib==0.4.17‘ is not satisfied,执行run.py失败

    目录 一、python3.7已安装ta-lib 0.4.22版本&#xff0c;更新vnpy最新代码后报package requirementta-lib0.4.17 is not satisfied 1.手动回退ta-lib版本至0.4.17失败&#xff0c;报如下异常: 2.去加州大学网站寻找.whl 包直接安装 https://www.lfd.uci.edu/~gohlke/pythonl…...

    2024/4/14 9:51:55
  14. Django框架|个人博客网站小项目

    Django框架|个人博客网站小项目一、创建工程1. 创建源码远程仓库&#xff1a;blog2. 克隆远程仓库3. 创建工程&#xff08;1&#xff09;进入本地仓库目录&#xff08;2&#xff09;创建博客项目虚拟环境&#xff0c;并在此项目下安装Django框架&#xff08;3&#xff09;创建博…...

    2024/4/24 23:08:50
  15. OO面向对象

    一、类、对象 1、对象&#xff1a;软件中真实存在的单个个体/东西 ​ 类&#xff1a;类别/类型&#xff0c;代表一类个体 2、类是对象的模子&#xff0c;对象是类的具体的实例 3、类中可以包含&#xff1a; &#xff08;1&#xff09;对象的属性/特征--------------------…...

    2024/4/14 15:00:20
  16. 计算机毕业设计asp.net城市供电管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

    一、源码特点 ASP.NET C# 城市供电管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发,开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;或者以上版本都可以&#xff0c;使用c#语言开发…...

    2024/4/7 15:33:29
  17. CSS设置标签、图片,放大、缩小、旋转、移动、倾斜(tranform)

    CSS设置标签、图片&#xff0c;放大、缩小、旋转、移动、倾斜(tranform) 1.缩小和放大属性&#xff08;scale&#xff09; 格式&#xff1a;tranform&#xff1a;缩小类型&#xff08;数值&#xff09;&#xff1b; 注意&#xff1a;缩小和放大都是 scale &#xff1b; 其中的…...

    2024/4/17 6:40:31
  18. C语言基础知识详解(宏常量、const修饰、字符串)

    1、用#define 定义的宏常量&#xff1a;可以使用#define定义一个标识符来表示一个常量。 其特点是&#xff1a;定义的标识符不占内存&#xff0c;只是临时的符号&#xff0c;在预编译结束后就不存在了 2、用const修饰字修饰的变量&#xff0c;称为常变量。//c语言中的const //…...

    2024/4/18 23:05:59
  19. 西门子PLC CPU226带网口,生产方案资料

    西门子PLC CPU226带网口&#xff0c;生产方案资料&#xff0c;我们从国内厂家引进后修改了软硬件&#xff0c;更方便制造。一套成本只要200左右。实际项目中使用了两年共五百多套&#xff0c;稳定可靠&#xff0c;特点如下&#xff1a; 1采用单板结构&#xff0c;贴片及直插件全…...

    2024/4/22 2:24:00
  20. HTTP学习笔记

    HTTP学习笔记 HTTP基本原理 HTTP协议常用请求方法 方 法描 述GET请求指定页面信息&#xff0c;并返回响应内容POST向指定资源提交数据进行处理请求&#xff08;例如提交表单或者上传文件&#xff09;&#xff0c;数据被包含在求体中。POST请求可能会导致新的资源的建立、或已…...

    2024/4/17 21:13:34

最新文章

  1. 【Python】机器学习之Sklearn基础教程大纲

    机器学习之Sklearn基础教程大纲 1. 引言 机器学习简介Scikit-learn&#xff08;Sklearn&#xff09;库介绍安装和配置Sklearn 2. 数据预处理 2.1 数据加载与查看 - 加载CSV、Excel等格式的数据- 查看数据的基本信息&#xff08;如形状、数据类型等&#xff09;2.2 数据清洗…...

    2024/5/5 13:42:56
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. C++ //练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。

    C Primer&#xff08;第5版&#xff09; 练习 11.14 练习 11.14 扩展你在11.2.1节练习&#xff08;第378页&#xff09;中编写的孩子姓到名的map&#xff0c;添加一个pair的vector&#xff0c;保存孩子的名和生日。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#x…...

    2024/5/5 8:38:52
  4. STL--vector有哪些应用场景

    vector 在 C 中是一种非常灵活和强大的容器&#xff0c;适用于多种不同的应用场景。以下是一些常见的应用场景&#xff1a; 1 动态数据集合&#xff1a;当你不确定数据集的大小&#xff0c;或者数据集的大小会随时间变化时&#xff0c;vector 是理想的选择。例如&#xff0c;在…...

    2024/5/5 8:50:58
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/4 23:55:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/4 18:20:48
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57