
C++对象模型
文章平均质量分 80
anzhsoft
程序猿一枚毕业于南开工作于上海。喜欢读书,喜欢跑步,激情似火,心静如水。喜欢编程,喜欢寻根问底各种技术,在各种新技术中汲取营养。喜欢分享,因此以一些高质量的博文来回报各位可爱可敬的程序猿们
展开
-
Linux 共享内存 详解
一、什么是共享内存区共享内存区是最快的可用IPC形式。它允许多个不相关的进程去访问同一部分逻辑内存。如果需要在两个运行中的进程之间传输数据,共享内存将是一种效率极高的解决方案。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间数据的传输就不再涉及内核。这样就可以减少系统调用时间,提高程序效率。共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址空间中。其他进程可原创 2014-01-13 14:27:48 · 12594 阅读 · 0 评论 -
C++对象模型(四):class成员初始化列表(Member Initialization List)
本文是Inside C++ Object Model Chapter 2 部分的读书笔记。编译器如何处理初始化成员列表的。下列情况中,必须要使用member initialization list进行data member 的初始化:1) 当初始化一个reference member。2) 当初始化一个const member。3) 当调用一个base class 的con原创 2013-12-09 20:10:17 · 10778 阅读 · 2 评论 -
C++对象模型(三):Program Transformation Semantics (程序转换语义学)
本文是Inside The C++ Object Model Chapter 2 部分的读书笔记。是讨论编译器调用拷贝构造函数时的策略(如何优化以提高效率),侯捷称之为"程序转化的语义学"或者说是是关于编译器对于程序是如何进行有效转化或者说翻译,以实现C++的语法机制。主要来说有以下几种Semantics:1) 明确的初始化操作(Explicit Initialization)比如定义原创 2013-12-09 19:15:55 · 13096 阅读 · 2 评论 -
C++对象模型(二):The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为)
本文是 Inside The C++ Object Model's Chapter 2 的部分读书笔记。有三种情况,需要拷贝构造函数:1)object直接为另外一个object的初始值2)object作为函数以值传递的参数3) object以函数返回值形式返回如果class没有提供一个explicit copy constructor时,编译器会以default me原创 2013-12-08 21:50:07 · 13199 阅读 · 2 评论 -
C++对象模型(一):The Semantics of Constructors The Default Constructor (默认构造函数什么时候会被创建出来)
本文是 Inside The C++ Object Model, Chapter 2的部分读书笔记。C++ Annotated Reference Manual中明确告诉我们: default constructor会在需要的时候被编译器产生出来。注意,这里是编译器需要,而不是程序需要。后来的C++ Standard 95修改了这种说法,但是实质上仍是相同的: For class X, if原创 2013-12-08 10:24:30 · 13510 阅读 · 6 评论 -
Linux Debugging(五): coredump 分析入门
作为工作几年的老程序猿,肯定会遇到coredump,log severity设置的比较高,导致可用的log无法分析问题所在。 更悲剧的是,这个问题不好复现!所以现在你手头唯一的线索就是这个程序的尸体:coredump。你不得不通过它,来寻找问题根源。本文通过一个常见的coredump,逐步讲解如何发现导致coredump的原因原创 2014-01-27 17:33:00 · 31080 阅读 · 0 评论 -
Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)
关于C++虚函数,很多博文从各个角度来探究虚函数是如何实现的,或者说编译器是如何实现虚函数的。本文通过GDB来从另外一个角度来理解C++ object的内存布局,一来熟悉语言背后编译器为了实现语言特性为我们做了什么;二来熟悉使用GDB来调试程序。 同时,本文也将对如何更好的理解C++语言提供了一个方法:使用GDB,可以很直观的理解编译器的实现,从根本上掌握C++!我们不单单只会开车,还应该知道车的内部的构造。原创 2014-01-27 13:53:27 · 25820 阅读 · 1 评论 -
Linux Debugging(三): C++函数调用的参数传递方法总结(通过gdb+反汇编)
上一篇文章《Linux Debugging:使用反汇编理解C++程序函数调用栈》没想到能得到那么多人的喜爱,因为那篇文章是以32位的C++普通函数(非类成员函数)为例子写的,因此只是一个特殊的例子。本文将函数调用时的参数传递方法进行一下总结。总结将为C++普通函数、类成员函数;32位和64位进行总结。 本文对分析栈溢出导致的coredump十分有益。原创 2014-01-25 16:46:38 · 20593 阅读 · 5 评论 -
Linux Debugging(一): 使用反汇编理解C++程序函数调用栈
拿到CoreDump后,如果看到的地址都是????,那么基本上可以确定,程序的栈被破坏掉了。GDB也是使用函数的调用栈去还原“事故现场”的。因此理解函数调用栈,是使用GDB进行现场调试或者事后调试的基础,如果不理解调用栈,基本上也从GDB得不到什么有用的信息。本文还可以帮助你深入理解C++函数的局部变量。我们学习时知道局部变量是是存储到栈里的,内存管理对程序员是透明的。通过本文,你将明白这些结论是如何得出的。原创 2014-01-24 17:23:50 · 32584 阅读 · 8 评论 -
C++ 仿函数/函数指针/闭包lambda
在上一篇文章中介绍了C++11新引入的lambda表达式(C++支持闭包的实现),现在我们看一下lambda的出现对于我们变成习惯的影响,毕竟,C++11历经10年磨砺,出140新feature,对于我们的programming idiom有深远影响。1) 仿函数wikipedia 的定义:A function object, also called a funct原创 2013-12-21 17:59:17 · 16988 阅读 · 2 评论 -
C++闭包: Lambda Functions in C++11
表达式无疑是C++11最激动人心的特性之一!它会使你编写的代码变得更优雅、更快速! 它实现了C++11对于支持闭包的支持。首先我们先看一下什么叫做闭包维基百科上,对于闭包的解释是:In programming languages, a closure (also lexical closure orfunction closure) is a functio原创 2013-12-20 17:29:06 · 24330 阅读 · 6 评论 -
QT Mobile: 一统IOS/Andriod/WP/等移动平台的江湖
QT5.2原生态支持IOS、Andriod。以后还会支持Windows Phone。多个平台,一套代码,真正做到跨平台。移动开发者的福音来了!!!原创 2014-01-17 14:38:24 · 10799 阅读 · 2 评论 -
C++11:使用 auto/decltype/result_of使代码可读易维护
C++11 终于加入了自动类型推导。以前,我们不得不使用Boost的相关组件来实现,现在,我们可以使用“原生态”的自动类型推导了!C++引入自动的类型推导,并不是在向动态语言(强类型语言又称静态类型语言,是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如C/C++/Java;弱类型语言又称动态类型语言,是指不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译原创 2013-12-23 18:04:35 · 18469 阅读 · 1 评论 -
海量数据:判断一棵树是否为另一棵树的子树
T1是一棵含有几百万个节点的树,T2含有几百个节点。判断T2是否是T1 的子树。首先考虑小数据量的情况,可以根据树的前序和中序遍历所得的字符串,来通过判断T2生成的字符串是否是T1字符串的子串,来判断T2是否是T1的子树。假设T1的节点数为N,T2的节点数为M。遍历两棵树算法时间复杂性是O(N + M), 判断字符串是否为另一个字符串的子串的复杂性也是O( N + M)(比如使用KMP算法)。原创 2013-12-28 19:35:11 · 17076 阅读 · 2 评论 -
检查一个二叉树是否平衡的算法分析与C++实现
今天面试一个实习生,就想既然是未出校园,那就出一个比较基础的题吧,没想到答的并不如人意,对于树的操作完全不熟悉,因此此题算是未作答。原来我想看一下他分析问题的思路,优化代码的能力。接下来会把最近半年我出的面试题整理出来,以来share给其它同事,而来算是自己校园记忆的一个总结,毕竟自己在项目中已经很久未用到这些知识。其实很多题目都是来源于CareerCup.com。这上面汇集了许多IT名企的面试笔原创 2013-12-28 14:50:11 · 13250 阅读 · 2 评论 -
Cracking the Coding Interview:: 寻找有环链表的环路起始节点
给定一个有环链表,实现一个算法返回环路的开头节点。 这个问题是由经典面试题-检测链表是否存在环路演变而来。原创 2013-12-25 13:07:15 · 13548 阅读 · 3 评论 -
Linux C 下的大文件操作
这里说的大文件指大小超过2G的文件。小于2G的文件,用基础篇和高级篇中的函数都可以打开、读写。大文件的打开:在32位环境下,linux默认打开、读、写超过2G的文件会返回错误。定义如下宏可以突破这个限制,对read/write和fread/fwrite同时有效。注意它必须定义在所有头文件之前。#ifndef _FILE_OFFSET_BITS#define _FIL原创 2014-01-13 16:23:44 · 12722 阅读 · 1 评论 -
C++对象模型(五):The Semantics of Data Data语义学
本文是《Inside the C++ Object Model》第三章的读书笔记。主要讨论C++ data member的内存布局。这里的data member 包含了class有虚函数时的vptr和vtable的布局情况。原创 2014-01-26 21:29:38 · 9249 阅读 · 2 评论