<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[u014209688的专栏]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/u014209688</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; u014209688]]></copyright><item><title><![CDATA[限制长度双向链表的插入操作]]></title><link>https://blog.csdn.net/u014209688/article/details/102578327</link><guid>https://blog.csdn.net/u014209688/article/details/102578327</guid><author>u014209688</author><pubDate>Wed, 16 Oct 2019 02:59:26 +0800</pubDate><description><![CDATA[面试遇到的问题，一开始面试官是问我有什么方案可以实现排行榜，当时给出了两个方案。后面面试官又在我的其中一种方案上让我手写代码实现排序双线链表的插入，根据score值插入，并且链表长度限制在100。

  需要考虑的点：1）插入在链表表头的；2）插入到链表表尾；3）插入到链表中间；4）需要在遍历整个链表的时候统计链表的长度；5）如果长度刚好在100而插入刚好在末尾，则此时不需要执行插入操...]]></description><category></category></item><item><title><![CDATA[Effective STL：杂记（一）]]></title><link>https://blog.csdn.net/u014209688/article/details/102528166</link><guid>https://blog.csdn.net/u014209688/article/details/102528166</guid><author>u014209688</author><pubDate>Sun, 13 Oct 2019 18:47:54 +0800</pubDate><description><![CDATA[1. 避免使用vector&lt;bool&gt;

  vector&lt;bool&gt;实际上并不能算是一个STL容器，实际上也并不存储bool。因为一个对象要成为STL容器，就必须满足C++标准的第23.1节列出的所有条件，其中一个条件是，如果 c 是包含对象T的容器，而且 c 支持operator[]，则必须能够编译下面代码：


T *p = &amp;c[0];

  也就是...]]></description><category></category></item><item><title><![CDATA[T t与T t = T()的区别]]></title><link>https://blog.csdn.net/u014209688/article/details/102522814</link><guid>https://blog.csdn.net/u014209688/article/details/102522814</guid><author>u014209688</author><pubDate>Sat, 12 Oct 2019 16:30:52 +0800</pubDate><description><![CDATA[主要的区别就是默认构造函数对内置类型的初始化上。如果没有T中没有定义构造函数，则对于“T t”，并不会对 t 中内置类型设置初始值，是一个随机值。但对于“T t = T()”，对 t 中内置类型会设置初始值，如 int 类型会设置为0。而对于自定义类型，不管哪种方式，都会调用构造函数初始化。


#include &lt;iostream&gt;

using namespace std;...]]></description><category></category></item><item><title><![CDATA[删除链表倒数第k个节点]]></title><link>https://blog.csdn.net/u014209688/article/details/102514892</link><guid>https://blog.csdn.net/u014209688/article/details/102514892</guid><author>u014209688</author><pubDate>Sat, 12 Oct 2019 10:01:50 +0800</pubDate><description><![CDATA[在面试的时候遇到的手写代码题目，删除倒数第k个节点，需要先处理链表长度小于k、倒数第k个节点刚好是第1个节点、链表为空、k值小于等于0的情况。然后方法的话是先用找到第k个节点的方法找到倒数第k-1个节点，这样子删除这个节点的下一个节点就可以了。

  实际上只需要实现remove_n函数，这里的代码增加了对链表的初始化、内存释放以及打印函数，让结果可以直观的看出来，代码也能够直接运行。...]]></description><category></category></item><item><title><![CDATA[面试：杂记（三）]]></title><link>https://blog.csdn.net/u014209688/article/details/102454492</link><guid>https://blog.csdn.net/u014209688/article/details/102454492</guid><author>u014209688</author><pubDate>Wed, 09 Oct 2019 10:47:03 +0800</pubDate><description><![CDATA[1. SO_REUSEPORT和SO_REUSEADDR

  SO_REUSEADDR用于绑定不同的本地地址和相同的端口到套接字上。也就是说设置了SO_REUSEADDR之后，不同的进程可以通过不同的本地地址，创建同一个端口的套接字。

  SO_REUSEPORT则是可以多个进程bind到相同的IP和端口。相对与SO_REUSEADDR，它能让IP地址也是一样的。这样子每个进程就可...]]></description><category></category></item><item><title><![CDATA[面试：杂记（二）]]></title><link>https://blog.csdn.net/u014209688/article/details/102407960</link><guid>https://blog.csdn.net/u014209688/article/details/102407960</guid><author>u014209688</author><pubDate>Tue, 08 Oct 2019 20:22:29 +0800</pubDate><description><![CDATA[前段时间面试了某大厂游戏部门，这里记录下其中的两个问题。

