也许我一如既往地有愚蠢的问题,但不知何故我不能谷歌我应该如何存储变量以使其有效。我们关于c ++的老师只是顺便说一下,关于存储数据类型的大小如何影响存储数据的速度(比如搜索最接近的足够连续的内存块),我想了解更多相关内容。你能告诉我一些指示吗?
答案 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
所以你的老师是对的,分配大型对象可能比分配正常大小的对象慢得多(但是很快,我们在最坏的情况下谈论几微秒)。