Stack Heap std::move

0

otóz mam coś takiego: (pseudokod)


         king king;

       // Jakas funkcja:
    DistanceConstraint c(*king.getNodes(), *king.getNodes()->next, 100, 300);

    king.add(std::move(c));
        // end

         // King::add: 
    template<typename T>
    void add(T c)
    {

        void* mem = allocator.alloc(sizeof(T));

        Constraint* New = new (mem) T(c);
               // dalsze czynnosci 
    }

I teraz pytanie jak to wygląda, ponieważ na początku stworzyłem obiekt 'c' w funkcji na stosie jak nie miewam i chciałbym go przenieść na heap żeby trzymać go dłużej. Czy std::move tutaj zadziała? Ile razy jest DistanceConstraint kopiowany przez ten kod? Jak to wygląda bez std::move? Ile razy się to kopiuje?

0

Nie chce zeby pierwsza funkcja sama alokowała. Dodatkowo add() wykonuje też inne czynnosci przez co musi być tak jak jest.
W jaki sposób mogę zminimalizować ilość kopii?

0

Wszystko zależy od tego jak wygląda klasa DistanceConstraint. Poczytaj nt wymagań, które musi spełniać klasa żeby overload resolution wybrał dla niej move constructor: http://en.cppreference.com/w/cpp/language/move_constructor

Na pewno możesz dodać jeszcze jeden cast do r-value reference w szablonowej funkcji add w placement new.

king king;

// Jakas funkcja:
DistanceConstraint c(*king.getNodes(), *king.getNodes()->next, 100, 300);

king.add(std::move(c));
// end

// King::add: 
template<typename T>
void add(T c)
{
    void* mem = allocator.alloc(sizeof(T));

    Constraint* New = new (mem) T(std::move(c));
    // dalsze czynnosci 
}

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