当前位置: 首页 > news >正文

穿越代码之海:探寻结构体深层逻辑,展望未来应用新天地

欢迎来到白刘的领域   Miracle_86.-CSDN博客

系列专栏  C语言知识

先赞后看,已成习惯

   创作不易,多多支持!

结构体作为一种数据结构,其定义和特点决定了它在各种应用中的广泛适用性。随着科技的进步和新兴行业的不断涌现,结构体在未来应用中将发挥更加重要的作用。

目录

一、结构体类型的声明

1.1 回顾

1.1.1 结构体的声明

1.1.2 结构体变量的创建和初始化 

1.2 结构体的特殊声明 

1.3 结构体的自引用 

二、结构体内存对齐

2.1 对齐规则

2.2 为什么有对齐规则

2.2.1 平台原因 (移植原因):

2.2.2 性能原因:

2.3 修改默认对齐数

三、结构体传参

四、位段

4.1 什么是位段

4.2 位段的内存分配

4.3 跨平台问题

4.4 位段的应用

4.5 位段使用的注意事项


一、结构体类型的声明

1.1 回顾

我们在学习操作符的时候,简单的介绍了结构体,这里稍微复习一下。

武器大师——操作符详解(下)-CSDN博客

1.1.1 结构体的声明
struct tag
{member-list;//成员列表
}variable-list //变量列表

其中tag表述结构体名,花括号里面放着成员列表,也就是要描述对象的各种属性。变量列表用来存放定义为该结构体类型的变量。

struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}; //分号不能丢
1.1.2 结构体变量的创建和初始化 
#include <stdio.h>
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
};
int main()
{//按照结构体成员的顺序初始化struct Stu s = { "张三", 20, "男", "20230818001" };printf("name: %s\n", s.name);printf("age : %d\n", s.age);printf("sex : %s\n", s.sex);printf("id : %s\n", s.id);//按照指定的顺序初始化struct Stu s2 = { .age = 18, .name = "lisi", .id = "20230818002", .sex = "女" };printf("name: %s\n", s2.name);printf("age : %d\n", s2.age);printf("sex : %s\n", s2.sex);printf("id : %s\n", s2.id);return 0;
}

1.2 结构体的特殊声明 

在声明结构体的时候,我们可以不完全声明,比如:

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

 上面两个结构体在声明的时候省略了结构体标签(Tag)。

那么试想一下下面这行代码是否合法呢?

p = &x;

编译器会把两个声明当成两个类型,所以是非法的。

匿名的结构体类型,如果没有对结构体重命名的话,基本上只能使用一次。

1.3 结构体的自引用 

我们在结构体中包含一个类型为结构体本身的成员是否可以呢?

比如说我们定义一个链表的节点,首先我们简单介绍一下链表和节点:

链表是一种数据结构,它由节点组成,每个节点包含两部分数据和指向下一个节点的指针。

节点是链表中的基本单元,每个节点存储数据,并指向下一个节点。节点通常由一个具有数据成员的结构体或类表示,数据成员可以是任何类型的数据。

struct Node
{int data;struct Node next;
};

这么定义对吗?

仔细想想。这样其实不太合理,如果结构体里包含一个结构体,那结构体里的结构体就可以又包含一个结构体,以此类推就造成了无限大,是不合理的。

正确的自引用方式:

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

在结构体自引用使用的过程中,夹杂着typedef对匿名结构体重命名,也会容易引发问题,看看下面的代码是否可行?

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

 仔细想其实很简单,不可行,因为我在结构体里用了Node,而Node还没命名完,还是那句心法——从上到下,依次执行。

解决方案:

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

二、结构体内存对齐

2.1 对齐规则

1.结构体的第一个成员要对齐到结构体变量起始位置偏移量为0的地址处

2.其它成员要对齐到某个数字(对齐数)的整数倍的地址处。

   对齐数 = 编译器默认的一个对齐数 与 该成员变量大小的较小值。

   VS中默认的对齐数为8。

   Linux中gcc没有默认对齐数,对齐数就是成员变量本身的大小。

