有效存储数据

问题描述:

也许我总是有愚蠢的问题,但不知何故我不能谷歌了我应该如何存储变量,所以它是有效的。我们的C++老师刚开始讨论了存储数据类型的大小如何影响存储数据的速度(比如搜索最接近的连续内存块),我想了解更多信息。你能给我一些指导吗?有效存储数据

+0

这功课吗?如果是这样的标签。 – 2010-02-15 16:42:47

+0

已标记,不退款无退货。 – 2010-02-15 17:27:27

+0

这是不明确的。关于动态内存分配还是变量类型,或者在这种情况下“有效”意味着什么,这一点并不明显。 – 2010-02-15 17:30:57

通常对于数值变量(例如循环计数器),应该使用“int”并让编译器为该任务选择最有效的大小。如果您特别需要特定的大小(例如uint16表示从网络接收的数据包标头的16位部分或类似数据),则使用typedef,在特定平台上给出该特定大小;否则,只需使用int。也就是说,你的老师可能一直在谈论动态内存分配器(即“malloc”和“free”背后的代码)。如果您请求分配64个字节,比方说,分配器负责为您提供一个至少具有该大小的块,并对其进行跟踪,以便在释放时将其返回到可用存储。有很多关于这些的信息,例如这里的*: http://en.wikipedia.org/wiki/Dynamic_memory_allocation

+0

是啊,这可能是他在说什么..感谢很多,我会检查出来 – Pyjong 2010-02-15 16:37:09

+0

对于循环计数器,我想说当它看到for(int i = 0 ; ...; ++ i)'>如果它是积极的,我宁愿看到它的类型,所以每个人都很清楚。因此我通常最终会得到一个'size_t' ...另外,如果它使用的函数需要特定的类型,我宁愿从头开始执行它,为什么在转换过程中支付转换费用? – 2010-02-15 18:56:49

你是指内存中的持久存储或分配?

在内存中,您定义的数据结构,为您的数据结构(堆或栈)分配内存的方式以及C++标准共同决定内存的分配方式。

持久性存储是一个完全不同的故事。

+0

我不知道..这两个术语中的哪一个是我的老师谈论的。他说了类似的内容,以避免内存泄漏,你应该先以某种方式分配一些空间,然后将相同类型的变量存储在彼此的旁边,因为如果不是这样,有时可能会发生操作系统不得不以某种方式拆分数据的情况,根本不使用一些空间,因为分割它太低效。 – Pyjong 2010-02-15 16:34:03

如何存储变量很少取决于您。但是变量的类型和大小通常取决于你。

他可能指的是“如果你需要存储一个小整数,像街道地址,你应该不会使用long,而是使用short”。这些事情往往需要相当多的领域知识,很容易将自己优化到一个角落(例如考虑千年虫问题)。

一种方法是使用变量类型。不需要在int64中存储从1到10的值。我们的想法是将变量的可能值与最适合其可能值的变量类型进行匹配。这将减少使用的内存,并减少更复杂的数据结构,从而降低处理速度。

数据写入和检索的速度将受到本地存储机制性能的影响。在现代CPU上有寄存器,2级缓存(L1 & L2),DRAM和有时磁盘(通过交换)。如果访问模式和大小有效地利用L1缓存(即小且本地一致),那么一旦数据在L1中,只需将其加载到寄存器中以供CPU访问。如果所需数据位于L2高速缓存中,则它必须先加载到L1中,然后才能加载到寄存器中进行处理。 DRAM到L2到L1到寄存器也是如此。寄存器比L1快,L1比L2快,DRAM慢。

香草萨特给在NWCPP几年前,解决这些问题的演讲:

http://video.google.com/videoplay?docid=-4714369049736584770#

从编程的角度来看,如果你的数据可以容纳一个高速缓存行内,需要重复访问或写入到,由于更少的缓存未命中(导致需要从更高级别的缓存中获取),您将获得更高的性能。对于注册的所有“缓存”级别,L1,L2,DRAM,磁盘或远程服务器都是如此。

你的老师可能的意思是,当你在堆上分配一个对象时(new),整个过程往往会越慢,对象越大。我写了a little program来衡量这种影响。

下面是结果我得到(与VS2008和优化释放模式编译关闭):

Cost of allocating 1 chars: 0.104 microseconds 
Cost of allocating 4 chars: 0.1 microseconds 
Cost of allocating 16 chars: 0.104 microseconds 
Cost of allocating 64 chars: 0.128 microseconds 
Cost of allocating 256 chars: 0.192 microseconds 
Cost of allocating 1024 chars: 0.416 microseconds 
Cost of allocating 4096 chars: 1.28 microseconds 
Cost of allocating 16384 chars: 2.56016 microseconds 
Cost of allocating 65536 chars: 3.0722 microseconds 
Cost of allocating 262144 chars: 3.58423 microseconds 

所以你的老师是对的,而分配大对象可以比分配正常大小的物体显著慢(但是速度非常快,但是在最坏的情况下我们正在谈论几微秒)。