在没有分配和存储器复制的情况下从数组中生成向量

时间:2016-08-18 19:25:09

标签: c++ gcc

我到处都有这个API:

void func(const vector<int> &vint);

哪个设计很糟糕,但是我需要将int*传递给它而不分配\ copy,因为我发现它是一个瓶颈。 (在多个线程上同时执行memcpy不会更快复制)

我想写一个这样的课:

template<typename T>
struct fake_vector {
    fake_vector(T *array, size_t array_length) {
        internal_vector.set_begin(array);
        internal_vector.set_end(array + array_length);
    }
    ~fake_vector() { // let's reset our internal vector so it won't try to deallocate our memory
        internal_vector.set_begin(nullptr);
        internal_vector.set_end(nullptr);
    }
    vector<T> &get() {
        return internal_vector;
    }

    vector<T> internal_vector;
};

然后像这样使用它:

fake_vector<int> my_fake_vector(vint,vint_length);
process(my_fake_vector.get());

但我不知道如何设置矢量的开始\结束。这个问题是开放式的,可以解决这个fake_vector最后一个难题或一个新的不那么狡猾的解决方案。

1 个答案:

答案 0 :(得分:2)

您可以继承vector<T>,然后使用_M_impl._M_start_M_impl._M_finish进行调整:

template<typename T>
struct fake_vector : vector<T> {
    fake_vector(T *array, size_t array_length) {
        vector<T>::_M_impl._M_start = array;
        vector<T>::_M_impl._M_finish = array + array_length;
    }
    ~fake_vector() { // let's reset our internal vector so it won't try to deallocate our memory
        vector<T>::_M_impl._M_start = nullptr;
        vector<T>::_M_impl._M_finish = nullptr;
    }
    vector<T> &get() {
        return *(vector<T>*)this;
    }
};

例如正常使用:

int x[3] = {1,2,3};
fake_vector<int> fake_x(x,3);
for (auto &p : fake_x)
    printf("%p = %d\n", &p, p);
for (int i = 0; i < 3; i++)
    printf("%p = %d\n", &x[i], x[i]);

哪个输出:

0x7ffeb42406e0 = 1
0x7ffeb42406e4 = 2
0x7ffeb42406e8 = 3
0x7ffeb42406e0 = 1
0x7ffeb42406e4 = 2
0x7ffeb42406e8 = 3

注意:如果您使用的是libc ++(例如,收到未声明_M_impl的错误),请尝试将_M_impl._M_start替换为__begin_,将_M_impl._M_finish替换为__end_ }}