3.结构体的总大小为最大对齐数(结构体中每个成员都有一个对齐数,所有对齐数中最大的)的整数倍。

4.如果遇到了结构体嵌套,嵌套的结构体成员对齐到自己的成员的最大对齐数的整数倍处。结构体整体大小就是所有最大对齐数(含嵌套结构体的成员的对齐数)的整数倍。

一些练习:

    //练习1struct S1{char c1;int i;char c2;};printf("%d\n", sizeof(struct S1));//练习2struct S2{char c1;char c2;int i;};printf("%d\n", sizeof(struct S2));//练习3struct S3{double d;char c;int i;};printf("%d\n", sizeof(struct S3));//练习4-结构体嵌套问题struct S4{char c1;struct S3 s3;double d;};printf("%d\n", sizeof(struct S4));

练习1:

首先由于1<8,所以c1,c2的对齐数为1,由于4<8,所以4为i的对齐数。同时4也是最大对齐数。

过程:首先一个字节放c1,i的对齐数是4,所以为了让i对齐,我们需要补充3个字节让i对齐,之后4个字节存放i,之后存放c2.目前总字节数:1+3(补)+4+1=9,9不是最大对齐数的倍数,所以继续补充3个字节到12,故总大小为12个字节。

练习2:

对齐数:c1、c2 —— 1,i —— 4。最大对齐数为4。

过程:一个字节放c1,一个字节放c2,目前两个字节,2不是4的倍数,补充2个字节然后放i,i占4个字节。目前1+1+2(补)+4=8,8是4的倍数,所以总大小为8。

练习3:

对齐数:d —— 8,c —— 1,i —— 4,最大对齐数为8。

过程:8个字节放d,1个字节放c,补充3个字节到12,4个字节存放i,总字节:8+1+3(补)+4=16,故总大小为16。

练习4:

对齐数:一个字节放c1,16个字节放S3,目前字节1+16,要补到24,然后放d。总字节:24+8=32,是8的倍数,故总大小为32。

运行结果:

2.2 为什么有对齐规则

2.2.1 平台原因 (移植原因):

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

2.2.2 性能原因:

数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。假设一个处理器总是从内存中取8个字节,则地址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对齐成8的倍数,那么就可以用一个内存操作来读或者写值了。否则,我们可能需要执行两次内存访问,因为对象可能被分放在两个8字节内存块中。

总体来说:结构体的内存对齐是拿空间来换取时间的做法。

所以我们在结构体的设计时,要尽量将占用空间小的成员集中在一起。

//例如:
struct S1
{char c1;int i;char c2;
};struct S2
{char c1;char c2;int i;
};

 s1与s2的成员一模一样,但是s1和s2的空间有着区别。

2.3 修改默认对齐数

我们可以通过#pragam这个预处理指令来修改编译器的默认对齐数。

#include <stdio.h>
#pragma pack(1)//设置默认对⻬数为1
struct S
{char c1;int i;char c2;
};
#pragma pack()//取消设置的对⻬数,还原为默认
int main()
{//输出的结果是什么?printf("%d\n", sizeof(struct S));return 0;
}

运行结果:

可能有人会问,不是又取消对齐数了嘛,怎么不应该是12呢?这里还是那句心法:从上到下,依次执行。我们已经创建好结构体大小了,它再取消的话其实是没有用的。

三、结构体传参

struct S
{int data[1000];int num;
};
struct S s = { {1,2,3,4}, 1000 };
//结构体传参
void print1(struct S s)
{printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{printf("%d\n", ps->num);
}
int main()
{print1(s); //传结构体print2(&s); //传地址return 0;
}

来观察上述两个函数,大家认为哪个比较好?

答案是print2。

原因是:函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销较大,所以会导致性能的下降。

结论:结构体传参的时候,要传结构体的地址。

四、位段

4.1 什么是位段

位段是一种用于存储和操作位(二进制位)的数据结构,它允许将多个位组合在一起表示特定类型的数据,节省内存空间。

位段的声明和结构体是类似的,但有一下两点不同:

1.位段的成员必须是 int、unsigned int 或 signed int ,在C99中位段成员的类型也可以选择其他类型。

2.位段的成员名后边有一个冒号和一个数字。

eg:

struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};

 A就是一个位段,那A的大小是多少呢?这就需要了解位段的内存分配。

