程序的时间和空间,往往是一对矛盾,比如计算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. MVC验证12-使用DataAnnotationsExtensions对整型、邮件、最小值、文件类型、Url地址等验证

    原文:MVC验证12-使用DataAnnotationsExtensions对整型.邮件.最小值.文件类型.Url地址等验证 本文体验来自http://dataannotationsextension ...

  2. Android开发----------- 手电筒改进版本号

    在之前的基础上 在 res 目录以下: 加入一个 drawable/local_me.xml localme_cml <selector xmlns:android="http://s ...

  3. linux c socket programming

    原文:linux c socket programming http://54min.com/post/http-client-examples-using-c.html 好文章 PPT http:/ ...

  4. web设计师和前端设计师的互动—前端工程师应该具备的三种思维

    如果你是一个天才工程师(马上可以离开),可以独立完成一个很多事情,你可以是一个怪咖,因为我相信没有一个人不会不佩服你.但现实归现实,多数人都不是天才,而我们在职场上也不是单打独斗,我们需要团队合作,需 ...

  5. JS链表

    链表 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于javascript的解释器针对数组都做了直接的优化,不会存在在很多编 ...

  6. InstallShield集成安装MSDE2000最小版本(一) fishout特许授权发布

    原文:InstallShield集成安装MSDE2000最小版本(一) fishout特许授权发布 原帖地址:http://blog.csdn.net/fishout/archive/2009/10/ ...

  7. W5500问题集锦(一)

    在"WIZnet杯"以太网技术竞赛中,有非常多參赛者在使用中对W5500有各种各样的疑问,对于这款WIZnet新推出的以太网芯片,使用中大家是不是也一样存在下面问题呢?来看一看: ...

  8. PHP程序猿必备的七种武器

    作为一个程序猿(又或者是程序媛),出来闯荡江湖,没有几种必杀技在手,那是肯定无法赢得江湖名声的,除了必杀技之外,武器也是很重要的,但是一把青钢剑,肯定是无法赢得万千少男少女的欢心的.就连小李飞刀,人家 ...

  9. 快速构建Windows 8风格应用17-布局控件

    原文:快速构建Windows 8风格应用17-布局控件 本篇博文主要介绍三种常用的布局控件:Canvas.Grid.StackPanel. Panel类是开发Windows 8 Store应用中一个重 ...

  10. leetcode第38题--Combination Sum

    题目: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C  ...