【问题标题】:Storing data effectively有效存储数据
【发布时间】:2010-02-15 16:20:14
【问题描述】:

也许我和往常一样有愚蠢的问题,但不知何故我无法通过谷歌搜索我应该如何存储变量以便它有效。顺便说一句,我们的 C++ 老师谈到了存储数据类型的大小如何影响存储速度(比如搜索最接近的足够连续的内存块),我想了解更多关于它的信息。你能给我一些指示吗?

【问题讨论】:

  • 这是作业吗?如果是这样标记。
  • 标记,不退款不退货。
  • 这还不清楚。您是在谈论动态内存分配还是变量类型,或者在这种情况下“有效”是什么意思,这一点并不明显。

标签: c++ memory-management storage


【解决方案1】:

一般而言,对于数值变量(例如循环计数器),您应该使用“int”并让编译器为任务选择最有效的大小。如果您对特定大小有特殊需求(例如,uint16 表示从网络接收的数据包标头的 16 位部分,或类似的),则使用在您的特定平台上给出该特定大小的 typedef;否则,只需使用 int。

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

【讨论】:

  • 是的,这可能就是他所说的......非常感谢,我会检查一下
  • 对于循环计数器,我想说的是,当我看到 for (int i = 0; ... ; ++i) 时,它让我很恼火 > 如果它是积极的,我宁愿在类型中看到它,所以它是每个人都清楚。因此我通常会得到一个size_t...另外,如果它使用的函数需要一个特定的类型,我宁愿从一开始就强制执行它,为什么要支付转换成本那么简单?跨度>
【解决方案2】:

你的意思是持久存储还是内存分配?

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

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

【讨论】:

  • 我不知道……这两个术语中的哪一个是我的老师在谈论的。他说了类似的话,以避免内存泄漏,您应该首先以某种方式分配一些空间,然后将相同类型的变量彼此相邻存储,因为如果不是有时可能会发生您的操作系统必须以某种方式或不会拆分数据'根本不使用一些空间,因为拆分它效率太低。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      数据写入和检索的速度将受本地存储​​机制的性能影响。在现代 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、磁盘还是远程服务器。

      【讨论】:

        【解决方案6】:

        您的老师可能的意思是,当您在堆上分配一个对象(使用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
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-02
          • 1970-01-01
          • 2020-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多