Продвижение необработанного указателя на valarray

Я разрабатываю библиотеку с интерфейсом C для целей совместимости.

void interface(double* context, size_t num_elements);

в то время как context указывает на необработанную память, хранящую num_elements doubles. В оставшейся части кода есть ли какие-либо стратегии для создания std::valarray, которые временно управляют context, не освобождая его после завершения вызова библиотеки?


person xis    schedule 25.02.2013    source источник
comment
Просто чтобы напомнить вам об этом посте и услышать ваши комментарии по поводу моего ответа :)   -  person Jonathan H    schedule 26.02.2013


Ответы (1)


Не могли бы вы создать простой контейнер, соответствующий вашим потребностям? Вот небольшой пример, который я не тестировал:

template <class T>
class custom_valarray
{
public:

    // Ctor/dtor
    custom_valarray() { clear(); }
    ~custom_valarray() { clear(); }
    custom_valarray( T *ptr, const unsigned &s ) { set(ptr,s); }

    // Clear container
    void clear() { data = nullptr; size = 0; }

    // Set data
    void set( T *ptr, const unsigned &s ) { data = ptr; size = s; }

    // Test if container is set
    operator bool() const { return data; }
    bool empty() const { return data; }

    // Accessors
    T* data() { return data; }
    T& operator[] ( const unsigned &i ) 
    { 
        static T garbage;
        return i < size ? data[i] : garbage; 
    }

    // Iterators
    T* begin() { return data; }
    T* end() { return data+size; }

private:

    T *data;
    unsigned size;
};
person Jonathan H    schedule 25.02.2013
comment
Ну, конечно, это нормально, но я знаю, что в некоторых случаях valarray имеет специальную оптимизацию в C++. - person xis; 27.02.2013
comment
Какую операцию вы собираетесь выполнять с вашим valarray, которую необходимо оптимизировать? Хотя в этом нет ничего волшебного, при необходимости вы можете проверить стандартную реализацию там: gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/ - person Jonathan H; 27.02.2013