Archive for ‘边走编程’ Category

November 18, 2011

  我们还知道,类的静态成员函数是不需要绑定到特定对象上面的,所以我们就可以将worker声明为静态成员。

1
2
3
4
5
6
7
8
9
10
11
class Thread
{
public:
    static void* worker(void* args) {
        //~ thread execution.
    }
private:
    //~ here some data member.
};
pthread_t tid;
pthread_create(&tid, NULL, &Thread::worker, NULL);

  我们又知道,静态成岩函数是不能’直接’访问类的非静态成员(包括函数),因此,上面代码中worker即使属于class Thread的类域,但却无法访问这个类的成员,这让人十分不爽。哪位大牛说过来着?任何一个复杂的计算机问题,都可以通过中间层来解决。这里也可以建立一个中间层:使用静态成员函数创建线程,给该函数传递某个对象的地址作为参数,在该静态函数中就可以通过所传递对象的使用它的任何成员了。

Tags: ,. 136 views
August 7, 2011

使用变参

  C/C++提供了函数的可变参数(variadic)机制,大部分人写的第一个C程序恐怕就是Hello World吧,使用的应该也是printf(“Hello, World\n”)。printf就是一个使用可变参数的典型,它的原型声明为,

int printf(const char *fmt, ...);

  其中返回值为实际输出字符个数,fmt为格式控制字符串,而”…”便声明了一个可变参数,你可以根据传递0个或多个参数给printf。printf内部会根据格式控制串中的格式指定符号(d, f, p等等)来逐个解析通过可变参数传进的实参变量。
  为解析可变参数,C语言提供了一个va_list类型和四个宏,分别是va_start, va_arg, va_end, 和va_copy,这些宏声明在stdarg.h中。

Tags: ,,. 268 views
May 25, 2011

  参加了三次百度公司的面试,遇到了些面试题,根据记忆,列到这里,如果你对某些题有想法,不妨回复讨论一下。

  1. 谈一下static关键词,C&C++:文件域,函数域,类域
  2. 说说volatile
  3. static成员(变量/函数,尤其是变量)需要注意哪些问题:static变量需在类外,通常为.cpp文件中显式声明,否则会有链接错误
  4. STL由哪些部件组成:容器,迭代器,算法,仿函数,各类适配器等等
  5. STL标准容器有哪些,特性是什么:vector,deque, list, map/multimap, set/multiset
  6. vector的插入操作过程中会发生什么:内存分配/重分配/释放,元素构造/析构……
  7. 谈谈对适配容器的理解:stack, queue, priority_queue,对标准容器的适配/封装
  8. 谈谈C++
  9. 进程间通讯有哪些方式:内存共享,socket(包括Unix Domain),消息
  10. 两相同行数文件,每行一列,使用awk按列合并之: awk ‘{t = $1; getline <"file2"; print t, $1}' file2
  11. 你该如何实现tail命令:lseek, read, write….
  12. 实现atoi:指针有效性,字符有效性,整数溢出,错误状态
  13. memcpy与memmove有何区别:overlap
  14. 列出你所知道的排序方法及其复杂度、稳定性和适用情形
  15. 非递归实现快速排序
  16. 快速排序的复杂度证明
  17. 非递归实现二叉树的后续遍历
  18. 判断单链表是否存在环,环从何开始:老题了
  19. 仅知道单链表中某非尾节点的地址,O(1)删除该节点:节点覆盖
  20. 某文件大小为10G,每行保存一个整数,内存不可完全容纳,排序之:分段排序,然后败者树归并
  21. 简单描述虚拟内存机制
  22. 简单描述Linux进程模型(即包含哪些段,作用是什么,有何特性)
  23. 软、硬链接有何区别
  24. 一个系统,维护id->value的信息,信息量巨大,需多台服务器存储。系统可支持信息的增、删、改、查询及批量查询,每日增删该约千万次,查询约10亿次。设计该系统
Tags: . 1,521 views
May 6, 2011

  关于虚函数,需要知道:

  • 多态在C++中借助虚函数实现
  • 多态只在指针或者引用上发生
  • 虚函数机制(通常)借助虚指针vptr支持
  • 虚函数地址保存在虚函数表中
  • 一个类的所有对象共有一张vtbl
  • vtbl由vptr指向,vptr保存在每一个对象中,多继承时可能有多个vptr
  • vptr由构造函数(普通构造/copy构造)在对象初始化时隐式设定
Tags: ,. 192 views
April 29, 2011

  递归是一种使用相同的方法,通过解决问题的子集以达到解决整个问题的方法,是一种使用有限代码解决“无限”计算的方法。在C/C++语言中递归表现在函数对自身的直接/间接的调用上,在实现上,递归依赖于语言的运行时调用堆栈,使用堆栈来保存每一次递归调用返回时所需要的条件。递归通常具有简洁的编码和清晰的思路,但这种简洁是有代价的。一方面,是函数调用的负担;另一方面,是堆栈占用的负担(堆栈的大小是有限的)。
  避免这种负担的方法就是将递归转化为迭代。迭代的思想主要在于,在同一栈帧中不断使用现有数据计算出新的数据,然后使用新的数据来替换原有数据。递归于迭代可以相互转化。将递归转化为迭代需要做两方面的工作:显式地维护一个堆栈,在递归算法中堆栈的维护由编译器隐式地完成;使用迭代控制结构,完成出栈、入栈和相关的计算。

