摘要: 下面是我摘录的网上的解释:有如下的两个结构体:struct A struct B { {int a; int a;unsigned __int64 b; short c; short c; unsigned __int64 b;}; }; 那么 sizeof(A) 和 sizeof(B) 一样吗?让我在编译器里试一下,啊 ? 怎么不一样?两个结构体明明相同,只是第二和第三个成员变量的位置颠倒了结果却大相径庭。到底是因为什么呢?答案是编译器的数据对齐方式在作怪。以 vc6.0 为例,默认情况下的对其方式是 8 位。所以 struct A 的大小为 24 , struct B 的大小为 16, 下 阅读全文
posted @ 2012-10-18 21:47 SA高处不胜寒 阅读(1516) 评论(0) 推荐(0) 编辑
摘要: file1.c其中变量及函数声明时需要extern 但是在定义时不能添加,如下所示,file1.c:其中若file1.c中取消注释,则编译通过,因为对于static它是仅局限于静态链接的,只在本文件内使用,而外部文件不能使用。 阅读全文
posted @ 2012-10-17 23:11 SA高处不胜寒 阅读(184) 评论(0) 推荐(0) 编辑
摘要: #include <iostream>using namespace std;char* strcatcp(char *des, char *source1, char *source2){ char *p = des; while ((*des++=*source1++)!='\0'); des--; while ((*des++=*source2++)!='\0'); return p;} int main(void){ char *des, *source1, *source2; des = (char *)malloc(sizeof(sour 阅读全文
posted @ 2012-10-17 09:58 SA高处不胜寒 阅读(632) 评论(0) 推荐(0) 编辑
摘要: 自旋锁 自旋锁是专为防止多处理器并发而引入的一种锁,它应用于中断处理等部分。对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁。 自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的内核任务便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。 事实上,自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可... 阅读全文
posted @ 2012-10-16 15:59 SA高处不胜寒 阅读(321) 评论(0) 推荐(0) 编辑
摘要: C++2.0以后全面支持虚函数与虚继承,这两个特性的引入为C++增强了不少功能,也引入了不少烦恼。虚函数与虚继承有哪些特性,今天就不记录 了,如果能搞了解一下编译器是如何实现虚函数和虚继承,它们在类的内存空间中又是如何布局的,却可以对C++的了解深入不少。这段时间花了一些时间了解这 些玩意,搞得偶都,不过总算有些收获,嘿嘿。先看一段代码class A{ virtual aa(){};};class B : public virtual A{ char j[3]; //加入一个变量是为了看清楚class中的vfptr放在什么位置 public: virtual bb(){};};class C 阅读全文
posted @ 2012-10-16 09:51 SA高处不胜寒 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 在一个进程里,线程的调度有抢占式或者非抢占的模式。在抢占模式下,操作系统负责分配CPU时间给各个进程,一旦当前的进程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。因此操作系统将定期的中断当前正在执行的线程,将CPU分配给在等待队列的下一个线程。所以任何一个线程都不能独占CPU。每个线程占用CPU的时间取决于进程和操作系统。进程分配给每个线程的时间很短,以至于我们感觉所有的线程是同时执行的。实际上,系统运行每个进程的时间有2毫秒,然后调度其他的线程。它同时他维持着所有的线程和循环,分配很少量的CPU时间给线程。线程的的切换和调度是如此之快,以至于感觉是所有的线程 阅读全文
posted @ 2012-10-13 09:53 SA高处不胜寒 阅读(8545) 评论(0) 推荐(1) 编辑
摘要: 1 #include "head.h" 2 3 struct node 4 { 5 int data; 6 char ch; 7 }; 8 9 void *func(void *arg) 10 { 11 struct node *mynode2; 12 13 mynode2 = (struct node *)(arg); 14 mynode2->data = 1; 15 mynode2->ch = 'c'; 16 17 return mynode2; 18 } 19 20 int main() 21 { 22... 阅读全文
posted @ 2012-10-11 09:58 SA高处不胜寒 阅读(659) 评论(0) 推荐(0) 编辑
摘要: MSDN里讲的一头雾水,给的例子也看不出区别!又是一个文档跟实现不一致的地方,虽然我还没找到能看出区别的例子,暂 且还是按照这两个函数最初的实现来理解吧,网上随便搜了几篇文章,总结他们的不同在于: memcpy是把source 指向的对象中的n个字符拷贝到destin所指向的对象中,返回指向结果对象的指针。 memmove也是把source 指向的对象中的n个字符拷贝到destin所指向的对象中,但过程就好象是先把source所指向的 对象拷贝到临时数组中,然后在从临时数组拷贝到destin所指的对象中,返回指向结果对象的指针。 但要注意,除memmove之外的字符串操作函数在拷贝同一... 阅读全文
posted @ 2012-10-10 20:30 SA高处不胜寒 阅读(426) 评论(0) 推荐(0) 编辑
摘要: #include <iostream>#include <string.h>using namespace std;#define Maxsize 100void cover(char ch[], char substr[], int index){ int size = strlen(ch); int sub_size = strlen(substr); int result = 0, j = 0; if((index+sub_size)>=size) ch[index] = '\0'; else { for(int i=index+sub_si 阅读全文
posted @ 2012-09-23 12:33 SA高处不胜寒 阅读(494) 评论(0) 推荐(0) 编辑
摘要: #include <iostream>using namespace std;void fun8(int x){ if(x<8) { cout<<x; } else { fun8(x/8); cout<<x%8; }}int main(void){ char ch[10]; int result = 0; cin>>ch; for(int i=0;ch[i]!='\0';i++) { if(ch[i]>='0' && ch[i]<='9') result = res 阅读全文
posted @ 2012-09-22 19:15 SA高处不胜寒 阅读(399) 评论(0) 推荐(0) 编辑