4.2 位段的内存分配

1.位段的成员可以是 int、unsigned int、signed int 或者是 char 等类型。


2.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。

3.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

//⼀个例⼦
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;
//空间是如何开辟的?

 

4.3 跨平台问题

1..int 位段被当成有符号数还是无符号数是不确定的。

2.位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。

3.位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

总结:跟结构相比,位段确实可以达到同样的效果,并且通常能够很好地节省空间。然而,位段确实存在跨平台的问题。由于不同编译器和平台对位段的处理方式可能不同,这可能导致在不同环境下程序的行为不一致。因此,在需要高度可移植性的场景中,使用位段需要特别小心,并进行充分的测试和验证。如果节省空间的需求不是特别迫切,或者跨平台兼容性更为重要,那么使用结构可能是一个更稳妥的选择。 

4.4 位段的应用

下图是网络协议中IP数据报的格式。确实,我们可以看到其中许多属性只需要较少的bit位就能描述。使用位段(bit-fields)在这种情况下是一个很好的选择,因为它能够实现所需的效果,同时节省空间。由于位段可以精确控制每个字段所占用的位数,所以它们非常适合用于表示那些只需要少量位数就能完整描述的信息。

在网络传输中,数据报的大小对于网络的畅通性至关重要。较小的数据报意味着在传输过程中所需的带宽和资源更少,这有助于减少网络拥塞和延迟。通过使用位段来减少数据报中每个字段的大小,我们可以有效地减小数据报的整体大小,从而提高网络的传输效率。

然而,需要注意的是,虽然位段在节省空间方面具有优势,但它们也带来了一些挑战。例如,位段的具体实现可能因编译器和平台的不同而有所差异,这可能导致跨平台兼容性问题。此外,过度使用位段可能会使代码变得难以理解和维护。因此,在决定是否使用位段时,需要权衡其优缺点,并根据具体的应用场景和需求做出决策。

4.5 位段使用的注意事项

位段的一个特性是,其成员可能共享同一个字节的存储空间,这导致某些成员的起始位置并非字节的起始边界。由于内存中每个字节分配一个地址,而字节内部的bit位是没有独立地址的,因此不能直接对位段的成员使用&操作符来获取其地址。

由于位段成员的这种地址特性,我们不能直接使用像scanf这样的函数来直接给位段的成员输入值。这是因为scanf等函数通常需要能够访问变量的内存地址来执行赋值操作,而位段成员并不总是拥有独立的、可寻址的内存位置。

因此,在实际编程中,我们通常需要先通过scanf等函数将输入值存放在一个临时变量中,然后再将这个临时变量的值赋给位段的成员。这样可以确保赋值操作的正确性和可靠性,避免因为位段成员地址的特殊性而导致的问题。

需要注意的是,位段的使用虽然可以节省空间,但也带来了一些限制和复杂性。在实际应用中,我们需要根据具体的需求和场景来权衡是否使用位段,并确保在使用过程中遵守相关的编程规范和最佳实践。

struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};
int main()
{struct A sa = { 0 };scanf("%d", &sa._b);//这是错误的//正确的⽰范int b = 0;scanf("%d", &b);sa._b = b;return 0;
}

完 

相关文章:

穿越代码之海:探寻结构体深层逻辑,展望未来应用新天地

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 结构体作为一种数据结构&#xff0c;其定义和特点决定了它在各种应用中的广泛适用性。随着科技的进步和新兴行业的不断涌现&#xf…...

layui框架实战案例(26):layui-carousel轮播组件添加多个Echarts图标的效果

