放弃高薪的我现在怎么样了! 读完《百万富翁快车道》,突然会搞钱了!附pdf完整版资源 内存对⻬是什么?为什么需要考虑内存对⻬?

放弃高薪的我现在怎么样了! 读完《百万富翁快车道》,突然会搞钱了!附pdf完整版资源 内存对⻬是什么?为什么需要考虑内存对⻬?

小红书:职场选择与生活感悟 📍 杰尼龟刷牛客 💼 华南理工大学 Java 发布于广东 关注 放弃高薪的我现在怎么样了 本人bg:23年毕业,当时拿到了几家大厂offer,我放弃了互联网大厂的高薪,选择了最适合自己的,平安产险科技。

现在看到大家又在纠结offer,想分享一下我的心得体会。

1、当时为什么放弃高薪

其实核心原因非常非常简单,我是一个非常追求稳定性的人,因为我看到学长学姐不稳定造成的动荡局面,真的有点怕了,而且所有工作都是对等的,给你高薪就一定要你多工作多付出,或者要以不稳定为代价,毕竟天下掉馅饼的日子是不存在的,高薪也意味着涨薪会相对困难,因为企业为了招你,已经倒挂了很多老员工了,后面除非有非常重大的贡献,不然还一味给你涨薪那肯定说不过去。而且我是非常不喜欢高强度工作和高压力工作的,就是可以一阵忙,但是不能阵阵忙,那人真的受不了,我还是想享受生活的。所以,我放弃了其他互联网大厂,毅然选择了平安产险科技,当时女朋友还很反对我,觉得这样我们在深圳没办法过的很好(她那时候还不知道我家家境还可以),但是我的一在坚持,她也就支持我了。

2、现在我怎么样

怎么样呢,就正常呗,和我预想的其实一样,平安产险科技确实很稳定,而且产险比其他险种业务甚至更稳定,我基本没有什么35岁焦虑的情绪,我们就在深圳福田市中心,就是那种金融打工圈,每天中午有时候午休有时候出去走走,最近深圳也降温了,但是我还是很喜欢出去走走,感觉很舒服,晚上约个朋友或者和女朋友吃个晚饭,偶尔回家做饭吃,就咋说呢,也没啥特别的好,就是很平淡的生活吧,或者说平淡的幸福的生活吧,不然还能怎么样呢,至少我还是很享受这种生活的感觉的。最近要圣诞节了,我们周边商圈的节日氛围非常浓厚,内部也有很浓厚的节日氛围,今天还给我们送来了圣诞拉花咖啡,很好喝!

而且该说不说平安产险的福利是真的好,我记得我刚入职的时候就给我们过渡的时间,报道期间住宿费和路费全报销,现在每逢过节都有过节费和福利,如果我们需要考证也都给报销,工作一年后还有企业年金,可以自选是否缴纳。

所以还是要看你到底想要什么样的人生,然后依照这个去规划,在规划中我们需要补齐的是信息差,比如我了解到平安产险各方面很符合我想要的,我就选了,而不是说我知道了我想要什么,然后随机选一个,那就真的是开盲盒了。

《百万富翁快车道》pdf资源:

「百万富翁快车道pdf」,复制整段内容,打开最新版「夸克APP」即可获取。​ 链接:https://pan.quark.cn/s/f2249a893613

内存对⻬是什么?为什么需要考虑内存对⻬?

1. 内存对齐

内存对齐可以提高访问内存的速度。当数据按照硬件要求的对齐方式存储时,CPU可以更高效地访问内存,减少因为不对齐而引起的性能损失。

2. 缓存行

许多计算机体系结构使用缓存行(cache line)来从内存中加载数据到缓存中。如果数据是对齐的,那么一个缓存行可以装载更多的数据,提高缓存的命中率。

3. 原子性操作

有些计算机架构要求原子性操作(比如原子性读写)必须在特定的内存地址上执行。如果数据不对齐,可能导致无法执行原子性操作,进而引发竞态条件。

内存对齐规则

基本类型的对齐值就是其sizeof值;数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行;结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行;

//2020.05.12 公众号:C语言与CPP编程

#include

struct

{

int i;

char c1;

char c2;

}Test1;

struct{

char c1;

int i;

char c2;

}Test2;

struct{

char c1;

char c2;

int i;

}Test3;

int main()

{

printf("%d\n",sizeof(Test1)); // 输出8

printf("%d\n",sizeof(Test2)); // 输出12

printf("%d\n",sizeof(Test3)); // 输出8

return 0;

}

默认#pragma pack(4),且结构体中最长的数据类型为4个字节,所以有效对齐单位为4字节,下面根据上面所说的规则以第二个结构体来分析其内存布局: 首先使用规则1,对成员变量进行对齐:

