• Android图形系统之Activity构成原理

    Android_View

    Activity是Android图形系统中非常重要的组成部分。图形系统客户端——Android应用程序的多数功能都是通过Activity实现的。上图展示了Activity类的构成,Activity主要由Window(phoneWindow的抽象基类)和WindowManager两部分构成。Window主要负责Activity的窗口视图,而WindowManager则主要负责与WmS交互。

    在这篇博客中,我不打算详细深入窗口视图的实现或者WmS的细节,而是比较宏观的梳理一下Activity的脉络。

    DecorView

    DecorView是Activity的根视图,从上图可以看出DecorView继承与ViewGroup。而ViewGroup的结构是大家都比较熟悉的,如下图所示。这… 【查看更多】

  • 多线程程序之线程私有数据

    在C/C++的多线程程序中,所有的线程共享相同的地址空间。所以数据段和进程堆的数据,都可以被所有线程读写。在极端情况下,线程的栈空间也可以被共享。只有线程的寄存器上下文算是真正私有的。对于某些变量,我们希望它在不同的线程中具有不同的值,这就是线程私有数据的用途。

    对于普通的全局变量,或者通过指针或引用实现的共享,其实在内存中只存在一个备份。而进程私有数据则相当于一种Map型的变量,根据线程的id,线程私有变量对应于不同的值。

    /*
     * tsd_once.c
     *
     * Demonstrate use of pthread_once to initialize something
     * exactly once within a multithreaded program.
     *
     * Note that it is often easier to use a statically initialized
     * mutex to accomplish
    【查看更多】
  • 解析Google Analytics机制

    前几天准备在这个博客上装一个Google Analytics插件,虽然我知道这里其实没有人访问的(人艰不拆)。然后我就非常好奇GA的原理,因为WebSocket才出来没多久,以前的异步信息到底是怎么传递的呢?按照我一贯的小猫钓鱼风格,我决定来一探究竟。
    首先还是去找了Google Urchin的代码看,对Javascript的语法不太习惯,看得有点云里雾里。不过还是看出来一点端倪,就是Image。简单来说,在客户端JavaScript中new一个Image对象,然后指定它的src属性,可以引起浏览器对图片的动态加载。聪明的工程师们就是利用了这样一个特性(URL中包含的信息)最终实现的客户端信息的动态传递。听起来也是挺简单的,何不尝试做一个demo呢?
    前面学过一点三脚猫水平的node.js,这里就选… 【查看更多】

  • C++智能指针

    今天复习了一下智能指针,然后动了动脑子,恍然觉得以前并没有真正的理解智能指针。首先是shared_ptr,shared_ptr的作用就不做介绍了。那么shared_ptr是如何实现的呢?我分析了一下,智能指针的要点就是“计数”和“指针”。所以智能指针的成员变量中就必须有计数值和对象指针。

    指针计数为零的时候自动销毁,所以析构函数中需要实现计数和对象销毁的功能。然后还要注意的就是复制构造函数和复制函数(operator=)。想起来觉得也不难实现,于是就动手写了个丑陋版shared_ptr。

    #include <iostream>
    
    namespace toy{
    template<class T>
    class shared_pointer{
    
    public:
        template<class Y> explicit shared_pointer(Y* p) {
            px = p;
    【查看更多】
  • 谈谈闭包

    我第一次听说“闭包”这个概念是在学习Lua的时候。由于此前并没有接触到函数式编程的语言,所以满脑子C/C++的思维方式的我被“闭包”困惑了很久。我找到了一个比较通俗的闭包定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。Lua的学习资料上一般都会有一个这样关于闭包的例子:

    function new_counter()  
        local n = 0 
        local function counter()        
            n = n + 1       
            return n    
        end 
        return counter
    end 
    
    c1 = new_counter()
    c2 = new_counter()
    print(c1())  //打印1 
    print(c2())  //打印2
    

    首先,new_counter()是一个返回函数的函数;然后这个被返回的counter函数会更改其外部函数(new_counter)的局部变量,并返回计数值。注… 【查看更多】

  • 多核程序设计——存储模型

    最近在看《现代体系结构上的UNIX系统——内核程序员的SMP和Caching技术》,这里抄点东西作为笔记吧!
    顺序存储模型强制存储器操作(load和store)都按照程序次序来执行,即这些指令是按照在随程序执行的指令流中出现的顺序次序来执行的。它也指定了,由不同处理器完成的load和store操作也要以某种顺序、但又是非确定性的方式排序。这种存储模型应该是大家最容易理解的,甚至都认为实际MP也是这样工作的。但是,这种存储结构是非常落后的,现代处理器应该已经淘汰了这种结构。
    书中讲到了一个例子,如下;

            处理器一           处理器二
            store %r1, A        store %r1, B
            load %r2, B        load %r2, A
    

    在强定序(strong order)的系统中,一共有四种可能的存储排序。但是可以肯定的是最后一条指令一定是load指令,也就是说至少有一条load指令会读… 【查看更多】

  • C++RTTI小总结

            RTTI算是C++的一大特性之一了,但也是一个不太好懂的特性。以前一直没有理解清楚RTTI。通过最近的学习,似乎掌握了一点皮毛,这里做一个小总结。首先是《C++编程思想》上的一个例子,由于缺头文件,我把容器改成了vector。

    #include <iostream>  
    #include <time.h>  
    #include <typeinfo.h>  
    #include <vector>  
    #include <stdlib.h>  //for srand() and rand()  
    using namespace std;  
      
    class shape {  
    protected:  
        static int count;  
    public:  
        shape() { count++; }  
        virtual ~shape()
    【查看更多】
  • C++静态成员变量

    今天在弄一段代码的时候遇到了静态成员变量的问题。卡了一段时间后,果断翻出《深入探索C++对象模型》,大概明白了问题所在。这事给我的一点启示就是“纸上得来终觉浅,绝知此事要躬行”。首先看看问题吧!其实就是一个类型的定义。代码如下:

    //myApplication.cpp  
    #include "myapplication.h"  
    #include <iostream>  
    using std::cout;  
    using std::endl;  
      
    myApplication::myApplication(string _appName):appName(_appName)  
    {  
        if(self!=0)  
            return;  
        else  
            self=this;  
    }  
    void myApplication::printAppname()  
    {  
        cout<<appName<<endl;  
    }  
    myApplication*
    【查看更多】
  • %%TITLE%%

    %%CONTENT%%… 【查看更多】