1. 在中国，MTU设置为多少合适？

  遇到这个问题的时候是懵逼的，就知道MTU最大为1500。后面和同事探讨了下，才知道国际通用576，因为目前最老的路由器超过576就会分包，而我们公司UDP包内容限定为480应该就是这个考量。对于TCP分包并没有影响，因为TCP协议会自己整合在一起，但是如果UDP报文如果分包了，就应用...]]></description><category></category></item><item><title><![CDATA[More Effective C++：自增与自减操作符的重载]]></title><link>https://blog.csdn.net/u014209688/article/details/102402694</link><guid>https://blog.csdn.net/u014209688/article/details/102402694</guid><author>u014209688</author><pubDate>Tue, 08 Oct 2019 19:43:37 +0800</pubDate><description><![CDATA[在C++中，自增与自减均有前缀形式与后缀形式。


int i = 0;
++i;       // 自增前缀形式
i++;       // 自增后缀形式
--i;       // 自减前缀形式
i--;       // 自减后缀形式

  总所周知，前缀与后缀的区别就是前缀是直接操作后再返回，而后缀则是先用临时对象保存旧值，增加旧值后再返回之前的临时对象。即有：


i = 0...]]></description><category></category></item><item><title><![CDATA[Effective C++：初始化列表]]></title><link>https://blog.csdn.net/u014209688/article/details/102252829</link><guid>https://blog.csdn.net/u014209688/article/details/102252829</guid><author>u014209688</author><pubDate>Sun, 06 Oct 2019 22:03:22 +0800</pubDate><description><![CDATA[C++中初始化成员变量有两种方式：一种是在构造函数体内对成员变量初始化；另一种则是初始化列表方式，就是跟在构造函数后面用于初始化指定成员变量的列表。两种初始化方式如下：


class Test {
public:
    // 初始化列表初始化_mem成员变量
    Test(int mem) : _mem(mem) {}
    // 一般的构造函数
    Test(int me...]]></description><category></category></item><item><title><![CDATA[More Effective C++：隐式类型转换与explicit关键字]]></title><link>https://blog.csdn.net/u014209688/article/details/102185437</link><guid>https://blog.csdn.net/u014209688/article/details/102185437</guid><author>u014209688</author><pubDate>Sun, 06 Oct 2019 18:28:34 +0800</pubDate><description><![CDATA[1. 隐式类型转换

  C++编译器能在两种数据类型之间进行隐式转换（implicit conversion），它从C语言继承过来的转换方法，例如char隐式转换为int和short转换为double之类的，对于用户自定义类型，则可以自己提供函数让编译器进行隐式类型转换。

  通过单参数构造函数（single-argument constructors）和隐式类型转换运算符两种方式，我...]]></description><category></category></item><item><title><![CDATA[Effective C++：虚函数参数默认值]]></title><link>https://blog.csdn.net/u014209688/article/details/102178752</link><guid>https://blog.csdn.net/u014209688/article/details/102178752</guid><author>u014209688</author><pubDate>Sat, 05 Oct 2019 23:12:21 +0800</pubDate><description><![CDATA[在C++中，对象分为静态类型（static type）和动态类型（dynamic type）。静态类型就是在程序中被声明时所采用的类型；而动态类型则是指“目前所指对象的类型”，它可以表现出一个对象将会有什么行为。


