程序的时间和空间,往往是一对矛盾,比如计算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.\n", o->ID, o->dw[1], o->dw[2]);

输出:

p-> 1, 1120403456, -842150451.

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

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

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

C/C++用匿名数据结构实现时间和空间名利双收的更多相关文章

  1. 【月光宝盒get√】用时间置换空间,聊聊稀疏数组的那些事儿

    背景 数据结构是指带有结构特性的数据元素的集合.在数据结构中,数据之间通过一定的组织结构关联在一起,便于计算机存储和使用.从大类划分,数据结构可以分为线性结构和非线性结构,适用于不同的应用场景. 线性 ...

  2. 测试Protobuffer的定义格式对其时间和空间的影响

    测试Protobuffer格式的A命令转换为std::string的的字节个数,分别测试了工程中用到的几种命令: a)AddLayer:108 b)AddSource:209 c)MoveLayer: ...

  3. java性能时间与空间消耗

    Java性能时间与空间消耗 一.减少时间消耗 标准代码优化 (1) 将循环不变量的计算移出循环 例如:for (int i=0; i<size()*2; i++) { ... } ------& ...

  4. protobuf中会严重影响时间和空间损耗的地方

    http://blog.chinaunix.net/uid-26922071-id-3723751.html 当前项目中普遍用到GOOGLE 的一个开源大作PROTOBUF,把它作为网络应用层面的传输 ...

  5. 88、展示Tensorflow计算图上每个节点的基本信息以及运行时消耗的时间和空间

    ''' Created on May 24, 2017 @author: p0079482 ''' #使用程序输出日志 import tensorflow as tf with tf.Session( ...

  6. HashSet扩容机制在时间和空间上的浪费,远大于你的想象

    一:背景 1. 讲故事 自从这个纯内存项目进了大客户之后,搞得我现在对内存和CPU特别敏感,跑一点数据内存几个G的上下,特别没有安全感,总想用windbg抓几个dump看看到底是哪一块导致的,是我的代 ...

  7. c++ 各种数据结构的时间空间复杂度

    普通线段树    时间 log2(n); 空间 n+log2(n)+log4(n)+log(8)n+.....+logn(n)==n*4; 动态开点线段树 时间 log2(n); 空间 q*log2( ...

  8. NOIP模拟赛-时间与空间之旅

    题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship船长也成了最热门的职业之一.当然,要成为一名出色的船 ...

  9. 【GDOI】【图论-最短路】时间与空间之旅

    最近打的一场校内训练的某题原题... 题目如下: Description 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spa ...

随机推荐

  1. MVC4 学习笔记01

    1 . ASP.NET MVC 中 ActionResult 和 ViewResult 在使用上的区别是什么?要注意什么吗? ActionResult 是一个抽象(abstract)类,ViewRes ...

  2. Windows服务之启动、停止、暂停、继续

    原文:Windows服务之启动.停止.暂停.继续 Windows服务之启动.停止.暂停.继续 2011-11-09 15:07:37     我来说两句 收藏    我要投稿    [字体:小 大] ...

  3. ASP.NET 5是如何通过XRE实现跨平台的

    挡不住的好奇心:ASP.NET 5是如何通过XRE实现跨平台的   .NET程序员也有自己的幸福,.NET的跨平台是一种幸福,.NET的开源也是一种幸福,而更幸福的是可以通过开源的.NET了解.NET ...

  4. AngulaJS实战

    AngulaJS实战总结, 带你进入AngularJS世界(待续)   使用AngularJS  进行Hybrid App 开发已经有一年多时间了,这里做一个总结. 一.AngularJS 初始化加载 ...

  5. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  6. 快速构建Windows 8风格应用3-打包发布应用

    原文:快速构建Windows 8风格应用3-打包发布应用 本篇博文主要介绍如何打包应用程序,成功后如何部署应用程序,最后介绍如何发布应用程序到应用商店中. 如何打包Windows 8风格应用程序呢? ...

  7. PHP 12 :字符串的操作

    原文:PHP 12 :字符串的操作 本章介绍字符串的操作.之所以要把字符串单独拿出来讲,是因为字符串在每种语言里都是非常重要的.并且也是大家关心的.我们从以下几个方面介绍字符串: 字符串的表现形式. ...

  8. SpecFlow - Cucumber for .NET

    SpecFlow使用入门 SpecFlow是一个BDD工具,在这里对BDD不多赘述,你可以阅读一下微软2010年十二月的一篇文章,此外如果你想要更多了解SpecFlow,可以参考我的另一篇翻译(当然, ...

  9. HTML5----input-datalist输入框自己主动提示功能

    效果图: <label for="word_name">字母 : </label> <input id="word_name" n ...

  10. List<string>和string[]

    List<string>和string[] List<string>是集合:string[]是数组: ///////////////////////////////////// ...