为一堆变量赋值的最有效方法

时间:2017-02-08 14:33:09

标签: c++ performance variable-assignment

假设我们有一些整数变量,并且它们都应该从名为" numberpool"的结构中获取它们的值。通过函数调用,值赋值只能由" entrykey":

完成
SET 0 = 0 + 1

我想知道,这是完成这项工作的最快方法吗?由于频繁的函数调用,我怀疑有更有效的方法可以做到这一点 如果我定义另一个包含所有int变量的结构,并且只调用一次函数,它会有用吗?

3 个答案:

答案 0 :(得分:2)

函数调用的性能不是你的问题。编译器将能够很好地优化它。

然而,看到这么多变数让我感到畏缩。除非你真的在每一个变量背后都有一个含义(除了是字母表的字母),你应该考虑另一个设计。如果你真的想将字母表映射到数字,你应该只使用一个数组。

答案 1 :(得分:2)

使用方法代替独立功能并指定自然方式:

struct numberpool{
    vector<int> numbers(100);
    int get( size_t tag ) const { return numbers[tag] };
};

int main(){
    numberpool pool;  
    ...... // pool initialization

    int a = pool.get(1);
    int b = pool.get(5);

    ....and so on.

    return 0;
}

答案 2 :(得分:0)

如果大多数“标签”索引紧密组合在一起,您可以将基础数据复制为一个块:

struct subrange{
    static size_t min_ndx() constexpr { return 1; }
    static size_t max_ndx() constexpr { return 23; }
    static size_t storage_size() constexpr { return max_ndx() - min_ndx() + 1; }

    array<int, storage_size()> storage;
    int outlier_99; // Avoid copying indices between 24 and 99

    // accessors
    int &a() { return storage[1 - min_ndx()]; }
    int &b() { return storage[5 - min_ndx()]; }
    int &c() { return storage[23 - min_ndx()]; }
    int &d() { return outlier_99; }

    // Constructor allows numberpool to copy its vector
    subrange(const vector<int>& numbers)
        :storage(numbers.cbegin() + min_ndx(),
                 numbers.cbegin() + min_ndx() + storage_size()),
        outlier_99(numbers[99])
    {}
};

struct numberpool{
    vector<int> numbers(100);
    subrange copy_subrange( ) const {
        return subrange(numbers); };
    };

main()
{
    numberpool pool;  
    ...... // pool initialization

    // Copy a subset of memory, including data you're interested in,
    // and some chunks in between you're not.
    auto extracted = pool.copy_subrange();

    int sum = extracted.a() + extracted.b() + extracted.c() + extracted.d();

根据您的具体情况,复制一块内存可能会更快,也可能不会更快。如果有疑问,请尝试两种方式。