代码之家  ›  专栏  ›  技术社区  ›  Etan bbum

std::pair<int,int>vs struct与两个int

  •  29
  • Etan bbum  · 技术社区  · 16 年前

    在一个ACM示例中,我必须为动态编程构建一个大表。我必须在每个单元格中存储两个整数,所以我决定使用 std::pair<int, int> . 但是,分配一个庞大的阵列需要1.5秒:

    std::pair<int, int> table[1001][1001];
    

    之后,我将此代码更改为

    struct Cell {
        int first;
        int second;
    }
    
    Cell table[1001][1001];
    

    分配时间为0秒。

    是什么解释了时间上的巨大差异?

    5 回复  |  直到 11 年前
        1
  •  40
  •   sharptooth    16 年前

    std::pair<int, int>::pair() 构造函数使用默认值初始化字段(如果 int )还有你的 struct Cell

    初始化需要写入每个字段,这需要大量相对耗时的内存访问。具有 结构单元 什么也不做,什么也不做会快一点。

        2
  •  29
  •   Andrew Bainbridge    12 年前

    迄今为止的答案并不能完全解释问题的严重性。

    正如sharptooth所指出的,配对解决方案将值初始化为零。正如Lemurik指出的,pair解决方案不仅仅是初始化一个连续的内存块,而是为表中的每个元素调用pair构造函数。然而,即使这样,也不能说明需要1.5秒。还有别的事情正在发生。

    假设你在一台古老的机器上,比如说运行在1.33ghz,那么1.5秒就是2e9个时钟周期。您需要构造2e6对,因此每个对构造函数都要花费1000个周期。 调用只将两个整数设置为零的构造函数不需要1000个周期。 我看不出缓存未命中怎么会花那么长时间。如果循环次数少于100次,我会相信。

    不管怎么说,这就解释了额外时间的去向。显然,另一个编译器可能没有那么糟糕。当然,一个优化的发布版本也不会如此。

        3
  •  3
  •   Community Mohan Dere    9 年前

    这些都是很好的猜测,但众所周知,猜测并不可靠。

    我会说只是随机的 pause it 在那1.5秒内,但你必须非常快。如果将每个维度增加大约3倍,则可能需要10秒以上的时间,因此暂停会更容易。

    无论哪种方式,你都会得到这个问题的确切答案,而不仅仅是猜测。

        4
  •  1
  •   Ashalynd    16 年前

        5
  •  -1
  •   Test    16 年前

    这是一个很好的例子,一个人应该写C++和使用STL仔细。有什么想法吗?

    我的项目是在C&C++代码级基准测试工具,我们将在其中做大量代码样本,找出什么是“好”代码和什么是“坏”编码习惯。看见 http://effodevel.googlecode.com 了解更多关于C9B.M的信息。计划。任何人,如果你经历过很多这样的情况,请加入该项目来帮助我们。