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.\n", o->ID, o->dw[1], o->dw[2]);
输出:
p-> 1, 1120403456, -842150451.
妙啊!妙啊!这是有屎以来最妙的数据结构了,让我大吃一斤啊!
当然了,我不是教大家取小妾,养情人,而是另外的,你懂的.现在正妻不会和小妾争风吃醋,也不会和情人砍起来,时间和空间名利双收啊,
皇上,您还记得西湖河畔的夏雨荷吗?
C/C++用匿名数据结构实现时间和空间名利双收的更多相关文章
- 【月光宝盒get√】用时间置换空间,聊聊稀疏数组的那些事儿
背景 数据结构是指带有结构特性的数据元素的集合.在数据结构中,数据之间通过一定的组织结构关联在一起,便于计算机存储和使用.从大类划分,数据结构可以分为线性结构和非线性结构,适用于不同的应用场景. 线性 ...
- 测试Protobuffer的定义格式对其时间和空间的影响
测试Protobuffer格式的A命令转换为std::string的的字节个数,分别测试了工程中用到的几种命令: a)AddLayer:108 b)AddSource:209 c)MoveLayer: ...
- java性能时间与空间消耗
Java性能时间与空间消耗 一.减少时间消耗 标准代码优化 (1) 将循环不变量的计算移出循环 例如:for (int i=0; i<size()*2; i++) { ... } ------& ...
- protobuf中会严重影响时间和空间损耗的地方
http://blog.chinaunix.net/uid-26922071-id-3723751.html 当前项目中普遍用到GOOGLE 的一个开源大作PROTOBUF,把它作为网络应用层面的传输 ...
- 88、展示Tensorflow计算图上每个节点的基本信息以及运行时消耗的时间和空间
''' Created on May 24, 2017 @author: p0079482 ''' #使用程序输出日志 import tensorflow as tf with tf.Session( ...
- HashSet扩容机制在时间和空间上的浪费,远大于你的想象
一:背景 1. 讲故事 自从这个纯内存项目进了大客户之后,搞得我现在对内存和CPU特别敏感,跑一点数据内存几个G的上下,特别没有安全感,总想用windbg抓几个dump看看到底是哪一块导致的,是我的代 ...
- c++ 各种数据结构的时间空间复杂度
普通线段树 时间 log2(n); 空间 n+log2(n)+log4(n)+log(8)n+.....+logn(n)==n*4; 动态开点线段树 时间 log2(n); 空间 q*log2( ...
- NOIP模拟赛-时间与空间之旅
题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship船长也成了最热门的职业之一.当然,要成为一名出色的船 ...
- 【GDOI】【图论-最短路】时间与空间之旅
最近打的一场校内训练的某题原题... 题目如下: Description 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spa ...
随机推荐
- Xutils呼叫流源代码文件下载方法
//我主要是好奇Xutils哪里回调onLoading(),查找等了很久也没找到,果然easy查找只是把它写下来 前言: 1.代码摘要只有主线,提供一般流程 2.为了易于理解,码变量名,而是类名的驼峰 ...
- white-space的值
white-space的值:normal 默认.空白会被浏览器忽略.pre 空白会被浏览器保留.其行为方式类似 HTML 中的 标签.nowrap 文本不会换行,文本会在在同一行上继续,直到遇到 标签 ...
- 浅谈 js 字符串 search 方法
原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...
- 调试经验--硬盘U菜
调试经验--硬盘U菜 随着嵌入式设备功能的开发,随着对存储设备的需求:需要存储大量数据信息.需要在转储数据,U盘升级功能等. 在使用存储设备的过程中,我们遇到一些问题,也总结了些经验: 1.几 ...
- 浅谈移动Web开发(上):深入概念
PPI 什么是PPI PPI的复杂之处在于如果他所属的上下文环境不同,意义也会完全不一样. 当我们在谈论显示设备的PPI时,它代指的屏幕的像素密度:当我们在谈论和图片相关时,我们谈论的是打印时的分辨率 ...
- PHP 生成唯一激活码
<?php /** * 从来没有产生一个唯一的激活码 * @return string */ function create_guid($namespace = null) { static $ ...
- SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识
原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息 ...
- VS2015集成新潮工具4
VS2015集成新潮工具(四) 本课程来源与微软connect视频教程,Modern Web Tooling in Visual Studio 2015 本课程主要讲下当下流行的前端工具 bowe ...
- 用jQuery的ajax的功能实现输入自动提示的功能
注意事项:要使用jQuery首先要把它的包引用进来( <script type="text/javascript" language="javascript&quo ...
- Web前端框架与类库
Web前端框架与类库的思考 说起前端框架,我也是醉了.现在去面试或者和同行聊天,动不动就这个框架碉堡了,那个框架好犀利. 当然不是贬低框架,只是有一种杀鸡焉用牛刀的感觉.网站技术是为业务而存在的,除此 ...