【问题标题】:What is the difference between two dimensional array parameters?二维数组参数有什么区别?
【发布时间】:2014-08-02 10:55:45
【问题描述】:

在这里,我可以像这样声明一个二维数组

int dp[105][140000] 

或者像这样

int dp[140000][105]

当我使用这个数组时,我发现第一个和第二个之间存在显着的时间差异。第一个比第二个快得多。这是为什么? 例如我正在运行的这段代码

    for(int i=1;i<=n;++i)
    for(int k=1;k<60;++k)
    {
        int x = (~fact[k]) & ((1<<17)-1);
        for(int s=x;s;s=(s-1)&x)
        {
            if(dp[i-1][s]+abs(A[i]-k) < dp[i][s|fact[k]])
            {
                dp[i][s | fact[k]] = dp[i-1][s] + abs(A[i]-k);
                dpchoosen[i][s|fact[k]] = k;
                dptracer[i][s|fact[k]] = s;

            }


        }

    }

【问题讨论】:

  • 缓存。彼此相邻处理的元素应在内存中彼此相邻放置。
  • 我不明白为什么缓存在这两种情况下都会更好或更差。无论哪种方式,数组成员都按顺序排列。 @weak_coder ,我认为您至少需要提供一些基本细节,说明您对数组的实际操作,以便人们有机会很好地回答您的问题。
  • “当我使用这个数组时...” - 什么工作?。贴出代码。
  • 问题不清楚,应提供更多信息...
  • n 是什么??? fact 是什么?你如何设法在两个数组声明中使用相同的代码?

标签: c++ multidimensional-array


【解决方案1】:

我认为差异与第二个中的差异有关,其中进行了更多计算以确定行的偏移量。 我的假设是基于行地址的计算比行内元素地址的计算更复杂。 无论如何,您应该看到编译器生成了哪些汇编代码。

【讨论】:

  • 这两种情况不应该只是一个uint*uint+uint操作吗?即所涉及的数字中的位数将相同?
  • @Alexandru Barbarosie 这取决于用于测试的代码。例如,内部循环可以简单地连续增加指针。那就是只计算行的地址。
  • 我还是没弄明白,两种情况下还是uint+uint,更何况,乘法和加法的次数都是一样的。
  • @Alexandru Barbarosie 如果您计算了一行的地址,您可以简单地为指针使用(C++/C)增量运算符。您无需进行任何其他计算。至少不会使用乘法运算符。
  • @Alexandru Barbarosie 我更新了我的帖子,这将更清楚我想说什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多