首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自定义类型:结构体,枚举,联合 (1)

假设我们创建一个结构体struct S1 s1,假设0这个位置开始,那么0这个格子字节相较于起始位置偏移量就是0,相较于起始位置偏移了几个字节,偏移量就是几。  ...就是第一个成员c1偏移量是0,就占开始1个字节,第二个成员i偏移量是4,由于类型是int,4这个位置开始向后占4个字节,第三个成员c2偏移量是8,由于类型是char,8这个位置开始向后占1个字节...我们再看一下S2,第一个成员c1偏移量是0,就占开始1个字节,第二个成员c2偏移量是1,由于类型是char,1这个位置开始向后占1个字节,第三个成员i偏移量是4,由于类型是int,4这个位置开始向后占...1,所以8开始占1个字节,刚好就是8这个空间,i对齐数就是4了,4最小整数倍是12,所以12开始占4个字节,9,10,11这块空间就浪费了,这个结构体0-15就是16个字节,那么16是不是最终大小呢...8,8-23占16个字节,d占8个字节,对齐数是8,8倍数刚好是24,24-31占8个字节,所以S4这个结构体最大对其数就是8,8最小倍数就是32,那么大小就是32.

10010

结构体字节对齐

结构体字节对齐       在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占空间相加,这里涉及内存字节对齐问题。...比如有的平台每次都是偶地址处读取数据,对于一个int型变量,若偶地址单元处存放,则只需一个读取周期即可读取该变量;但是若奇地址单元处存放,则需要2个读取周期读取该变量。   ...在C99标准中,对于内存对齐细节没有作过多描述,具体实现交由编译器去处理,所以在不同编译环境下,内存对齐可能略有不同,但是对齐最基本原则是一致。     ...也就是最小化长度规则 4. 结构体总大小: 对齐后长度必须是成员中最大对齐参数整数倍。最大对齐参数是第三步得到。 5....s1;     S2 s2;     S3 s3;     S4 s4;     S5 s5;     cout<<sizeof(s1)<<" "<<sizeof(s2)<<" "<<sizeof

1.2K60
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL 复制 - 性能与扩展性基石 4:主备切换

但只要新主库二进制日志已结通过 log_slave_updates 打开,就可以在新主库二进制日志中找到 99 号 和 100 号事件,从而将备库恢复一致状态。...我们可以通过 mysqlbinlog 二进制日志或中继日志中解析出每台备库上执行最后一个事件,并还有该命令解析新主库上二进制文件,找到相同查询,mysqlbinlog 会打印出该事件偏移量,在...假设 s1s2 和 s3 主库。其中 s1 已经崩溃。...s2 正在向偏移量为 8167 二进制日志写入,因此,理论上我们应该将 s3 指向 s2 日志偏移量为 8167-89=8078 位置。...因为 s2 仅仅读取并执行到了 1582,因此可能会失去事件 a。但是如果老主库磁盘没有损坏,仍然可以通过 mysqlbinlog 或者日志服务器二进制日志中找到丢失事件。

77910

CC++ sizeof(下)

这是因为结构体或类成员变量具有不同类型时,需进行成员变量对齐。《计算机组成原理》一书中说明,对齐目的是减少访存指令周期,提高CPU存储速度。...如下: struct S2 { char c1; S1 s; char c2; }; 在寻找S2最宽基本数据类型时,包括其嵌套结构体中成员,S1中寻找出最宽结构体数据类型是...S1 s在结构体S2对齐也遵守前三个准则,因此sizeof(S2)=sizeof(char)+pad(3)+sizeof(S1)+1+pad(3)=1+3+8+1+3=16字节,其中pad(3)表示填充...>m) 例如获得S1偏移量,方法为 size_t pos = offsetof(S1, i); //pos等于4 1.2修改对齐方式 1.2.1#pragma pack #pragma...结构体对齐时, (1)成员偏移量为成员本身大小和n二者最小整数倍; (2)结构体最终大小是结构体中最宽基本类型成员大小和n二者中最小整数倍。

95820

详解最长公共子序列问题,秒杀三道动态规划题目

不知道大家做算法题有什么感觉,我总结出来做算法题技巧就是,把大问题细化一个点,先研究在这个小点上如何解决问题,然后再通过递归/迭代方式扩展整个问题。...我们只看s1[i]和s2[j],如果s1[i] == s2[j],说明这个字符一定在lcs中: 这样,就找到了一个lcs中字符,根据dp函数定义,我们可以完善一下代码: // 定义:计算 s1[i...]短嘛,那从这里面算出lcs当然也不可能更长嘛。...dp数组定义方式和我们递归解法有一点差异,而且由于数组索引 0 开始,有索引偏移,不过思路和我们递归解法完全相同,如果你看懂了递归解法,这个解法应该不难理解。...和 s2[j..] 删除成相同字符串, // 最小 ASCII 码之和为 dp(s1, i, s2, j)。