在Layui中&#xff0c;使用layui-carousel轮播组件嵌套Echarts图表来实现多个图表的展示。 css层叠样式表 调整轮播图背景色为白色&#xff1b;调整当个Echarts图表显示loading…状态&#xff1b;同一个DIV轮播项目添加多个Echarts的 .layui-carousel {background-color: #f…...

Unity开发一个FPS游戏之三

在前面的两篇博客中&#xff0c;我已实现了一个FPS游戏的大部分功能&#xff0c;包括了第一人称的主角运动控制&#xff0c;武器射击以及敌人的智能行为。这里我将继续完善这个游戏&#xff0c;包括以下几个方面&#xff1a; 增加一个真实的游戏场景&#xff0c;模拟一个废弃的…...

NIUSHOP完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本 源码免费…...

vue2开发好还是vue3开发好vue3.0开发路线

Vue 2和Vue 3都是流行的前端框架&#xff0c;它们各自有一些特点和优势。选择Vue 2还是Vue 3进行开发&#xff0c;主要取决于你的项目需求、团队的技术栈、以及对新特性的需求等因素。以下是一些关于Vue 2和Vue 3的比较&#xff0c;帮助你做出决策&#xff1a; Vue 2&#xff1…...

爬虫 新闻网站 并存储到CSV文件 以红网为例 V2.0 (控制台版)升级自定义查询关键词、时间段,详细注释

爬虫&#xff1a;红网网站&#xff0c; 获取指定关键词与指定时间范围内的新闻&#xff0c;并存储到CSV文件 V2.0&#xff08;控制台版&#xff09; 爬取目的&#xff1a;为了获取某一地区更全面的在红网已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 对比V1.0升级的…...

JavaSE-11笔记【多线程2(+2024新)】

文章目录 6.线程安全6.1 线程安全问题6.2 线程同步机制6.3 关于线程同步的面试题6.3.1 版本16.3.2 版本26.3.3 版本36.3.4 版本4 7.死锁7.1 多线程卖票问题 8.线程通信8.1 wait()和sleep的区别&#xff1f;8.2 两个线程交替输出8.3 三个线程交替输出8.4 线程通信-生产者和消费者…...

WebKit是什么?

WebKit是一个开源的浏览器引擎&#xff0c;它用于呈现网页内容在许多现代浏览器中&#xff0c;包括Safari浏览器、iOS内置浏览器、以及一些其他浏览器如Google Chrome的早期版本。以下是一些关于WebKit的重要信息&#xff1a; 起源和发展&#xff1a;WebKit最初是由苹果公司为其…...

谷歌(Google)历年编程真题——接雨水

谷歌历年面试真题——数组和字符串系列真题练习。 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;…...

golang 归并回源策略

前言 下面是我根据业务需求画了一个架构图&#xff0c;没有特别之处&#xff0c;很普通&#xff0c;都是我们常见的中间件&#xff0c;都是一些幂等性GET 请求。有一个地方很有意思&#xff0c;从service 分别有10000 qps 请求到Redis&#xff0c;并且它们的key 是一样的。这样…...

【漏洞复现】可视化融合指挥调度平台 dispatch接口处存在任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…...

最讨厌这种字符串问题了!!

题目&#xff1a;洛谷P1957口算练习题 题目大意描述&#xff1a; 第一行输入一个整数表示接下来要进行多少次运算&#xff0c;接下来每行输入一个字母c和两个数字x,y&#xff08;输入的字母为a/b/c,分别表示要进行&#xff0c;-&#xff0c;*运算&#xff09;或者就输入两个数…...

B-名牌赌王(本人遇到的题,做个笔记)

题解&#xff1a; #include <iostream> #include <queue> //需要用小根堆的优先队列 #include <unordered_map> //用无序映射 using namespace std; bool pai() {int n, m;cin >> n >> m; priority_queue<int, vector<int>, gr…...

博客评论回复03

