01 2017 档案

摘要:我们通常会说当生命一个 class 时,如果我们不为该 class 指定一个 constructor,那么编译器会替我们实现一个 connstructor,那么这种说法一定对吗? 事实上,这是不对的。这个不是我说的,是深入理解C++对象模型说的,原话是: C++新手一般有两个常见的误解: 首先解释第 阅读全文
posted @ 2017-01-19 03:54 柳下_MBX 阅读(334) 评论(0) 推荐(0)
摘要:转自 :: http://blog.csdn.net/jason314/article/details/5640969 一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参 阅读全文
posted @ 2017-01-19 00:50 柳下_MBX 阅读(207) 评论(0) 推荐(0)
摘要:一:什么是大小端 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址 阅读全文
posted @ 2017-01-19 00:38 柳下_MBX 阅读(253) 评论(0) 推荐(0)
摘要:有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的 阅读全文
posted @ 2017-01-19 00:37 柳下_MBX 阅读(299) 评论(0) 推荐(0)
摘要:1. 什么是内存泄漏(memory leak)? 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 2. 两种类型的内存泄漏: 堆内存泄漏(Heap leak)。对内存 阅读全文
posted @ 2017-01-18 01:52 柳下_MBX 阅读(570) 评论(0) 推荐(0)
摘要:一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事 阅读全文
posted @ 2017-01-18 01:12 柳下_MBX 阅读(302) 评论(0) 推荐(0)
摘要:在virtual的知识里摸爬滚打好几天,最近大脑有些不够用了,现在整理一下 非考虑内存对齐时各个结构的大致模型 至于考绿内存的在前面几张已经叙述过了,为了方便,我再纸上画了整体的流程,, 内存分配要注意对齐参数=min(pack,最大字节的类型); 虚函数指针和虚函数表指针跨越的大小一定是对齐参数的 阅读全文
posted @ 2017-01-17 22:54 柳下_MBX 阅读(142) 评论(0) 推荐(0)
摘要:如果说没有虚函数的虚继承只是一个噩梦的话,那么这里就是真正的炼狱。这个C++中最复杂的继承层次在VS上的实现其实我没有完全理解,摸爬滚打了一番也算得出了微软的实现方法吧,至于一些刁钻的实现方式我也想不到什么理由来解释它,也只算是知其然不知其所以然吧。 虚、实基类都没有虚函数 这种情况也还算比较简单。 阅读全文
posted @ 2017-01-17 12:01 柳下_MBX 阅读(250) 评论(0) 推荐(0)
摘要:被一个virtual搞得脑袋疼了好几天,明天继续虚函数+虚继承混合,伤不起,伤不起 阅读全文
posted @ 2017-01-17 02:26 柳下_MBX 阅读(183) 评论(0) 推荐(0)
摘要:1.无继承的普通类: 在有虚函数的情况下类会为其增加一个隐藏的成员,虚函数表指针,指向一个虚函数表,虚函数表里面就是类的各个虚函数的地址了。那么,虚函数表指针是以什么模型加入到类里面的,虚函数表里面又是怎么安排的呢。简单来看下就可以知道了。 定义一个A的变量,然后看其内存布局: 最开始的 4个字节就 阅读全文
posted @ 2017-01-17 02:22 柳下_MBX 阅读(575) 评论(0) 推荐(0)
摘要:我们知道,虚继承的基类在类的层次结构中只可能出现一个实例。虚基类在类的层次结构中的位置是不能固定的,因为继承了虚基类的类可能会再次被其他类多继承。 比如class A: virtual T{} 这时T的位置如果相对于A是固定值的话,假设偏移是X,当再有个类 class B:virtual T{} ; 阅读全文
posted @ 2017-01-17 01:04 柳下_MBX 阅读(806) 评论(0) 推荐(1)
摘要:下面博客转载自别人的,我也是被这个问题坑了快两天了,关于各种虚基类,虚继承,虚函数以及数据成员等引发的一系列内存对齐的问题再次详细描述 先看下面这片代码。在这里我使用了一个空类K,不要被这个东西所迷惑,我使用这个空类的目的主要是为了让它产生虚基类表指针而又不引入虚基类成员变量,这样我就可以少叙述一些 阅读全文
posted @ 2017-01-15 20:26 柳下_MBX 阅读(408) 评论(0) 推荐(0)
摘要:转载自http://blog.csdn.net/chengonghao/article/details/51674166 例子举的特别好 很多文章大概都有像这样的结论: 1. 数据项只能存储在地址是数据项大小的整数倍的内存位置上; 2. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 3. 阅读全文
posted @ 2017-01-15 15:20 柳下_MBX 阅读(302) 评论(0) 推荐(0)
摘要:#pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。 规则: 1、数据成员对齐规则:结构(struct)(或联合 阅读全文
posted @ 2017-01-15 14:53 柳下_MBX 阅读(184) 评论(0) 推荐(0)
摘要:Data Member的绑定 在早期(2.0之前)C++的编译器上,将会指向global x object, 导致C++的两种防御性程序设计风格: 1、把所有的data members放在class 声明起头处,以确保正确的绑定 2、把所有的inline functions, 不管大小都放在clas 阅读全文
posted @ 2017-01-15 00:48 柳下_MBX 阅读(338) 评论(0) 推荐(0)
摘要:指针的类型 不同类型的指针,从内存需求的观点来说,没有什么不同!他们三个都需要足够的内存来繁殖一个机器地址,“指向不同类型之各指针”之间的差异,既不在其指针表示法不同,也不再其内容(代表一个地址)不同,而是在其所寻址出来的对象类型不同。也就是说,“指针类型”会导致编译器如何解释某个特定地址中的内存内 阅读全文
posted @ 2017-01-14 22:42 柳下_MBX 阅读(521) 评论(0) 推荐(0)
摘要:对于一个class object来说,我们需要多少内存才能表现出来,大致分为3类,这里在前面文章有内存图 (1)非静态数据成员的综合大小,这也符合了c++对象模型的结构 (2)填充字节,就是我们所说的,内存对齐 (3)若存在虚函数,则还会产生一个为了支持virtual的指针指向虚函数表 (这里也可以 阅读全文
posted @ 2017-01-14 02:34 柳下_MBX 阅读(223) 评论(0) 推荐(0)
摘要:reinterpret_cast reinterpret意为“重新解释” reinterpret_cast是C++中与C风格类型转换最接近的类型转换运算符。它让程序员能够将一种对象类型转换为另一种,不管它们是否相关。 reinterpret_cast用在任意指针(或引用)类型之间的转换;以及指针与足 阅读全文
posted @ 2017-01-14 02:12 柳下_MBX 阅读(544) 评论(0) 推荐(0)
摘要:类型转换是一种机制,让程序员能够暂时或永久性改变编译器对对象的解释。注意,这并不意味着程序员改变了对象本身,而只是改变了对对象的解释。 在很多情况下,类型转换是合理的需求,可解决重要的兼容问题。因此,程序员经常需要让编译器按其所需的方式解释数据,让应用程序能够成功编译并执行。 C++编译器仍需向后兼 阅读全文
posted @ 2017-01-14 01:48 柳下_MBX 阅读(237) 评论(0) 推荐(0)
摘要:一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址。这里编译器默认分配了一个字节(如:char,编译器相关),以便标记可能初始化的类实例,同时使空类占用的空间也最少(即1字节)。 对于结构体和空类大小是1这个问题,首先这是一个C++问题,在C语言下空结构体大小为0(当然这是编译器相关的 阅读全文
posted @ 2017-01-13 23:04 柳下_MBX 阅读(393) 评论(0) 推荐(0)
摘要:template<class Type> class不能为struct的原因是 template并不打算与c进行兼容 c++中处于同一个access section的数据成员在内存中的格局是按照声明顺序出现在内存中的,但是不同的access section就不一定了 c中的struct只是一个结构体 阅读全文
posted @ 2017-01-13 22:35 柳下_MBX 阅读(231) 评论(0) 推荐(0)
摘要:单一虚函数继承 class A{public: virtual int foo( ) { return val ; } virtual int funA( ) {}private: int val ; char bit1 ;} ; class B : public A{public: virtual 阅读全文
posted @ 2017-01-13 21:49 柳下_MBX 阅读(342) 评论(0) 推荐(0)
摘要:对一个结构体进行不断的封装后可以形成一个c++类,为此需要添加很多函数成员之类的代码,为此显示c++比c语言显得庞大并且迟缓,但是事实并不是这些 c++在布局和时间上的额外承担主要是由virtual引起的 下面简述c++对象模型 数据成员包括静态成员和非静态成员, 函数成员包括静态,非静态,虚函数 阅读全文
posted @ 2017-01-13 20:26 柳下_MBX 阅读(881) 评论(0) 推荐(0)
摘要:静态数据成员: 它被编译器提出于class之外,并被视为一个global变量(但只在class生命范围之内可见) 每个静态数据成员只有一个实体,存放在程序的数据段之中, 经由’.’运算符,对一个静态数据成员进行存取操作,只是语法上的一种便宜行事而已。静态数据成员其实并不在class object之中 阅读全文
posted @ 2017-01-10 11:13 柳下_MBX 阅读(275) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2017-01-09 22:39 柳下_MBX 阅读(172) 评论(1) 推荐(0)
摘要:在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者 用ls ‐ahl命令可以看到文件的所有者 也可以使用chow 阅读全文
posted @ 2017-01-05 23:55 柳下_MBX 阅读(225) 评论(0) 推荐(0)