class Shape {
public:
    virtual display(int i = 4) {
        std::cout &lt;&lt; "in S...]]></description><category></category></item><item><title><![CDATA[字节对齐相关]]></title><link>https://blog.csdn.net/u014209688/article/details/100640961</link><guid>https://blog.csdn.net/u014209688/article/details/100640961</guid><author>u014209688</author><pubDate>Sun, 08 Sep 2019 23:01:36 +0800</pubDate><description><![CDATA[C/C++都是按照最大对齐补齐方式的，即按照占空间最大成员来处理对齐，对齐是由于计算机系统的限制导致的。因为许多计算机系统对基本数据类型的合法地址做出了一些限制，要求某种类型对象的地址必须是某个值K（通常是2、4或8）的倍数。这种对齐限制简化了形成处理和内存系统之间接口的硬件设计。

  对齐限制可以提高读写内存的效率。例如对double类型数据，有了对齐限制，就可以用一个内存操作...]]></description><category></category></item><item><title><![CDATA[《编码》之定点数与浮点数]]></title><link>https://blog.csdn.net/u014209688/article/details/100557436</link><guid>https://blog.csdn.net/u014209688/article/details/100557436</guid><author>u014209688</author><pubDate>Sun, 08 Sep 2019 20:15:41 +0800</pubDate><description><![CDATA[《编码》真是一本不错的书，从灯泡通信、继电器、二进制层层深入，再到加法器、汇编、处理器。全部连了起来，精妙啊，可惜现在才看到这本书，不过也为时不玩。

  23章中讲到了定点数与浮点数，所以这里做下记录吧。

1.定点数

  所谓的定点数，就是只小数点的位置总是在数的某个特定的位置，也就是有效位数是固定的。像书中所举的用压缩BCD（用四个位来表示0~9）保存数值就是只留两位小...]]></description><category></category></item><item><title><![CDATA[《现代操作系统》第三章：存储管理]]></title><link>https://blog.csdn.net/u014209688/article/details/98501551</link><guid>https://blog.csdn.net/u014209688/article/details/98501551</guid><author>u014209688</author><pubDate>Mon, 05 Aug 2019 17:28:21 +0800</pubDate><description><![CDATA[操作系统中管理分层存储器体系的部分称为存储器管理（memory manager）
3.1 无存储器抽象
直接使用物理地址；
并行问题；
重定位问题（因为使用的是绝对物理地址）；
装载器需要一定的方法来辨别地址和常数（地址值需要重定位，而常数不需要重定位）。

3.2 一种存储抽象：地址空间
要保证多个应用程序同时处于内存中并且不互相影响，需要解决的问题：保护和重定位。
    保护：给内存块标记保...]]></description><category></category></item><item><title><![CDATA[MySQL：MySQL server has gone away解决]]></title><link>https://blog.csdn.net/u014209688/article/details/97917063</link><guid>https://blog.csdn.net/u014209688/article/details/97917063</guid><author>u014209688</author><pubDate>Wed, 31 Jul 2019 14:51:40 +0800</pubDate><description><![CDATA[我出现这个报错，是在C++项目中用Mysql的库函数mysql_real_query往数据库中插入数据的时候出现的，插入的数据有7M、8M。通过网上搜索这个错误，了解到是因为我们写入的数据太大了，在使用msyql导入大文件sql的时候也可能会出现这个错误的。这个问题是max_allowed_packet配置的默认值太小了，该项的作用是限制mysql服务器端接收到的包的大小，所以我们发送的值...]]></description><category></category></item><item><title><![CDATA[python：filecmp模块的cmp函数]]></title><link>https://blog.csdn.net/u014209688/article/details/97021622</link><guid>https://blog.csdn.net/u014209688/article/details/97021622</guid><author>u014209688</author><pubDate>Tue, 23 Jul 2019 19:20:45 +0800</pubDate><description><![CDATA[项目中有个需求，就是对比多个玩家客户端上报的log内容，找到第一次出现不同的行数，并返回出现不同的玩家信息，代码使用python实现的。很久之前就已经实现了，就是先用filecmp模块的cmp函数逐个对比两个文件，如果出现不同了再逐行对比找到不同的一行。但最近重新看了代码，发现还有更好的办法，就是逐行对比，找到不同的一行或者比完为止。但是具体采用哪种方法呢，这让我有点疑惑，因为一般来说有...]]></description><category></category></item><item><title><![CDATA[ssh下用sz和rz从服务器上传和下载文件]]></title><link>https://blog.csdn.net/u014209688/article/details/96879083</link><guid>https://blog.csdn.net/u014209688/article/details/96879083</guid><author>u014209688</author><pubDate>Mon, 22 Jul 2019 17:53:49 +0800</pubDate><description><![CDATA[最近才了解到有一个这么方便的东西。首先需要安装lrzsz包（Centos下）：