66330

结构体内存对齐

n",offsetof(struct s1,i)); printf("s1内存大小:%d\n", sizeof(struct s2)); printf("第一个成员变量与起始点偏移量:%d\n...", offsetof(struct s2, c1)); printf("第二个成员变量与起始点偏移量:%d\n", offsetof(struct s2, i)); printf("第三个成员变量与起始点偏移量...结构体s1: c1偏移量为0,则c1地址就是s1起始地址开始,占一个字节; c1偏移量为1,则c1地址就是s1起始地址后一个字节开始,占一个字节; i偏移量为4,则c1地址就是...下面我介绍一下结构体内存对齐规则: 第一个成员在与结构体变量偏移量为0地址处。 其他成员变量要对齐对齐数整数倍地址处。...c2要对齐,本身大小为1,对齐数为8;所以对齐1整数倍地址,即为地址1; i也要对齐,本身大小为4,对齐数为8;所以对齐4整数倍地址,即为地址4; s2结构体: c1是第一个成员,在与结构体变量偏移量为

8410

C语言学习系列—>一篇带你了解结构体

对上述代码内存进行解析: struct S1: 这里为struct S1开辟一块空间 首先给char a开辟空间,char a是结构体第一个成员,根据规则:结构体第⼀个成员对⻬相对结构体变量起始位置偏移量为...偏移量1,2,3都不是4倍数,因此4开始,开辟4个字节,即图中深红色位置。...struct S2: 这里为struct S1开辟一块空间 首先给char a开辟空间,char a是结构体第一个成员,根据规则:结构体第⼀个成员对⻬相对结构体变量起始位置偏移量为0地址处...偏移量2,3都不是4倍数,偏移量4开始,开辟4个字节。 此时,struct S2 开辟了8个字节,8是4倍数,因此不需要再浪费空间了。...否则,我们可能需要执⾏两次内存访问,因为对象可能被分放在两个8字节内存块中。 总体来说:结构体内存对⻬是拿空间来换取时间做法。 如何既要满足内存对齐又要节省空间??

8610

结构体对齐+联合体+位段

为了深入了解结构体大小事如何计算,即不得不了解结构体对齐。 结构体对齐 要想知道如何计算,就得先知道结构体对齐规则: 第一个成员在与结构体变量偏移量为0地址处。...按照结构体对齐规则,可知结构体第一个成员是偏移量为0地址处开始存储,因为c1类型为char所以只占一个字节,而结构体第二个成员是要对齐对齐数整数倍处,我们先求出对齐数,按照结构体对齐第二条规定...char c1,偏移量为0位置存储占用一个字节,第二个成员为结构体,根据结构体对齐规则,嵌套结构体要对齐自己最大对齐数整数倍处,而struct s3最大对齐数为8,所以struct s38...和S2类型成员一模一样,但是S1S2所占空间大小有了一些区别。...{}中内容是枚举类型可能取值,也叫 枚举常量 。这些可能取值都是有值,默认0开始,一次递增1,当然在定义时候也可以赋初值。

16820

【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参

既然是按照一定规则,那得首先了解它对齐规则: 结构体第一个成员对齐和结构体起始位置偏移量为0地址处。 其他成员变量要对齐某个数字(对齐数)整数倍地址处。...: 首先结构体S1成员有三个,根据对齐规则:结构体第一个成员对齐结构体变量起始位置偏移量为0地址处-—>C1放在偏移量为0地址处,接下来第二个C2就从第2个规则按对齐数进行放置,C2字节数...一个例子你可能想是不是碰巧,那么第二个例子: 结构体S2中有三个成员,C1大小为一,第一个成员放在偏移量为0处,第二个成员i大小为4,偏移量1,2,3都不是4整数倍,然后这些空间都跳过不放数据,(注...S2最大对齐数是4,偏移量9,10都不对,当偏移量为11,011刚好为12,为4倍数(4*3=12)。所以S2总大小为12!...S1, i));//8 printf("\n"); printf("结构体S2成员偏移量:\n"); printf("c1=%zd\n", offsetof(struct S2, c1));/

12410

C语言之结构体(进阶篇)

