一道看似简单的面试题,却容易搞混淆。C/C++水真的很深。题目是让你实现一个Memcpy,我一开始以为是strcpy,后者比较容易实现,memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束,Memcpy的长度,必须你自己设定,strcpy的长度可以通过strlen()计算出来,所以memcpy需要第三个参数count.memcpy()的实现难点:1.指针类型的变换 2.要防止内存拷贝时的相互覆盖 1 void* memcpy(void* dest, Read More
posted @ 2012-09-08 00:03 桥边红药 Views(207) Comments(0) Diggs(0)
第一次接触CloudFoundry,虽然学校里面专业是分布式计算,但是平时除了做一些应用层的开发,在云计算这块还真没接触过,这两个星期充电看了一些这方面的资料,建立了基本的框架性概念,现在研究Cloud Foundry PaaS平台,粗略写一点自己的学习心得。 看一个系统首先从总的系统架构图上看,Cloud Foundry整体架构的核心是基于消息机制的组件互联,组件之间通讯依赖NATS,什么是NATS呢?Google了一下,资料不是很多,总的来说,NATS是一个分布式消息队列系统,用Ruby实现,基于EventMachine,那什么是EventMachine呢?InfoQ上面有这么一篇文... Read More
posted @ 2012-08-24 12:40 桥边红药 Views(1420) Comments(0) Diggs(0)
一直对Fork函数不知道怎么理解,今天稍微明白了一些。fork调用有2个返回值,在父进程中返回子进程的PID,在子进程中返回0。如果一个大程序在运行中,它的数据段和堆栈都很大,一次fork就要复制一次,那么fork的系统开销不是很大吗?其实UNIX自有其解决的办法,大家知道,一般CPU都是以"页"为单位来分配内存空间的,每一个页都是实际物理内存的一个映像,象INTEL的CPU,其一页在通常情况下是 4086字节大小,而无论是数据段还是堆栈段都是由许多"页"构成的,fork函数复制这两个段,只是"逻辑"上的,并非"物理&quo Read More
posted @ 2012-07-31 14:15 桥边红药 Views(196) Comments(0) Diggs(0)
当初微软实习生面试终面第四个,算法很简单。 首先对两个数组进行快排,然后从尾部开始合并两个数组。 void MergeArrays(int *a, int *b, int *c, int size_a, int size_b){ int p1 = size_a - 1; int p2 = size_b - 1; int p3 = size_a + size_b - 1; while( p1 >= 0 && p2 >= 0){ if(a[p1] < b[p2]) c[p3--] = b[p2--]; else c[p3--] = a[p1--]; } if( p Read More
posted @ 2012-06-24 18:27 桥边红药 Views(182) Comments(0) Diggs(0)
#ifndef MyList_H#define MyList_Htemplate<typename Object>class MyList{private: struct Node{ Object data; Node *prev; Node *next; Node(const Object &d = Object(), Node *p = NULL, Node *n = NULL): data(d),prev(p),next(n){} }; int theSize; Node *head; Node *ta... Read More
posted @ 2012-06-23 13:26 桥边红药 Views(269) Comments(0) Diggs(0)
#ifndef MyVector_H#define MyVector_Htemplate<typename Object>class MyVector{private: int theSize; int theCapacity; Object *objects;public: typedef Object *iterator; typedef const Object *const_iterator; enum {SPARE_CAPACITY = 16}; explicit MyVector( int init = 0 ): theSize(init),theCapacity(in Read More
posted @ 2012-06-22 23:37 桥边红药 Views(260) Comments(0) Diggs(0)
Windows中的资源管理器其实是一个Shell.在资源管理器里面双击执行一个App实际上是shell 调用CreateProcess 创建一个进程1.shell调用CreateProcess激活App.exe2.系统产生一个“进程核心对象”,计数值为1.3.系统为此进程建立一个4GB的地址空间。4.加载器将必要的代码加载到上述地址空间中,包括App.exe的程序,数据,已经所需要的动态连接库。这些动态连接库的信息被记录在可执行文件里面5.系统为此建立一个线程,主线程。6.系统调用C runtime函数库的Startup code.7.Startup code调用App.exe程序的WinMa Read More
posted @ 2012-06-14 02:14 桥边红药 Views(193) Comments(0) Diggs(0)
1.程序初始化过程中调用CreateWindow, 为程序建立了一个窗口,作为程序的屏幕舞台,CreateWindow产生窗口之后会送出WM_CREATE直接给窗口函数,后者可以在此时做一些初始化操作(例如配置内存,打开文件,读初始化数据.....)2.在程序活着的过程中,不断以GetMessage从消息队列中抓取消息,如果这个消息是WM_QUIT,GetMessage会返回0结束While循环,进而结束整个程序。3.DispatchMessage通过Windows USER模块的协助和监督,把消息派发至窗口函数。消息在该处被判别并处理。4.程序不断进行2.和3.的操作。5.当使用者按下菜单中 Read More
posted @ 2012-06-13 23:46 桥边红药 Views(168) Comments(0) Diggs(0)
MSDN中说:获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false。Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。结合在项目中遇到的一个例子: 1 public p. Read More
posted @ 2012-05-31 22:53 桥边红药 Views(620) Comments(0) Diggs(0)
vector<string> vec;stringstream ss(param);string s;while (ss >> s)vec.push_back(s); Read More
posted @ 2012-03-23 21:50 桥边红药 Views(161) Comments(0) Diggs(0)