接着之前写的&#xff0c;之前返回的数据集按道理来说渲染出来还是丑丑的&#xff0c;因此这次我看着抖音的评论样子&#xff0c;自己瞎写了一通&#xff0c;不过也算是模仿出来了虽然肯定没有抖音写的好。 类似与前面几章写的表结构 首先看看抖音评论区是怎么样的&#xff1f…...

【【萌新的学习之Numpy数组的使用】】

萌新的学习之Numpy数组的使用 先记录一下之前的关于函数的设计 通过创造类的形式 复习完毕之后介绍numpy数组的使用 #整数型数组遇到除法 &#xff08;即便是除以整数&#xff09; 不同维度的数组之间 从外形上的本质区别 一维数组用1层中括号 二维数组用2层中括号 三维数…...

RabbitMQ3.13.x之七_RabbitMQ消息队列模型

RabbitMQ3.13.x之七_RabbitMQ消息队列模型 文章目录 RabbitMQ3.13.x之七_RabbitMQ消息队列模型1. RabbitMQ消息队列模型1. 简单队列2. Work Queues(工作队列)3. Publish/Subscribe(发布/订阅)4. Routing(路由)5. Topics(主题)6. RPC(远程过程调用)7. Publisher Confirms(发布者…...

Android JNI 调用第三方SO

最近一个项目使用了Go 编译了一个so库&#xff0c;但是这个so里面还需要使用第三方so库pdfium, 首先在Android工程把2个so库都放好 在jni中只能使用dlopen方式&#xff0c;其他的使用函数指针的方式来调用&#xff0c;和windows dll类似&#xff0c;不然虽然编译过了但是会崩溃…...

Vid2seq

Vid2Seq 应该是目前为止,个人最中意得一篇能够实际解决对一段视频进行粗略理解得paper了。个人认为它能够真正能解决视频理解是因为它是对一个模型整体做了训练,而不仅仅是通过visual encoders(e.g BLIP/CLIP/…)和 其它multi modal 的encoder直接过了个projection,做一个…...

Opencv人机交互界面设置

Opencv人机交互界面设置 以下是一些常见的OpenCV人机交互界面设置&#xff1a; 窗口交互 显示窗口&#xff1a;可以使用cv2.imshow()函数在屏幕上显示图像。例如&#xff0c;要显示名为“image”的图像&#xff0c;可以使用以下代码&#xff1a; import cv2img cv2.imread…...

蓝桥杯算法心得——字典树考试(贡献度+前缀和)

大家好&#xff0c;我是晴天学长&#xff0c;贡献度的题&#xff0c;找到技巧非常重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .字典树考试 字典树考试 问题描述 蓝桥学院最近教学了字典树这一数…...

Linux下Qt生成程序崩溃文件

文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序&#xff0c;得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时&#xff0c;假如在windows&#xff0c;当软件崩溃时&#xff0c;…...

Go语言中测试和性能

1. 测试:软件开发最重要的方面 测试软件程序可能是软件开发人员能够做的最重要的事情。通过测试代码的功能,开发人员能够在很大程度上确定程序是有效的。另外,每次修改代码后,开发人员都可运行测试,确认没有引入Bug和衰退。通过测试软件,还能够让软件工程师确认程序按期望…...

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于CPO-GPR基于冠豪猪算法优化高斯…...

python 日期字符串转换为指定格式的日期

在Python编程中&#xff0c;日期处理是一个常见的任务。我们经常需要将日期字符串转换为Python的日期对象&#xff0c;以便进行日期的计算、比较或其他操作。同时&#xff0c;为了满足不同的需求&#xff0c;我们还需要将日期对象转换为指定格式的日期字符串。本文将详细介绍如…...

day03-Docker

1.初识 Docker 1.1.什么是 Docker 1.1.1.应用部署的环境问题 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 例如一个项目中&#xff0c;部署时需要依…...

C语言函数实现冒泡排序

前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧&#xff0c;我们以一个数组为例arr[] {9,8,7,6,5,4,3,2,1,0},我们将这个数组通过冒泡排序的方式让他变为升序吧。 代码实现 #include<stdio.h> void bubble_sort(int arr[], int sz) {int i 0;for (i 0;i < s…...

区间概率预测python|QR-CNN-BiLSTM+KDE分位数-卷积-双向长短期记忆神经网络-时间序列区间概率预测+核密度估计

区间预测python|QR-CNN-BiLSTMKDE分位数-卷积-双向长短期记忆神经网络-核密度估计-回归时间序列区间预测 模型输出展示&#xff1a; (图中是只设置了20次迭代的预测结果&#xff0c;宽度较宽&#xff0c;可自行修改迭代参数&#xff0c;获取更窄的预测区间&#xff09; 注&am…...

Java 分支结构 - if…else/switch

顺序结构只能顺序执行&#xff0c;不能进行判断和选择&#xff0c;因此需要分支结构。 Java有两种分支结构&#xff1a; if语句switch语句 if语句 一个if语句包含一个布尔表达式和一条或多条语句。 语法 If 语句的用语法如下&#xff1a; if(布尔表达式) {//如果布尔表达…...

【Unity每日一记】如何从0到1将特效图集制作成一个特效

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

磁力链接的示例与解释

磁力链接&#xff08;Magnet URI scheme&#xff09;是一种特殊类型的统一资源标识符&#xff08;URI&#xff09;&#xff0c;它包含了通过特定散列函数&#xff08;如SHA-1&#xff09;得到的文件内容的散列值&#xff0c;而不是基于位置或名称的引用。这使得磁力链接成为在分…...

各大网站推广软件/广州信息流推广公司

文章目录前言一、关系型数据库和非关系型数据库1.关系型数据库2.非关系型数据库3.区别①数据存储方式不同②扩展方式不同③对事务性的支持不同4.非关系型数据的产生背景5.单进程快速的原因二、Redis的优点&#xff08;redis 特性&#xff08;与其他nosql对比&#xff09;&#…...

邮箱域名怎么填写/网络关键词优化方法

在以前分析过ORA-600[729](SGA内存泄露),这次遇到ORA-600[723](PGA内存泄露)操作系统数据库信息ORACLE V9.2.0.3.0 - Production vsnsta0vsnsql12 vsnxtr3Windows 2000 Version 5.2 Service Pack 2, CPU type 586Oracle9i Enterprise Edition Release 9.2.0.3.0 - ProductionWi…...

建立网站有哪些步骤/网站优化排名

一看C才[0,50],肯定要开51棵线段树维护y区间的最小x值啦 是男人就上51棵..等等空间爆几倍了 动态开点!51棵线段树用全局节点变量控制,有点像主席树 清空工作很简单,把51个树根清掉然后回收节点(tot0)就行了 然而!真不知道那些内部数据是有多恶心的 MLE 4 RTE 4 最后在query那…...

网站端和移动端分开建设域名一样么/google排名

日常工作中&#xff0c;我们在搭建完毕weblogic后&#xff0c;登陆控制台时&#xff0c;会出现等待很长时间的情况&#xff0c;也就是所谓的卡的情况&#xff0c;像我这种急性子的人根本就不愿意等&#xff0c;为啥&#xff0c;等的烦心啊&#xff01;&#xff01;那怎么解决呢…...

建设银行网站收款怎么打明细/114外链

苏教版高三数学复习课件10.1算法的含义、流程图.ppt了解算法的含义和算法的基本思想/了解流程图中的三种基本的算法结构&#xff1a;顺序结构、选择结构和循环结构&#xff0c;并能解决相关的简单问题,第十知识块 算法初步 第1课时 算法的含义、流程图,1算法的“三基”&#xf…...

编程 网站建设/东莞网站公司哪家好

RIL代码分析代码位于&#xff1a;android/hardware/ril1 rild.c中的main()函数提供了rild的入口首先&#xff0c;通过main函数的传参&#xff0c;cmdline&#xff0c;内核选项等方式获取rild.libpath和rild.libargs。我们这里主要是&#xff1a;/system/lib/libreference-ril.s…...