如何计算呢? 掌握结构体对齐规则:  1. 第一个成员在与结构体变量偏移量为0地址处。 2. 其他成员变量要对齐某个数字(对齐数)整数倍地址处。...offsetof offsetof就是计算 结构体成员相对于起始位置偏移量 #include struct S1 { char c1; //1个字节 int i; //...0; } 跟上面的两张图s1 s2偏移起始位置一模一样   这道题就要参考前面写结构体内存对齐规则 3....枚举 枚举——一一举例 把可能值一一列举出来 一周星期一星期日有限七天,可以一一列举 性别 有男 有女 也可以一一列举 一年有12个月也可以一一列举  enum Day//星期 {...这些可能取值都是有值,默认0开始,一次递增1,当然在定义时候也可以赋初值。 例如: 这些可能取值都是有值,默认0开始,一次递增1,当然在定义时候也可以赋初值。

43420

【自定义类型详解】第一篇——结构体详解

那该如何访问成员? 两种方式: 我们可以对该结构体指针解引用,这样就找到了对应结构体变量,然后我们就可以使用(.)操作符来访问成员变量了。...对于s来说,根据规则1我们知道第一个成员c1直接对齐对于起始位置偏移量为0地址处,那i和c2呢,它们偏移量又如何得知呢? 这里给大家介绍一个宏——offsetof。...那既然这样放了,就一定有它原因,这些都是我们接下来要探讨问题。 规则2 第二个成员变量开始,要对齐当前对齐数整数倍偏移处 那这里又出现一个新概念——对齐数。...而最后一个成员c2放在了偏移量为8位置,08,已经占用了9个字节,再往后第一个4倍数就是12,所以s最终大小是12。 即偏移量是011。 这与我们上面得到结果是一致。...对比struct S1和struct S2可以发现,S2大小比S1小了4个字节,而S2S1不同之处在于S2中占用空间小成员放在了一起。

10610

C语言 - 结构体所占字节数

