<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[chengchaonan的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/chengchaonan</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; chengchaonan]]></copyright><item><title><![CDATA[文件的逻辑结构：无结构文件(流式文件)和有结构文件(记录式文件)]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/105231793</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/105231793</guid><author>chengchaonan</author><pubDate>Tue, 31 Mar 2020 20:57:16 +0800</pubDate><description><![CDATA[转载地址：

https://blog.youkuaiyun.com/haiross/article/details/46829875?utm_source=blogxgwz7

文件的逻辑结构是从用户观点出发看到的文件的组织形式。文件的物理结构是从实现观点出发，又称为文件的存储结构，是指文件在外存上的存储组织形式。文件的逻辑结构与存储介质特性无关，但文件的物理结构与存储介质的特性有很大关系。
按逻辑结构，文...]]></description><category></category></item><item><title><![CDATA[静态库，动态库，opencv]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/103136716</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/103136716</guid><author>chengchaonan</author><pubDate>Tue, 19 Nov 2019 13:35:49 +0800</pubDate><description><![CDATA[静态库是一些编译完的目标文件，与一些用得到它的目标文件进行链接，形成可执行文件了，也就是发生在链接阶段，这样形成的可执行文件的体积就会非常庞大，如果静态库发生变化，那么需要重新链接形成可执行文件。

动态库文件也是编译过的目标文件，但是是需要它的目标文件在运行时一起组成可执行文件，也就是发生在运行阶段。
...]]></description><category></category></item><item><title><![CDATA[float类型的数据在内存中的存储方式及精度问题]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/103062528</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/103062528</guid><author>chengchaonan</author><pubDate>Thu, 14 Nov 2019 10:15:33 +0800</pubDate><description><![CDATA[二进制浮点型如何存储在内存中

计算机内存表示的是二进制的科学计数法，如同十进制的科学计数法一样，1000.001转换成科学技术法是1.000001*2^3，即这个数的指数位为3，由于指数位是采用移位的存储方式，所以指数位的数值为移动的位数+127（其中左移为正，右移为负），那么1.000001*2^3的指数为为3+127=130，其二进制表示为10000010，其位数部分为000001后面的零补...]]></description><category></category></item><item><title><![CDATA[linux中strings命令的作用]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/98198009</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/98198009</guid><author>chengchaonan</author><pubDate>Fri, 02 Aug 2019 13:52:34 +0800</pubDate><description><![CDATA[转载原文地址：

https://blog.youkuaiyun.com/stpeace/article/details/50077677
]]></description><category></category></item><item><title><![CDATA[elf文件与符号表]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/98081962</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/98081962</guid><author>chengchaonan</author><pubDate>Fri, 02 Aug 2019 09:26:29 +0800</pubDate><description><![CDATA[关于符号表：

符号就是全局变量和函数名，符号表中不关注代码中的局部变量，只关注全局变量和函数，分别放在.data. .BSS .text段

符号和符号表的介绍：https://www.jianshu.com/p/bda60193808d

其中使用readelf -s 可查看目标文件的符号表信息

节和段之间的关系：

ELF 是可执行目标文件的一种格式，上计算机系统的时候曾经简略的接触到，这...]]></description><category></category></item><item><title><![CDATA[三目运算符跟赋值运算符的计算顺序]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/97258644</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/97258644</guid><author>chengchaonan</author><pubDate>Thu, 25 Jul 2019 14:04:49 +0800</pubDate><description><![CDATA[a=2&gt;1?3:4
可分成几个部分，用括号分开：
(a=)(2&gt;1)?(3):(4)
最左边是赋值操作
第二个部分是一个判断
第三和第四部分是两个常数
首先判断第三部分是否成立，成立即选择第三部分，否则选择第四部分
像上面那个2&gt;1成立，所以就执行了a=3

赋值运算是最后一步才进行的。

https://blog.youkuaiyun.com/weixin_42487516/article...]]></description><category></category></item><item><title><![CDATA[c中求二维数组的行数和列数]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/96887616</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/96887616</guid><author>chengchaonan</author><pubDate>Mon, 22 Jul 2019 19:14:07 +0800</pubDate><description><![CDATA[定义一个二维数组int array[A][B]，可以通过计算sizeof获取行列数。


sizeof(array[0][0])为一个元素占用的空间，
sizeof(array[0])为一行元素占用的空间，
sizeof(array)为整个数组占用的空间，


行数 = sizeof(array)/sizeof(array[0]);

列数 = sizeof(array[0])/sizeof(a...]]></description><category></category></item><item><title><![CDATA[c中指针赋值为0]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/96843870</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/96843870</guid><author>chengchaonan</author><pubDate>Mon, 22 Jul 2019 13:39:16 +0800</pubDate><description><![CDATA[指针赋值为0会得到一个空指针，null，这种现象在c中是有定义的。

值为0的整形常数表达式或强制转换为void *类型的表达式可通过强制类型转换、赋值或比较操作转换为任意类型的指针。其结果将产生一个空指针。


...]]></description><category></category></item><item><title><![CDATA[二维字符数组与字符串数组]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/96836884</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/96836884</guid><author>chengchaonan</author><pubDate>Mon, 22 Jul 2019 10:46:00 +0800</pubDate><description><![CDATA[首先，对于一维字符数组：char a[N]={};

其实最后代表的也是一个字符串

字符数组的初始化有两种方式：



但其实使用字符常量初始化数组的时候，可以不加上这个 '\0',而使用字符串初始化字符数组的时候，是自动加上'\0'，所以要将\0占的字节大小算进去。字符数组并不要求它的最后一个字符为'\0'，甚至可以不包含'\0'，向下面
这样写是完全合法的。
char str[5]={'C'...]]></description><category></category></item><item><title><![CDATA[c中int和long类型]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/96271935</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/96271935</guid><author>chengchaonan</author><pubDate>Wed, 17 Jul 2019 09:20:43 +0800</pubDate><description><![CDATA[16位系统：long是4字节，int是2字节

32位系统：long是4字节，int是4字节

64位系统：long是4字节，int是4字节



指针长度默认是unsigned long。



int的长度，是由硬件和系统共同决定的。比如当年的dos是运行在16位CPU下的，他的int就是两个字节，win95是运行在32位CPU下的，但是win95还是16位的系统设计，所以...]]></description><category></category></item><item><title><![CDATA[mmap内存映射和shmget共享内存]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/91964195</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/91964195</guid><author>chengchaonan</author><pubDate>Fri, 14 Jun 2019 12:41:17 +0800</pubDate><description><![CDATA[转载原文地址：

linux中的两种共享内存。一种是我们的IPC通信System V版本的共享内存，另外的一种就是我们今天提到的存储映射I/O（mmap函数）


在说mmap之前我们先说一下普通的读写文件的原理，进程调用read或是write后会陷入内核，因为这两个函数都是系统调用，进入系统调用后，内核开始读写文件，假设内核在读取文件，内核首先把文件读入自己的内核空间，读完之后进程在内核回归用户...]]></description><category></category></item><item><title><![CDATA[cpu结构框图]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/90742417</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/90742417</guid><author>chengchaonan</author><pubDate>Sun, 02 Jun 2019 19:30:52 +0800</pubDate><description><![CDATA[转载原文地址：

https://blog.youkuaiyun.com/stpeace/article/details/80101441

我们都知道CPU的根本任务就是执行指令，对计算机来说最终都是一串由“0”和“1”组成的序列。CPU从逻辑上可以划分成3个模块，分别是控制单元、运算单元和存储单元，这三部分由CPU内部总线连接起来。如下所示：





控制单元：控制单元是整个CPU的指挥控制中心，由...]]></description><category></category></item><item><title><![CDATA[linux虚拟空间布局]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/90645112</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/90645112</guid><author>chengchaonan</author><pubDate>Tue, 28 May 2019 18:53:27 +0800</pubDate><description><![CDATA[转载原文地址：

https://www.cnblogs.com/xzzzh/p/6596982.html
]]></description><category></category></item><item><title><![CDATA[子类的构造函数可以使用初始化列表的方式对父类的成员变量进行赋值吗？]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/90643428</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/90643428</guid><author>chengchaonan</author><pubDate>Tue, 28 May 2019 18:25:06 +0800</pubDate><description><![CDATA[class Rectangle{
public:
 Rectangle() :a(0), b(0){}
 Rectangle(int x, int y) :a(x), b(y){}

public:
 int a;
 int b;
};
class Square :public Rectangle
{
public:
 Square(int x):a(x) {}
}...]]></description><category></category></item><item><title><![CDATA[STL中的迭代器失效的问题]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/90639541</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/90639541</guid><author>chengchaonan</author><pubDate>Tue, 28 May 2019 15:02:39 +0800</pubDate><description><![CDATA[转载原文地址：

https://blog.youkuaiyun.com/axuan_k/article/details/52588441

迭代器失效,有两个层面的意思:

1. 无法通过迭代器++,--操作遍历整个stl容器。记作: 第一层失效。

这种情况下只需要，迭代器++到达下一个迭代器的地址即可。
2. 无法通过迭代器存取迭代器所指向的内存。 记作: 第二层失效。

这种情况下，通过++也已经到...]]></description><category></category></item><item><title><![CDATA[vector扩容原理]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/90634737</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/90634737</guid><author>chengchaonan</author><pubDate>Tue, 28 May 2019 10:40:26 +0800</pubDate><description><![CDATA[转载原文地址：

https://blog.youkuaiyun.com/yangshiziping/article/details/52550291

关于vector,始终记住它必须使用的连续空间的一片内存：

在push_back的过程中，如果采用的方式是：

vector&lt;int&gt;v;

v.push_back(1);

std::vector&lt;int&gt;::iterator ...]]></description><category></category></item><item><title><![CDATA[互斥锁和条件变量]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/90582802</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/90582802</guid><author>chengchaonan</author><pubDate>Mon, 27 May 2019 00:00:23 +0800</pubDate><description><![CDATA[信号量（semaphore）与已经介绍过的 IPC 结构不同，它是一个计数器。信号量用于实现进程间的互斥与同步，而不是用于存储进程间通信数据。

转载原文地址：https://www.jianshu.com/p/01ad36b91d39

一直以来都理解错了，不是使用条件变量再加上一对互斥锁，而是条件变量内部引入一个互斥锁，其实主要还是条件变量在起作用，这样会提高效率，看下面的例子。


w...]]></description><category></category></item><item><title><![CDATA[多进程和多线程]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/90581983</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/90581983</guid><author>chengchaonan</author><pubDate>Sun, 26 May 2019 22:37:00 +0800</pubDate><description><![CDATA[转载原文地址：

http://www.importnew.com/21897.html

https://blog.youkuaiyun.com/qq_25408423/article/details/81979072
]]></description><category></category></item><item><title><![CDATA[linux下的内存页式管理]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/90581473</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/90581473</guid><author>chengchaonan</author><pubDate>Sun, 26 May 2019 22:07:48 +0800</pubDate><description><![CDATA[转载原文地址：

https://blog.youkuaiyun.com/h674174380/article/details/75453750

因为内存空间可能没有连续的4GB大小的空间共一个虚拟进程来运行，但是有很多不连续的物理内存空间，所以就考虑，将物理内存以4KB为单位进行划分，同样，将虚拟内存空间也以4KB为单位进行划分。将常用的4KB部分放到内存中，不常用的放在磁盘中。当有需要的进程部分需要运行...]]></description><category></category></item><item><title><![CDATA[map和hash map之间的区别]]></title><link>https://blog.youkuaiyun.com/chengchaonan/article/details/90516603</link><guid>https://blog.youkuaiyun.com/chengchaonan/article/details/90516603</guid><author>chengchaonan</author><pubDate>Fri, 24 May 2019 15:11:00 +0800</pubDate><description><![CDATA[为什么会出现hash table，如果是用数组存储数据，如果想要找到其中一个数据，需要从头进行遍历，因为不知道这个数据存储到了数组的哪个位置。使用链表也是，需要从头节点或者尾节点开始进行遍历。

如果在存储一个数据的时候，就知道它的位置，那么在查找的时候就直接根据这个位置去找这个数据。hash表就实现这样一个功能，但是因为如果不同的值映射到了一个位置，那么根据这个位置去找就找不到唯一的值，这就是哈...]]></description><category></category></item></channel></rss>