2019 年伴随着不开心的事情到来,元旦的时候整个人都有些崩溃。 我又是有点迷信的人,觉得一件事的开端闹心那么后面也不会太好,觉得 2019 对我不太友好。幸好我是个乐天派,想到这些的时候我干脆不信这迷信就好了。毕竟在我们所认知的范围内时间是连续的,新年不过是人为主观地划分,这样一想心情算是舒慰了些。

每次展望前面要经历一段时间的时候总会觉得很漫长,而事后却觉得白驹过隙。仔细回想起来整个 2019 我也没做什么事,除去春招秋招外,大部分时间碌碌而过。总是在时间将逝的时候才倍加珍惜时间,回过头来感叹实在是浪费了太多的大好时光。不禁想起那句 “子在川上曰:‘逝者如斯夫,不舍昼夜’”。越来越觉得告别学生身份的时刻将近,尤其是在大我们一届学长拍照、收拾行装、毕业离开校园,告别学长们后,这种感觉日日加深,几乎没怎么过过大学生活的我突然很留念大学生活,想拼命地抓住它的尾巴。

阅读全文 »

TyporaAsh 主题实在是太爽了,但唯一一点美中不足就是我们在 md 中编写 html 格式时, html 编辑框的背景颜色和文字颜色几乎一样,看起来十分的晃眼,带来了不便。

要解决这个问题,我们在 ash.css 文件的 :root 下增加一行格式即好。

1
--rawblock-edit-panel-bd: #555;

因为 Ash 主题的背景为 #666,于是我选择了 #555 与它搭配。

不知道大家会不会被自己电脑桌面排列杂乱的图标给气到,作为强迫症的我在之前每次看到自己乱糟糟的桌面时就会感觉很别扭。后面就特意在桌面设了个文件夹,加图标放到里面,但这样桌面虽然整洁了点,但打开软件时就要点开文件夹,很麻烦。直到后来在大一下的时候遇到了 Wox,这个问题才得到了解决。 Wox 真的是解救我的一款软件,在解决桌面问题的同时它也意外地带来了意外惊喜 —— 改变了我使用电脑的工作方式。首先先秀一下我的桌面吧。

mark

阅读全文 »

秋招的一些经验(后台开发方向)

秋招可以说是学生时代的重要一战,秋招的成败牵系着职业的起点。想在秋招中得到心仪的 offer,正确的意识和打法就尤为重要。有很多学生以为秋招是在自己毕业后的那个秋天,到了八九月份才意识到是现在这个秋天,再慌乱地进行准备,结果可想而知了,虽不能一棒子打死,但总归不能够充分发挥出自己的实力。意识如此,打法也是这样子,有了意识,却没有正确的打法,也极有可能事倍功半。

阅读全文 »

我发现勇气根本靠不住,只有完全的疯狂才有意义。
写这篇文章时,九月画下句号,十月刚刚起笔。回忆这一个月,无数的片段涌上心头,诉说着它们的故事,有焦虑、有等待、有充实、有恐惧、有喜悦,但没有迷茫。从初中刚开始学编程的那一刻起,对大厂的渴望或许便铭刻在了我的心上。上大学以来,我越发觉得我接受不了小厂,剑指BAT,从没改变,(梦想当然是 Google),这个九月,我终于如愿了。
阅读全文 »

在地平线面试时和面试官聊到进程和线程的区别,自己说到线程切换要比进程切换快,面试官问到具体是为什么。

orz,无奈自己没有好好学操作系统,也没有复习这个。

面试官非常 nice,告诉我是因为有关 CPU 的缓存问题,其关键是 TLB。

线程共享资源:

a. 堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此 new 出来的都是共享的(16 位平台上分全局堆和局部堆,局部堆是独享的)

b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的

c. 静态变量 虽然对于局部变量来说,它在代码中是 “放” 在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss 和.data 段,是共享的

d. 文件等公用资源 这个是共享的,使用这些公共资源的线程必须同步。

e. 地址空间

f. 子进程、闹铃、信号及信号服务程序、记账信息

g. 进程代码段

线程独享资源

寄存器

程序计数器

状态字

线程优先级

错误返回码

请带着批判的眼光看这篇文章。或许我的一些答案是不对的。如果您发现了错误,烦请指出。
1. C++对象模型

这个要重点掌握, 要明白类里有什么,每个类的对象里又有什么。尤其是对虚函数表的了解。这块知识较多,不在这篇文章中详述。网上有着很多优秀的博客来介绍。

https://coolshell.cn/articles/12176.html

https://www.jianshu.com/p/9fb37bb3094f

  1. C++ 多态机制的实现原理

    主要就是上面问题中的虚函数表。

  2. 如果一个类的指针为 nullptr ,那么调用他的成员函数会不会出错。出错的话是在哪一阶段出错。

    也是对 C++ 内存模型的一个考察以及动态绑定静态绑定。每个类的成员函数都在.text 代码段,静态绑定的时候如果成员函数不访问成员变量的话那么这个函数不会出问题。如果说是虚函数或这个函数访问了成员变量,那么就会出错。虚函数出错是因为其动态绑定,因为是 nullptr, 无法确定其虚函数表。

    阅读全文 »

今天做题的时候遇到这样一个问题。

以下程序片段输出内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Demo {
public:
Demo():count(0) {}
~Demo() {}

void say(const std::string&msg) {
fprintf(stderr,"%s\n", msg.c_str());
}
private:
int count;
};

int main(int argc, char **argv) {
Demo* v = NULL;
v->say("hello world");
}
阅读全文 »

突然想起小伙伴前段时间给我看的一段神仙代码。实在特有诱惑力了。。当时女票喊我吃饭我都在看这段代码,话不多说,放码过来。

1
printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);

要解开这道题,我们首先要知道下面几点。

  • a[3] == 3[a]
    转换为指针角度看, a[3] = *(a+3) = *(3+a) = 3[a]
  • "abcdefg"[3] 这种表示相当于 char str[]="abcdefg"; str[3]
  • 知道了上面那点后,我的目光就聚焦在 unix 上,我感觉它应该是一个数字,一开始以为它是个变量,但代码中没有描述,我问小伙伴这是不是全量代码,小伙伴说文章里没有看到其他的。。于是我就开始猜他的值,一开始猜的 3,是因为忘记了字符串中 “\0xx” 的意义,把他们当成了 3 个字符来看。其实它们是一个字符的,这种格式表示八进制的 ASCII 码。然后猜 unix 值为 1,后面才晓得 unix 是个宏定义, #define unix 1,这样,我们可以将上面的题目转换成较易看懂的。
1
printf( &("\021%six\012\0"[1]), "have"[1]+"fun"-0x60);

众所周知, printf() 的第一个参数为字符串,或者说字符串的起始地址,我们分析后可知为 %six\012\0, '%s' 表示一个字符串,故我们看第 2 个参数, have[1] 也便是 'a''a'-0x60 = 97 - 96 = 1, "fun"+1 也便是字符串 "un" 的起始地址,\012 = 10, 对应 ASCII 码也便是 \n

所以这段代码其实是 printf("unix\n");

unix

很棒很惊艳的代码。

阅读全文 »
0%