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

 

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

分类: 计算机技术 Visual C++   272人阅读  评论(0)  收藏  举报

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

[cpp]  view plain copy
  1. DWORD *crcTable;    // DWORD[256];  


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

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

 

[cpp]  view plain copy
  1. DWORD crcTable[256] = {0x00000000L, 0x77073096L, 0xee0e612cL, ...}  


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

比如记录是否已经生成:

[cpp]  view plain copy
  1. inline int CreateTable(unsigned long dwPoly)  
  2. {  
  3.     // ...  
  4.     return 1;  
  5. }  
  6.   
  7. if(!bCreated)  
  8. {  
  9.     bCreate = CreateTable(0x77073096L);  
  10.     // ...  
  11. }  
  12. // calc crc  


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

[cpp]  view plain copy
  1. struct stClient{  
  2.     DWORD Id;  
  3.     LPSTR Name;  
  4.     FLOAT Cash;  
  5.     // 1000 members here ... Oh no!  
  6.     DWORD the1003stMember;  
  7. };  


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

[cpp]  view plain copy
  1. void SetClient(DWORD Id, LPSTR Name, FLOAT Cash, ...)   // 1001 arguments .. Oh shit!!  
  2. {  
  3.     // ...  
  4. }  


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

[cpp]  view plain copy
  1. void SetClientId(DWORD Id)  
  2. {  
  3.     // ...  
  4. }  
  5. void SetClientXXX(DWORD xxx)  
  6. {  
  7.     // ...  
  8. }  
  9. // 1002 functions ... Oh damn!!!  


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

[cpp]  view plain copy
  1. void SetClients(DWORD memId, DWORD dwArg, LPSTR strArg, FLOAT fArg)  
  2. {  
  3.     switch(memId){  
  4.     case 0:  
  5.         ID = dwArg;  
  6.         break;  
  7.     case 1:  
  8.         Name = strArg;  
  9.         break;  
  10.     //case xxx: 1001 cases ... Oh shit!!!!  
  11.     }  
  12. }  


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

 

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

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

[cpp]  view plain copy
  1. typedef class CObj{ // class struct union bingo!  
  2.     public:  
  3.     DWORD Flags;  
  4.     union{  
  5.         DWORD dw[1000];  
  6.         struct{  
  7.             DWORD ID;  
  8.             FLOAT POINT;  
  9.             // any members ... yeah!  
  10.         };  // no struct fucking name  
  11.     };  // no union fucking name  
  12.     CObj();  
  13.     ~CObj();  
  14. } OBJ;  
  15.   
  16. CObj::CObj()  
  17. {  
  18.     memset(this->dw, 0, sizeof(DWORD) * 1000);  
  19. }  


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

[cpp]  view plain copy
  1. OBJ *o = new CObj;  
  2. o->dw[0] = 1;  
  3. o->POINT = 100.f;  
  4. printf("p-> %d, %d, %d.\n", o->ID, o->dw[1], o->dw[2]);  


输出:

[plain]  view plain copy
  1. p-> 1, 1120403456, -842150451.  


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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值