有效存储数据

时间:2010-02-15 16:20:15

标签: c++ memory-management storage

也许我一如既往地有愚蠢的问题,但不知何故我不能谷歌我应该如何存储变量以使其有效。我们关于c ++的老师只是顺便说一下,关于存储数据类型的大小如何影响存储数据的速度(比如搜索最接近的足够连续的内存块),我想了解更多相关内容。你能告诉我一些指示吗?

6 个答案:

答案 0 :(得分:2)

通常对于数值变量(例如循环计数器),您应该使用“int”并让编译器为任务选择最有效的大小。如果您特别需要特定大小(例如,uint16用于从网络接收的数据包报头的16位部分,或类似),则使用typedef在特定平台上提供特定大小;否则,只需使用int。

那就是说,听起来你的老师可能一直在谈论动态内存分配器(即“malloc”和“free”背后的代码)。例如,如果您请求分配64个字节,则分配器负责为您提供至少该大小的块,并跟踪它以便在释放时将其返回到可用存储。有很多关于这些的信息,例如维基百科: http://en.wikipedia.org/wiki/Dynamic_memory_allocation

答案 1 :(得分:0)

你的意思是在内存中持久存储或分配?

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

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

答案 2 :(得分:0)

如何存储变量很少取决于您。但是变量的类型和尺寸往往取决于你。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

Herb Sutter几年前在NWCPP发表了一篇讲述这些问题的演讲:

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

从编程的角度来看,如果您的数据可以放入缓存行并需要重复访问或写入,那么由于缓存未命中次数较少,您将获得更高的性能(导致需要从更高级别的缓存中获取) )。对于所有级别的“缓存”都是如此,无论是寄存器,L1,L2,DRAM,磁盘还是远程服务器。

答案 5 :(得分:0)

你的老师可能意味着当你在堆上分配一个对象时(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

所以你的老师是对的,分配大型对象可能比分配正常大小的对象慢得多(但是很快,我们在最坏的情况下谈论几微秒)。