Tags: ,,. 508 views
April 25, 2011

  reserve内部是怎么实现的呢?当然是new了。那么在reserve操作,也就是new之后,我们程序是否立即就占用了这些内存呢?这就要看我们这里说的“内存”是什么样的内存了。什么意思呢?我们知道,现代操作系统都采用了虚拟内存的机制,内存占用也就有了虚拟内存(virtual memory)和物理内存(physical memory)之分了。
  我们又知道,Unix/Linux进程的虚拟地址空间被按用途被划分成了内核空间和用户空间。内核空间供操作系统的内核使用,用户空间供用户程序支配。其中用户空间又被划分为若干段,主要包括:代码段(.text),用来存放/映射用户程序的代码;数据段(.data),存放初始化的全局数据或静态数据,这部分在文件系统中也占据磁盘空间;.bss段(一直没找到一个亲切的翻译),存放为初始化的全局或静态数据,在程序加载时分配空间和初始化,这部分空间不占用磁盘空间(当然在可执行文件中要保留其大小);堆栈段,用来保存程序执行时的上下文(局部变量、函数参数和返回地址等),在进程建立时由操作系统分配,空间较小且在运行时不可动态调整,增长方向因机器架构而异,IA上自高地址向下增长,堆栈不占用磁盘空间;堆,供用户在运行时动态地申请和使用,空间较大,未被申请的堆空间不可使用,也不会被映射到物理空间,堆随着用户程序申请向上增长,堆不占用磁盘空间。

Tags: ,,. 177 views
April 10, 2011

  关于C++ STL容器的默认内存管理,需参考allocator。
  关于deque的内存模型及其clear操作,我不甚了了,请参考您使用的标准库的代码。
  若想深入了解STL的实现,侯捷大叔的《STL源码剖析》是不错的入门资料,希望能够拜读。
  C++标准中并未对STL的实现细节做过多规定,因此不同实现的细节和表现可能不同。

  C++很复杂,但也并非无底黑洞。学好C++很难,但这种学习过程也会使你收获颇丰。
  学习任何一种技术,都需要热情、激情和足够的耐心。
  做好一件事,需要激情,同时激情常常来源于做好一件事情的满足感。
  满足感会增强人分享的欲望,分享的欲望也常常会使人具有亲和力和感染力,使人觉得你有激情,反过来更有利于人做好一件事。
  blabla, over~

Tags: ,. 855 views
April 9, 2011

  头文件中通常包含有:函数原型(声明)、宏定义、内联函数定义。
  头文件使用#include宏命令引入。有两种形式:#inlcude <header.h>和#include “header.h”. 两种形式的区别在于预处理器(preprocessor)查找头文件的方式的不同:对于前者,预处理器仅在系统预定义的标准路径中查找(标准查找路径由环境变量指明),比如/usr/include, /usr/local/include;对于后者,预处理器首先查找(源文件所在的)当前目录,若未找到,则到标准路径查找。另外,查找路径还可以通过编译器选项(-I for gcc)指定。通常,对于C/C++标准库和其他系统范围的程序库,使用<>形式,对于程序本身定义的头文件,采用”"形式。

Tags: ,. 126 views
October 22, 2010

  不多说,都在代码里了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int
main(int AC, char **AV)
{
    FILE *fd = fopen("data", "w+");
    fprintf(fd, "%x%c", 0x41, '1');
    fseek(fd, 0, SEEK_SET);
    int n;
    fscanf(fd, "%d", &n);
    fseek(fd, 0, SEEK_SET);
    char s[4];
    int c = fread(s, 1, sizeof(s), fd);
    s[c] = '\0';
    printf("%d, %s\n", n, s);
    fclose(fd);
    return 0;
}
Tags: . 202 views
October 18, 2010

  简单实现了常见的几种内部排序算法,包括冒泡(Bubble),插入(Insert),快速排序(Quick Sort),堆排序(Heap Sort),归并(Merge),希尔排序(Shell Sort),并对这些算法的耗时在伪随机数上进行了简单的测试。
  说明:

  • 没有实现计数、基数排序等线性复杂度的算法;
  • 各算法只是对算法思想的一次简单模拟,没有过多的优化;
  • 各排序主程序接口参数均为整型数组及元素个数;
  • 程序计时使用了glibc的gettimeofday(),因此。。。;
  • 归并排序中,每次调用都申请和释放堆空间,因此比较耗时。可以采用原地归并、使用全局/静态的方法加以优化;
  • 快速排序中,对待排子序列的长度进行的了判断,对短序列进行优先排序可以减小函数的递归深度(而不是次数);
  • 希尔排序中,为了简洁,步长因子统一取做2.2(11/5)。
Tags: ,. 1,102 views
Page 1 of 1612345678910...Last »