sizeof(c1) = 1 <= 4(有效对齐位),按照1字节对齐,占用第0单元;sizeof(i) = 4 <= 4(有效对齐位),相对于结构体首地址的偏移要为4的倍数,占用第4,5,6,7单元;sizeof(c2) = 1 <= 4(有效对齐位),相对于结构体首地址的偏移要为1的倍数,占用第8单元;

然后使用规则2,对结构体整体进行对齐:

第二个结构体中变量i占用内存最大占4字节,而有效对齐单位也为4字节,两者较小值就是4字节。因此整体也是按照4字节对齐。由规则1得到s2占9个字节,此处再按照规则2进行整体的4字节对齐,所以整个结构体占用12个字节。

根据上面的分析,不难得出上面例子三个结构体的内存布局如下:

更改C编译器的缺省字节对齐方式:

在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:

使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。使用伪指令#pragma pack (),取消自定义字节对齐方式。

另外,还有如下的一种方式:

__attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。attribute((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

不同平台上编译器的 pragma pack 默认值不同。而我们可以通过预编译命令#pragma pack(n), n= 1,2,4,8,16来改变对齐系数。

例如,对于上个例子的三个结构体,如果前面加上#pragma pack(1),那么此时有效对齐值为1字节,此时根据对齐规则,不难看出成员是连续存放的,三个结构体的大小都是6字节。

如果前面加上#pragma pack(2),有效对齐值为2字节,此时根据对齐规则,三个结构体的大小应为6,8,6。内存分布图如下:

例子

请写出以下代码的输出结果:

#include

struct S1

{

int i:8;

char j:4;

int a:4;

double b;

};

struct S2

{

int i:8;

char j:4;

double b;

int a:4;

};

struct S3

{

int i;

char j;

double b;

int a;

};

int main()

{

printf("%d\n",sizeof(S1)); // 输出8

printf("%d\n",sizeof(S1); // 输出12

printf("%d\n",sizeof(Test3)); // 输出8

return 0;

}

分析问题

在存储某些数据时,其实际需求的数据长度可能要小于一个字节,只占一位或几位。为了节省空间,处理方便,在C中引入了另一种结构,称为“位域”或“位段”。

所谓“位域”,就是把一个字节中的“位”按照实际的需求分成不同的区域,表明每个区域位数、区域的域名,并允许程序按照域名进行操作。如此就可以把不同的对象用一个字节来表示。

位域的定义与结构定义相仿,其形式为:

struct 位域的结构体名

{

//位域列表

}

位域列表的形式为:【类型说明符】 【位域名】:【位域的长度】例如:

struct ab

{

int a:8;

int b:2;

int c:6;

}

对于位域的定义,有以下几点说明:

(1)一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。

例如:

struct wy

{

unsigned a:6;

unsigned 0; //空域

unsigned b:4; //从一单元开始存放

unsigned c:4;

}

在这个位域定义中,a占第一字节的6位,后2位填0表示不使用,b从第二字节开始,占用4位,c占用4位。内存结构如下图所示。

(2)由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是不能超过8位二进位。

(3)位域可以无位域名,这时它只用来填充或调整位置。无名的位域是不能使用的。

例如:

struct wk

{

int a:1;

int :2; //不能使用

int b:3;

int c:2;

}

从以上述分析可以看出,位域可以看做是一种结构类型,其特点是成员均按二进位分配。

根据以上分析可知,在s1中i在相对0的位置,占8位即第1个字节。j就在相对第2个字节的位置。由于一个位置的字节数是4位的倍数,因此不用对齐,可以就放在那里。a要放在4位倍数关系的位置上,因此不用对齐,就放在那里。

目前总共是16位,2字节,由于double是8字节的,因此要在距相对0位置为8个字节的位置处放下。所以从16位开始到8个字节之间的位置被忽略,直接放在相对第8字节的位置,因此,s1总共占16字节。存储结构如下图所示。

在s2中,每个数据都要对照结构体内最大数据的最小公倍数补齐。如i,j共12位,小于double的8个字节需按8字节补齐,a位也要按8字节补齐,共24个字节,存储结构如下图所示。

在s3中,i是int型数据(按32位机分析)占4个字节,j是char型数据占一个字节,a是int型数据占4个字节,b是double型数据占8个字节。 在此b是最大的数据类型,因此i、j、a都要向b的double型对齐,即i、j、a的数据长度要向b对齐为8个字节,四个数据共占据32个字节。s3的存储结构如下图所示。

答案

sizeof(S1)=16

sizeof(S2)=24

sizeof(S3)=32

说明:结构体作为一种复合数据类型,其构成元素既可以是基本数据类型的变量,也可以是一些复合型类型数据。对此,编译器会自动进行成员变量的对齐以提高运算效率。默认情况下,按自然对齐条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同,向结构体成员中size最大的成员对齐。

许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,而这个k则被称为该数据类型的对齐模数

相关推荐