【问题标题】:Fastest way to subtract pointer array by a constant用常数减去指针数组的最快方法
【发布时间】:2017-12-06 02:52:15
【问题描述】:

我有一个非常大的类型数组(短 *)。如何以最快的方式将所有值减去一个常数?

【问题讨论】:

  • 你想从指针中减去?指针指向的值?你能举一个例子,说明你的一些数据和预期的结果吗?
  • 嗯,for循环有什么问题?如果您真的需要速度,那么线程可能会有所帮助?划分你的数组并创建一些线程来对块进行减法
  • @smac89 线程只有在你有多个内核时才有帮助,否则维护线程的开销只会减慢速度。
  • 我想从指针指向的值中减去。基本上我的所有值都会被一个常数(比如 8504)所抵消,并且需要能够以最快的方式进行调整,而不会浪费 CPU 周期。
  • 基本上我有一个非常大的数组指针,指针指向的每个值都需要尽快从 8504 中减去。

标签: c++ arrays pointers


【解决方案1】:

使用 for 循环确实是最有效的方法

short *arr = new short[1000000];
const short c = 8504;

//populate the array
     Populate(arr); //just some method to populate the array

    for(int i=0;i<1000000;i++){
      arr[i] = c - arr[i] ;//subtract from the constant
    //or even
    //*arr = c - *arr++ ; 
    }

虽然此代码不检查类型溢出。

【讨论】:

    【解决方案2】:

    如果您不需要重新计算实际值,您可以根据使用情况临时计算:

    #include <iostream>
    using namespace std;
    
    struct OffsetShort {
        short value;
        static short offset;
        operator short() const { return value - offset; }
    };
    short OffsetShort::offset = 0;
    int main() {
        OffsetShort *vals[] = {new OffsetShort{1},new OffsetShort{2},new OffsetShort{3}};
        for (auto f : vals) {
            cout << *f;
        }
        OffsetShort::offset = 10;
        for (auto f : vals) {
            cout << *f;
        }
        return 0;
    }
    

    打印出来

    123
    -9-8-7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多