摘要:
C++ 多线程知识1.多线程入门 CreateThread 201310211.介绍WinAPI中的CreateThread 函数原型: HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_STACK_ROUTLINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);参数介绍:第一个参数是指向SECURITY_ATTRIBUTES struc 阅读全文
摘要:
C++高级编程2. 静态动态链接库201310181.动态链接库和静态链接库的区别: 静态链接库就是把lib文件中用到的函数代码直接连接进目标程序,程序运行的时候不在需要其他的库文件;动态链接库是把调用的函数所在文件模块(对应的DLL)和调用函数在文件中的文职等信息链接进目标程序,程序运行的时候再从DLL中寻找相应的函数代码,因此需要响应DLL文件的支持。 静态链接库和动态链接库都是采用共享代码的方式,如果采用静态连接,无论我们愿不愿意,lib中的指令都全部被包含在最终生成的EXE文件中。但是如果我们使用动态链接库DLL的话,改DLL文件不包含在最终的EXE文件中,而是单独的一些文件,和EXE 阅读全文
摘要:
并发编程1. 基本概念131029前言: 这一个领域的学习,主要是C++的多线程编程,同时也会使用C#编程的知识,也就是并发编程,基于Windows编程知识,从系统的内核的底层同步原语,比如线程等等,还有就是.Net的高层同步抽象机制,如线程池、数据同步与控制同步,基本上包括了Windows各种层次的并发概念和机制。还有就是并发编程中的高级主题,比如内存模型与无锁编程、线程、用户图形界面、输入输出等等。 现在在多核的硬件基础之上,软件开发也需要使用并行编程机制。 能耗障碍+内存障碍+ILP障碍 = 限制了串行性能的障碍。 Windows 和.Net 框架对于多线程提供了丰富的支持。Window 阅读全文
摘要:
1.关于构造函数初始化调用顺序的问题。 首先是父类和子类的,首先调用父类的构造函数,然后调用子类的构造函数。但是对于子类中有其他类型的数据成员的时候,会在调用该类的构造函数之前,调用其数据成员的构造函数。class A{public: A(){ cout << "A::A()" << endl; } virtual ~A(){ cout << "A::~A()" <<endl; }};class C{public: C(){ cout << "C::C()" << 阅读全文
摘要:
C++高级编程1 C++速成1.常用的预处理指令 #include [file] #define key value 这个是在C中经常使用的,定义常量数值,用于字符串替换的工作。 #ifndef key #ifdef key #define key #endif #pragma once 会因为编译器而有所不同,如果编译器支持的话可以用于代替上面的指令,在预处理阶段会提示警告。 #ifndef KEY #define KEY //code #endif 可以使用#pragma once 代替。2.C++运行程序传递的参数 int main(int argc,char ** argv): 其中a 阅读全文
摘要:
C++ 函数的高级特性 20131002C++函数增加了重载(override), inline, const, virtual四种机制,重载和内联机制既可以用于全局函数,也可以用于类的成员函数。const和virtual机制只是可以用于成员函数。1.函数重载的概念 将功能和语义相似的几个函数使用同一个函数名字,便于记忆,同时类的构造函数确实需要使用到重载,但是C++的构造函数只能有一个名字,只能使用重载来实现。 虽然在语言层面上是相同的函数名称,但是在最终的二进制层面上是不允许出现同名函数的,因为所有的函数最终都将转换成一个等效的全局函数,调用语句也会作相应的转换。如何将他们区分开来:根据函 阅读全文
摘要:
C++ 虚析构函数 20131010 在C++中的虚函数作用是实现基于继承机制的多态,但是我们好像忽略了一种情况,就是虚析构函数。在C++继承机制中,虽然构造函数是不可以使用虚函数声明,但是析构函数是可以声明为虚函数的。这样做的目的是为了当父类指针指向一个派生类的对象的时候,当删除该指针的时候,可以调用派生类的析构函数,释放资源。如果不是这样的话,那么在C++中的派生类的内存空间是不会被释放掉,会造成内存的浪费,最终导致内存溢出而是程序崩溃。 但是我们不能够随意的使用虚函数声明,因为会增加类的存储空间,当我们声明一个函数式虚函数的时候,编译器会生成一个虚表中的函数指针,这样的话,如果 没有必要 阅读全文
摘要:
程序内存管理 20131006一个程序在运行期间的内存是如何的对编写程序至关重要,之前整理的C++内存管理的知识和Java程序内存管理的知识。今天我们系统的整理一下程序的内存。1.一个程序的内存有BSS segment, data segment, code segment, heap, stack. BSS Segment:通常是指用来存放程序中未初始化的全局的一块内存区域。BSS: Block Started by Symbol的简称,BSS内存分配是属于静态内存分配。 Data Segment: 通常知识的是存放程序中已经初始化的全局变量,数据段也是静态内存分配,存放初始化的全局变量和惊 阅读全文
摘要:
C++ 面向对象编程概述 20131001一些基本概念:封装、继承、组合、虚函数、抽象基类、动态绑定、多态性等等1.一个笑话:如果坐在后排聊天的同学能够像中间打牌的同学那样安静的话,那么就不会影响到前排睡觉的同学了。C++的封装机制控制信心的访问,C++中最根本的改变就是把函数放进结构体中,进而产生了C++的类。类可以把数据和函数绑定在一起,其中数据表示类的属性,函数表示类的行为,也就是成员函数。C++中提供public, protected, private 用于控制属性和函数的访问权限。2.类的继承特性 子类会继承父类中的所有成员变量和成员函数,只是根据权限,有些是无法访问的。同时继承可以 阅读全文
摘要:
C++ 类的虚表 20130929关键技术:封装、继承、组合、虚函数、抽象基类、动态绑定、多态性等等1.首先整理一下在阿里巴巴面试遇到的函数虚表的问题。 在C++中的Class中的函数式存储在Class数据机构的虚表中。每一个Class对应的所有的函数地址都会在Class的数据结构虚表中,每一个Class的对象在对象开始的地方都会有一个指针(计算机的位数一般是是32位)指向Class的函数虚表,函数虚表中每一个函数地址是按照在Class中声明的顺序。一般也是一个32bit的指针。 C++的多态机制正是基于这种虚标实现的。 首先看一个父类:classBase {public:virtualvoi 阅读全文