• C/C++用匿名数据结构实现时间和空间名利双收


    程序的时间和空间,往往是一对矛盾,比如计算CRC32的时候会用到余式表

    DWORD *crcTable;    // DWORD[256];


    余式表可以用某种规则计算生成,为缩短文章长度就不写出来了,总之要做一堆数据处理,消耗时间

    有时候为了提升程序时间,我们直接在内存中声明一个计算好的余式表

    DWORD crcTable[256] = {0x00000000L, 0x77073096L, 0xee0e612cL, ...}


    这就是所谓的牺牲空间来换取时间,比如你一秒钟要计算10000次之类的,当然聪明的程序员会使用某种机制来处理这种冲突

    比如记录是否已经生成:

    inline int CreateTable(unsigned long dwPoly)
    {
    	// ...
    	return 1;
    }
    
    if(!bCreated)
    {
    	bCreate = CreateTable(0x77073096L);
    	// ...
    }
    // calc crc


    然而,并不是所有的情况都那么好处理,而且更多的情况是很难这样处理,比如我们有一个结构,保存客户信息

    struct stClient{
    	DWORD Id;
    	LPSTR Name;
    	FLOAT Cash;
    	// 1000 members here ... Oh no!
    	DWORD the1003stMember;
    };


    因为录入的时候,各个数据是分散的,如果我们用一个函数来设置这个这个结构

    void SetClient(DWORD Id, LPSTR Name, FLOAT Cash, ...)	// 1001 arguments .. Oh shit!!
    {
    	// ...
    }


    很明显,大家都不是这种人,1000多个参数开什么玩笑,那么就一个个设置吧

    void SetClientId(DWORD Id)
    {
    	// ...
    }
    void SetClientXXX(DWORD xxx)
    {
    	// ...
    }
    // 1002 functions ... Oh damn!!!


    很明显,大家也不是这种人,1000多个函数,开什么国际玩笑,那么怎么办,有了,用了大比大,全好了

    void SetClients(DWORD memId, DWORD dwArg, LPSTR strArg, FLOAT fArg)
    {
    	switch(memId){
    	case 0:
    		ID = dwArg;
    		break;
    	case 1:
    		Name = strArg;
    		break;
    	//case xxx:	1001 cases ... Oh shit!!!!
    	}
    }


    可是存在一个问题,虽然录入程序只需处理一个函数(接口),但是case太多,时间和空间的消耗都很大,难道我们就这样任命了吗?

    当年我决定用C/C++的原因之一是因为她的灵活性,可以做正妻,也可以做小妾,还可以做情人...

    没必要为了家庭娶个正妻,为了忍受正妻,取个小妾,为了制约小妾,养个情人,所以..

    typedef class CObj{	// class struct union bingo!
    	public:
    	DWORD Flags;
    	union{
    		DWORD dw[1000];
    		struct{
    			DWORD ID;
    			FLOAT POINT;
    			// any members ... yeah!
    		};	// no struct fucking name
    	};	// no union fucking name
    	CObj();
    	~CObj();
    } OBJ;
    
    CObj::CObj()
    {
    	memset(this->dw, 0, sizeof(DWORD) * 1000);
    }


    直接使用这些匿名结构的成员,当然了,不要重复,正妻就用正妻的名字,要叫夫人,情人就要换个名字,虽然是同一个人

    	OBJ *o = new CObj;
    	o->dw[0] = 1;
    	o->POINT = 100.f;
    	printf("p-> %d, %d, %d.
    ", o->ID, o->dw[1], o->dw[2]);
    


    输出:

    p-> 1, 1120403456, -842150451.


    妙啊!妙啊!这是有屎以来最妙的数据结构了,让我大吃一斤啊!

    当然了,我不是教大家取小妾,养情人,而是另外的,你懂的.现在正妻不会和小妾争风吃醋,也不会和情人砍起来,时间和空间名利双收啊,

    皇上,您还记得西湖河畔的夏雨荷吗?

  • 相关阅读:
    【计算机视觉】行人检测(Pedestrian Detection)资源
    【计算机视觉】图像处理与计算机视觉基础,经典以及最近发展
    【计算机视觉】图像处理与计算机视觉基础,经典以及最近发展
    【计算机视觉】期刊整理
    【计算机视觉】期刊整理
    【计算机视觉】TPAMI的Editors
    【计算机视觉】TPAMI的Editors
    匈牙利命名法收藏
    匈牙利命名法收藏
    【计算机视觉】计算机视觉/图像/模式识别方向期刊会议
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3215023.html
Copyright © 2020-2023  润新知