sudo yum install lrzsz

  然后就可以上传文件到服务器：


rz

  直接使用该命令，就会弹出窗口让你选择需要上传的文件了。

  从服务器中下载文件：


sz filename

  直接使用该命令，就会弹出窗口让你选择需要保存该文件的目录了。

 ...]]></description><category></category></item><item><title><![CDATA[C++：map、hash_map、unordered_map]]></title><link>https://blog.csdn.net/u014209688/article/details/95366594</link><guid>https://blog.csdn.net/u014209688/article/details/95366594</guid><author>u014209688</author><pubDate>Wed, 10 Jul 2019 20:39:12 +0800</pubDate><description><![CDATA[面试经常被问的问题之一，便是map和hash_map的区别，以及什么时候用map什么时候用hash_map。另外也了解到还有C++11的unordered_map，所以这里一并介绍三个了。用法就不介绍了，主要介绍区别。

1. 三者的区别

  map底层是用红黑树实现的，空间复杂度为O(n)，是随着节点的增加才增加，而查找的时间时间复杂度则固定是O(log(n))了。因为红黑树本来...]]></description><category></category></item><item><title><![CDATA[C++：const_cast]]></title><link>https://blog.csdn.net/u014209688/article/details/95227383</link><guid>https://blog.csdn.net/u014209688/article/details/95227383</guid><author>u014209688</author><pubDate>Tue, 09 Jul 2019 20:41:48 +0800</pubDate><description><![CDATA[const_cast是一个运算符，和dynamic_cast、static_cast、reinterpret_cast一样都是用于类型的转换的，本来想将这四个一起写的，但是查了const_cast相关的资料，发现const_cast可以牵扯到的也不少，所以单独用一篇博客说明了。

1. 用法

  const_cast的作用很简单，就是去除或增加类型中的const属性或volatil...]]></description><category></category></item><item><title><![CDATA[面试：杂记（一）]]></title><link>https://blog.csdn.net/u014209688/article/details/95065188</link><guid>https://blog.csdn.net/u014209688/article/details/95065188</guid><author>u014209688</author><pubDate>Mon, 08 Jul 2019 17:34:39 +0800</pubDate><description><![CDATA[这里主要记录一些面试中被问过的问题。

1. realloc、malloc、calloc的区别

  工作用的主要是C++，所以只是对malloc了解一些。

  1) void *malloc ( size_t size )

    最常用的一个了，就是申请size个字节大小的空间了，这里不会对分配空间进行初始化操作。

  2) void *calloc ( si...]]></description><category></category></item><item><title><![CDATA[基础：Linux硬件配置信息查看]]></title><link>https://blog.csdn.net/u014209688/article/details/94568207</link><guid>https://blog.csdn.net/u014209688/article/details/94568207</guid><author>u014209688</author><pubDate>Wed, 03 Jul 2019 16:59:20 +0800</pubDate><description><![CDATA[之前面试的时候问到用户量，然后扯到了服务器的配置相关，但服务器是都是由组长申请的，所以当时并不了解。回来后，了解了Linux下硬件信息配置的查看，记录如下。

1. CPU信息

   CPU信息有三种方式查看。

   一种是直接cat /proc/cpuinfo，会打印出所有CPU的详细信息，单个CPU的信息如下：


[user@VM_0_4_centos deb...]]></description><category></category></item></channel></rss>