Array jako shared_ptr , dostep za pomoca indeksu elementu ?

0

Jak poprawić niedziałająca linie ?

class ArrayInSharedPtr
{
private:
    typedef std::vector<int> TBuff;
    std::shared_ptr<TBuff> buff;
public:
    ArrayInSharedPtr(int size)
    {
        buff = std::make_shared<TBuff>();
        buff->resize(size);
        // to dziala
        std::fill(buff->begin(), buff->end(),1);
        //
        for(size_t i=0; i<buff->size(); ++i)
        {
            buff->at(i) = 1; // dziala 

            buff->[i] = 1; // ???? nie dziala ????
        }
    }
};
1

(*buf)[i]
Co do samego buff->at(i) działa poprawnie tak samo jak (*buff).at(i) z tym że https://en.cppreference.com/w/cpp/container/vector/at => constexpr reference at( size_type pos ); czyli tylko po prawej stronie.
Radzę przerobić twój kod na:

    ArrayInSharedPtr(int size)
    {
        buff = std::make_shared<TBuff>();
        TBuff &rbuff = *buff;
        rbuff.resize(size);
        std::fill(rbuff.begin(), rbuff.end(),1);
        //
        for(size_t i=0; i<rbuff.size(); ++i)
        {
            //rbuff.at(i) = 1; // działa ale to rvalue

            rbuff[i] = 1;
        }
    }

Ba porównaj asemblery z poprzednim :)

0

@_13th_Dragon zdecydowanie mniej instrukcji ASM wiec dla mnie DUŻY PLUS

używam std::vector do alokowania pamięci , a potem używam ich w zupełnie inny sposób
np.

class TData
{
private:
    typedef std::vector<uint8_t> TBuf;
    std::shared_ptr<TBuf> buf;
    size_t x, y, z, bytesPerPixel;    
public:
    TData(size_t x = 0, size_t y = 0, size_t z = 1, size_t bytesPerPixel = 1) : x(x), y(y), z(z), bytesPerPixel(bytesPerPixel){...}
    
    // low level data access
    uint8_t *u8() { return buf->data(); };
    uint16_t *u16() { return (uint16_t *)buf->data(); };
    uint32_t *u32() { return (uint32_t *)buf->data(); };
    .....

dodatkowo mam "Move assignment operator" aby przenieść tylko shared_ptr pomiędzy obiektami

   TData &operator=(TData &&other)    {
        buf = other.buf;
        other.buf.reset();

...

        return *this;
    }

https://godbolt.org/z/rKxPn888e

ale jeszcze muszę to przemyśleć

0
Adamek Adam napisał(a):

@_13th_Dragon zdecydowanie mniej instrukcji ASM wiec dla mnie DUŻY PLUS

używam std::vector do alokowania pamięci , a potem używam ich w zupełnie inny sposób

Czyżby próba wczytania struktury danych o strukturze nieznanej w czasie kompilacji?
Jeżeli tak to nie tędy droga.

0

Przemyślałem, rzeczywiście sensu większego w tym nie było.
Zrezygnowałem z "Array jako shared_ptr" oraz "Move assignment operator"
Do połączenia kolejności przetwarzania danych użyłem ">>"

std::shared_ptr<TData> data = std::make_shared<TData>(2, 2);
data >> doStep1 >> doStep2 >> doStep3;

https://godbolt.org/z/nrM4aa7W3

1 użytkowników online, w tym zalogowanych: 0, gości: 1