<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[半山茶馆]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ipmux</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ipmux]]></copyright><item><title><![CDATA[C++基础篇--运算符重载]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/48157049</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/48157049</guid><author>ipmux</author><pubDate>Tue, 01 Sep 2015 15:04:19 +0800</pubDate><description><![CDATA[运算符重载没有多高深复杂，但牵扯到的相关概念和语法变化不少，如果这块基石不牢固，读复杂C++代码时就只有雾里看花的份。
运算符重载由来
    C/C++中所有运算符（+-*/等）默认只用于基本数据类型（int floatdouble等），而对自定义的struct/class通常不适用，如：
    typedef struct TIMETAG
    {
        int hou]]></description><category></category></item><item><title><![CDATA[C潜规则之保持语法简单]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/48004029</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/48004029</guid><author>ipmux</author><pubDate>Wed, 26 Aug 2015 15:51:32 +0800</pubDate><description><![CDATA[有些C语言语法比较生僻，且有其他常规方式替代，建议尽量避开这些装x的写法，少折腾自己，也少折磨别人。下面是个人主观感觉，仅供参考。原则是简单比复杂好。
数组作函数参数
    数组作为函数的参数传递时，会退化成一个地址，也就是说你写的是数组array[]，编译器把它作为地址&array处理，既然如此不如直接写&array清楚而明确。
结构体直接赋值
  struct TEST{
    ]]></description><category></category></item><item><title><![CDATA[C++基础篇--overload重载&override覆盖&overwrite隐藏]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/45038869</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/45038869</guid><author>ipmux</author><pubDate>Tue, 14 Apr 2015 11:11:17 +0800</pubDate><description><![CDATA[Overload、Override和Overwrite英文接近，比较容易混淆，再加上翻译五花八门，使用时张冠李戴，往往是今天清楚明天糊涂。这三个概念在前面章节已分别讨论，这里再集中比较，以作备忘：
Overload
（重载）
    前面分析过C++函数重载是借助C++的name mangling机制，允许在同一作用域中出现多个同名不同参的函数，如：
class Base{

  in]]></description><category></category></item><item><title><![CDATA[C++基础篇--成员函数同名隐藏（overwrite）]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/45025753</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/45025753</guid><author>ipmux</author><pubDate>Mon, 13 Apr 2015 15:18:15 +0800</pubDate><description><![CDATA[C++中成员函数间的各种关系比较复杂，之前介绍过重载和虚函数覆盖，今天再梳理另一种容易让人迷惑的机制--函数隐藏。先看两个例子：
例1.成员函数public继承
class Base{

public:

  void fun1(int a){  cout << "Base::fun1(int a)" << endl;  }

};

class Drv: public Bas]]></description><category></category></item><item><title><![CDATA[C++基础篇--虚函数原理]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/44856549</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/44856549</guid><author>ipmux</author><pubDate>Fri, 03 Apr 2015 17:14:51 +0800</pubDate><description><![CDATA[虚函数算是C++最关键和核心的内容之一，是组件的基础。下面先列出一些相关名词，再围绕它们举例说明虚函数的本质实现原理。
基础概念（英文部分来自C++编程思想）
  1)绑定：Connectinga
 function call to a function body is called binding.（把函数调用和函数实现关联的过程）
  2)早绑定：Whenbinding
 is pe]]></description><category></category></item><item><title><![CDATA[C++基础篇--作用域和自定义命名空间]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/44565807</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/44565807</guid><author>ipmux</author><pubDate>Mon, 23 Mar 2015 17:19:57 +0800</pubDate><description><![CDATA[引子
   为引出本文主题，先举个例子，以便后文对照理解：某学校一年招了3个叫李明的学生，为便于区分：1)按年龄排序分别称大、中、小李明；2)把他们分到不同班，这样各班内部就没有同名的李明，而学校范围内可用1班/2班李明区分；3)大李明加入绘画协会，中李明加入书法协会，小李明加入绘画和外语协会，于是绘画协会里还要用大小或班级区分两个李明。
基本几点：
1.谈到重名，需要指定具体集合范围。全校]]></description><category></category></item><item><title><![CDATA[C++基础篇—函数重载与Extern C]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/43970635</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/43970635</guid><author>ipmux</author><pubDate>Fri, 27 Feb 2015 18:23:00 +0800</pubDate><description><![CDATA[问题引出
    之前提到C存在命名冲突问题，新的C++专门为此引入了namespace机制加以改进（后文介绍），此外还有另一种机制：
    int add(int i, int j) {    return i+i;  }
    float add(float a, float b, floatc)  {    return a+b+c;   }
    void main()]]></description><category></category></item><item><title><![CDATA[C++基础篇--this指针]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/25605147</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/25605147</guid><author>ipmux</author><pubDate>Mon, 12 May 2014 12:38:11 +0800</pubDate><description><![CDATA[1．C++篇—struct到class进化的第一步this指针

很多程序员C语言基础不好，结果用了好多年C++，还是知其然而不知所以然，往往经不起别人一问”xx机制怎么实现的”？比如this指针就是C++的基础机制之一。

this的来由

设想我们是十几年前C++的设计者，从C的struct怎么进化到C++的class？

struct里可以用函数指针作成员变量，并]]></description><category></category></item><item><title><![CDATA[内存篇之程序内存消耗评价指标]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/20695033</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/20695033</guid><author>ipmux</author><pubDate>Fri, 07 Mar 2014 10:38:38 +0800</pubDate><description><![CDATA[嵌入式软件除CPU占用率或者说运行速度外，内存方面还有三大量化评价标准，即ROM size, Peak memory occupation和 max stack depth,虽然不属于什么官方标准，但这三点的确综合反映了程序内存占用方面的整体指标。
    rom size既不是指exe文件大小，也不是lib文件大小，而是目标文件中有效二进制段大小。exe和lib文件中都有一些辅助段，如文件头/]]></description><category></category></item><item><title><![CDATA[C语言文本方式和二进制方式打开文件区别]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/20693823</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/20693823</guid><author>ipmux</author><pubDate>Fri, 07 Mar 2014 10:18:11 +0800</pubDate><description><![CDATA[转自：http://blog.sina.com.cn/s/blog_50b7dd7101012979.html，
我们都知道，文本文件和二进制文件在计算机上面都是以0,1存储的，那么两者怎么还存在差别呢？我觉得，对于编程人员，文本文件和二进制文件就是一个声明，指明了你应该以什么方式（文本方式/二进制）打开这个文件，用什么函数读写这个文件（读写函数），怎么判断读到这个文件结尾。

具体的说：]]></description><category></category></item><item><title><![CDATA[补遗篇之文件I/O]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/20692951</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/20692951</guid><author>ipmux</author><pubDate>Fri, 07 Mar 2014 10:11:30 +0800</pubDate><description><![CDATA[文件I/O库是ANSI C标准的一部分，换句话，任何标准C语言开发环境中都可以用fopen/fread/fwrite/fclose接口访问文件。这里强调与文件I/O相关的几个易混淆的问题。
fopen/open的区别和联系
    unix/linux下文件IO有两套接口，即fopen/open系列，它们区别又联系：
    a. fopen
是标准C库接口，所有C开发环境都要支持它；op]]></description><category></category></item><item><title><![CDATA[补遗篇之函数]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/20156197</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/20156197</guid><author>ipmux</author><pubDate>Fri, 28 Feb 2014 20:50:18 +0800</pubDate><description><![CDATA[函数怎么来的
    函数最本质是跳转和压栈。
    跳转早在汇编时代就广泛应用：做一个汇编子模块，需要时jmp到其起始地址，执行完jmp回之前的地址（想起学微机原理时一堆人围着单板机输入子模块指令，像发报一样）。
    后来发现光有跳转也不够，赤裸裸去，再赤裸裸回，带不走一片云彩。于是想到可以划出一段内存空间，跳转到子模块时传递一些参数信息过去，顺带也可以把跳转前的地址也存进去，jmp]]></description><category></category></item><item><title><![CDATA[硬件篇之总线]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/19489571</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/19489571</guid><author>ipmux</author><pubDate>Wed, 19 Feb 2014 15:41:02 +0800</pubDate><description><![CDATA[博主除了画过几次PCB板子就没搞过硬件，但实践中感觉到，软件从根源上依附于硬件而存在，随硬件的不断演化而发展变化，掌握软件背后的一些硬件基础和发展脉络，编写软件时才能自信而不盲目，主动而不是机械地紧跟软硬件的变化。
    比如总线，看起来它和一般程序员关系不大。但它却串联起很多问题：为什么片上RAM和外部RAM访问速度有差异；为什么CPU访问外部RAM速度慢；为什么访问IO设备更慢；为什么CP]]></description><category></category></item><item><title><![CDATA[硬件篇之字节序]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/19346149</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/19346149</guid><author>ipmux</author><pubDate>Mon, 17 Feb 2014 18:48:36 +0800</pubDate><description><![CDATA[很多人讨厌碰到字节序问题，跟它打交道就像走迷宫，每次都要牺牲不少脑细胞。即使这一次似乎搞清楚了，下次碰到还是要重新在大脑里构建和模拟。这里尽量做一个字节序问的完整备忘记录。
主机字节序
    多字节数据在内存中的字节排列顺序称为主机字节序，主机字节序基本由CPU硬件决定，某些CPU如X86、Z80等为little-endian；有些如moto6800、sparc等为big-endian；而有]]></description><category></category></item><item><title><![CDATA[C优化篇之减少运算量]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/19301855</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/19301855</guid><author>ipmux</author><pubDate>Sun, 16 Feb 2014 22:47:31 +0800</pubDate><description><![CDATA[程序优化的另一个出发点是减少运行过程中的运算量，有两个大的思路：
    1）把部分计算量转移到离线，或者说把一部分工作挪到程序之外，人为处理，以减轻程序本身压力。比如查表、浮点转定点以及其他数学算法的优化等。
    2）分析和剔除代码中的多余水分，由于编译器能把一些简单的无效语句剔除，所以程序员可以做文章的地方一般就是循环体。
查表
   有些算法输入有限离散整数，输出固定的数据集合，]]></description><category></category></item><item><title><![CDATA[硬件篇之MMU]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/19167605</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/19167605</guid><author>ipmux</author><pubDate>Thu, 13 Feb 2014 17:35:42 +0800</pubDate><description><![CDATA[MMU即内存管理单元(Memory Manage Unit），是一个与软件密切相关的硬件部件，也是理解linux等操作系统内核机制的最大障碍之一。可以说，不懂MMU使很多人一直停滞在单片机与无OS的时代。博主之前对MMU也一直是雾里看花，似懂非懂。最近终于自认为云开雾散后，回头总结，感觉有几个概念是阻碍人们理解MMU的元凶。
1）虚拟地址/物理地址
    如果处理器没有MMU，CPU内部执行]]></description><category></category></item><item><title><![CDATA[C优化篇之优化内存访问]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/18896321</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/18896321</guid><author>ipmux</author><pubDate>Sat, 01 Feb 2014 21:55:21 +0800</pubDate><description><![CDATA[目前CPU运行速度远超过内存访问速度，且从趋势看这种速度差距还会越拉越大，提高内存访问效率将是软件优化重要而长期的课题。内存访问优化的一般性措施可大体分两方面：1)减少内存访问；2)调整代码使程序集中顺序地访问内存。
一、减少内存访问的措施包括:
a.充分利用寄存器
    充分利用寄存器缓存数据，是减少内存访问的思路之一。C程序编译后哪些元素由寄存器存储，哪些又会放进内存，取决于CPU以及]]></description><category></category></item><item><title><![CDATA[关于C语言优化]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/17715681</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/17715681</guid><author>ipmux</author><pubDate>Sat, 04 Jan 2014 14:21:26 +0800</pubDate><description><![CDATA[前几天看网上新闻，有人建议把编程纳入高考，且不论是否靠谱，却至少说明一件事：会写点程序不再有什么可炫耀的，将来更有可能成为全民普及技能。其实即使现在，很多人写程序的兴奋感还没消退，就悲哀地发现自己程序写得蹩脚，反倒成为了周围人的笑料。

    一群搞技术的人在一起，能脱颖而出的往往不是代码写得快的那个，而是对技术理解深且能在关键时刻分析解决问题的。掌握一些C语言优化知识，能增强这方面的气场和]]></description><category></category></item><item><title><![CDATA[补遗篇之volatile]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/17653817</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/17653817</guid><author>ipmux</author><pubDate>Sun, 29 Dec 2013 14:36:03 +0800</pubDate><description><![CDATA[C中volatile关键字在程序操作变量时，强制读写变量所在内存，以阻止编译器对某些特殊变量的错误优化。反过来，只有靠程序员用volatile过滤一些特殊情况后，编译器才能大胆优化。volatile作用可总结为：阻止三种情形下的两种编译器优化。
两种编译器优化
    a. 
数据流分析优化：编译器分析程序中变量在哪里赋值、哪里使用、哪里失效，根据分析结果消除多余的变量读取和赋值步骤，如：]]></description><category></category></item><item><title><![CDATA[补遗篇之内联与内嵌]]></title><link>https://blog.youkuaiyun.com/ipmux/article/details/17607675</link><guid>https://blog.youkuaiyun.com/ipmux/article/details/17607675</guid><author>ipmux</author><pubDate>Fri, 27 Dec 2013 12:24:31 +0800</pubDate><description><![CDATA[从没想过有人会把这两个毫不相关的概念混为一谈，可招聘时还真就碰到问内嵌答内联，问内联答内嵌的情况。上网一查，原来内嵌汇编也常被叫内联汇编，中文表述IT名词时真就这么乏力么？蹩脚的撞名一个接一个。
    内联函数即inline函数，其作用是“建议”编译器展开函数，不是一定展开，除非设置强制内联（如gcc的__attribute__((always_inline))）。展开即把函数代码插入被调用位]]></description><category></category></item></channel></rss>