在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占空间相加,这里涉及内存字节对齐问题。...理论上讲,对于任何变量访问都可以任何地址开始访问,但是事实上不是如此,实际上访问特定类型变量只能在特定地址访问,这就需要各个变量在空间上按一定规则排列,而不是简单地顺序排列,这就是内存对齐。...比如有的平台每次都是偶地址处读取数据,对于一个int型变量,若偶地址单元处存放,则只需一个读取周期即可读取该变量;但是若奇地址单元处存放,则需要2个读取周期读取该变量。   ...在C99标准中,对于内存对齐细节没有作过多描述,具体实现交由编译器去处理,所以在不同编译环境下,内存对齐可能略有不同,但是对齐最基本原则是一致,对于结构体字节对齐主要有下面两点: 1)结构体每个成员相对结构体首地址偏移量...s1; S2 s2; S3 s3; S4 s4; S5 s5; cout<<sizeof(s1)<<" "<<sizeof(s2)<<" "<<sizeof(s3

1.4K51

结构体字节对齐

在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占空间相加,这里涉及内存字节对齐问题。...理论上讲,对于任何变量访问都可以任何地址开始访问,但是事实上不是如此,实际上访问特定类型变量只能在特定地址访问,这就需要各个变量在空间上按一定规则排列,而不是简单地顺序排列,这就是内存对齐。...比如有的平台每次都是偶地址处读取数据,对于一个int型变量,若偶地址单元处存放,则只需一个读取周期即可读取该变量;但是若奇地址单元处存放,则需要2个读取周期读取该变量。   ...在C99标准中,对于内存对齐细节没有作过多描述,具体实现交由编译器去处理,所以在不同编译环境下,内存对齐可能略有不同,但是对齐最基本原则是一致,对于结构体字节对齐主要有下面两点:      ...s1; S2 s2; S3 s3; S4 s4; S5 s5; cout<<sizeof(s1)<<" "<<sizeof(s2)<<" "<<sizeof(s3

1.6K50

C语言结构体字节对齐 | 结构体与联合

有关于内存访问效率问题,就是对于一个32位CPU,一个周期它取出应该是一个完整周期,4个4个来取。...(2)第二个成员开始,在其自身对齐数整数倍开始存储(对齐数=编译器默认对齐数和成员字节大小最小值,VS编译器默认对齐数为8)。 (3)结构体变量所用总空间大小是成员中最大对齐数整数倍。...(4)当遇到嵌套结构体情况,嵌套结构体对齐其自身成员最大对齐数整数倍,结构体大小为当下成员最大对齐数整数倍。...stu2 { double a; struct stu1 s1; int c; }s2; int main() { printf("sizeof: d%\...结构体偏移量:某一个成员实际地址和结构体首地址之间距离。 结构体字节对齐:每个成员相对于结构体首地址偏移量都得是当前成员所占内存大小整数倍,如果不是会在成员前面加填充字节。

2.2K10

offset size_c语言sizeof求结构体长度

让我们交换一下S1中char与int位置: struct S2 { int i; char c; }; 看看sizeof(S2)结果为多少,怎么还是8再看看内存,原来成员c后面仍然有...0)->m) 例如,想要获得S2中c偏移量,方法为 size_t pos = offsetof(S2, c);// pos等于4 2) 基本类型是指前面提到像char、short、int、float...,即是说,结构体成员偏移量应该取二者最小值,公式如下: offsetof( item ) = min( n, sizeof( item ) ) 再看示例: #pragma pack(push)...2,所以i偏移量为2,加上sizeof(i)等于6,能够被2整除,所以整个S1大小为6。...试想一个“不占空间”变量如何被取地址、两个不同“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节空间用于占位了。

65710

外由内剖析一道腾讯面试算法题

设两个字符串分别为 "rad" 和 "apple",为了把s1变成s2,算法会这样进行: ? ? 请记住这个 GIF 过程,这样就能算出编辑距离。关键在于如何做出正确操作,稍后会讲。...下面详解一下如何将这个思路转化成代码,坐稳,准备发车了。 二、代码详解 先梳理一下之前思路: base case 是i走完s1或j走完s2,可以直接返回另一个字符串剩下长度。...我们这里 dp(i, j) 函数定义是这样: def dp(i, j) -> int # 返回 s1[0..i] 和 s2[0..j] 最小编辑距离 记住这个定义之后,先来看这段代码: if s1...# s1[0..i-1] 和 s2[0..j-1] 最小编辑距离 # 也就是说 dp(i, j) 等于 dp(i-1, j-1) 如果s1[i]!...你可能还会问,这里只求出了最小编辑距离,那具体操作是什么?之前举修改公众号文章例子,只有一个最小编辑距离肯定不够,还得知道具体怎么修改才行。

89110

经动态规划:编辑距离

设两个字符串分别为 "rad" 和 "apple",为了把s1变成s2,算法会这样进行: 请记住这个 GIF 过程,这样就能算出编辑距离。关键在于如何做出正确操作,稍后会讲。...下面详解一下如何将这个思路转化成代码,坐稳,准备发车了。 二、代码详解 先梳理一下之前思路: base case 是i走完s1或j走完s2,可以直接返回另一个字符串剩下长度。...# s1[0..i-1] 和 s2[0..j-1] 最小编辑距离 # 也就是说 dp(i, j) 等于 dp(i-1, j-1) 如果s1[i]!...存储 s1[0..i] 和 s2[0..j] 最小编辑距离 有了之前递归解法铺垫,应该很容易理解。...你可能还会问,这里只求出了最小编辑距离,那具体操作是什么?之前举修改公众号文章例子,只有一个最小编辑距离肯定不够,还得知道具体怎么修改才行。

31720

一篇文章介绍结构体

写法2: struct Stu { //学生属性(成员列表) char name[20]; int age; }s1,s2;//无变量列表也可以 s1s2利用上面的结构体类型,创建一个结构体变量...此时编译器会报警告:**类型不兼容。 在数据结构中有一个链表概念,链表中有顺序表。我们只需要让每一节点包含下一个节点,就能使每一个节点找到下一个节点。...0; } 计算s1所占字节数,我们可能会下意识认为:char占1个字节,int占8个字节,所以一共占10个字节。...出现这个结果原因是什么呢? 接下来我们介绍结构体对齐情况: 1. 结构体第⼀个成员对齐和结构体变量起始位置偏移量为0地址处。 2....接着i在偏移量为4位置占4字节,此时c2偏移量也为1,无论如何,都满足偏移量为1,所以接着向下存。但是此时为9,并不是正确答案,这是为什么呢?

8110

【C语言高阶篇】结构体 —— 什么是内存对齐?

结构体内存对齐   ⛳️大家可能会想结构体内存对齐这部分知识是干嘛用呢?不要急,接下来就给大家 演示一下这部分内容到底能干嘛?...结构体 S2S1 包含类型都是一样那也就是 6 个字节了,可真的是这样吗? 代码结果: 诶这里S1类型大小居然是 12,S2类型大小居然是 8。 啊为什么会这样啊?...在使用之前需要引入头文件 #include 问题引入:那么S1结构体每个元素偏移量是多少?...那么我们就可以大概画出,结构体S1大概在内存中存储位置 假设我们结构体是红箭头位置开始存储!...他都存储在结构体变量偏移量为0地址处。 图片展示: ✅ 结构体内存对齐规则二 ⛳️ 其他成员变量要对齐某个数字 (对齐数) 整数倍地址处。

39710
领券