Tiago
Tiago

Reputation: 13

Change value pointed by this pointer

I wrote this working piece of code for my matrix struct. It computes the value of a square matrix raised to the e-th power, but this is irrelevant. I want to know what is happening in the last lines.

Is the value of p being copied to the location pointed by this? Is it a shallow copy or a deep copy? Is this being changed? I don't think so because it's const.

How can I implement that copy to make it run faster?

matrix& operator ^=(int e)
{
    matrix& b = *this;
    matrix p = identity(order());
    while (e) {
        if (e & 1)
            p *= b;
        e >>= 1;
        b *= b;
    }
    *this = p;
    return *this;
}

Upvotes: 0

Views: 175

Answers (2)

Ben Voigt
Ben Voigt

Reputation: 283634

One of the following will make it faster, if you're added appropriate buffer-stealing support to your class:

Replace

*this = p;

by either (preferred in C++11)

*this = std::move(p);

or (for C++03, should still work ok in C++11)

swap(p); // if swap is a member
swap(*this, p); // if it's not

However, since you can't overwrite the left hand side in place, best is to implement operator^, and write operator^= in terms of that:

matrix operator^(const matrix& b, int e)
{
    matrix p = identity(b.order()); // move or elision activated automatically
    while (e) {
        if (e & 1)
            p *= b;
        e >>= 1;
        b *= b;
    }
    return p; // move or NRVO activated automatically
}

matrix& operator^=(int e)
{
    *this = (*this) ^ e; // move activated automatically since RHS is temporary
    // ((*this) ^ e).swap(*this); in C++03
    return *this;
}

Just noticed you are overwriting *this in place, with successive squares.

Upvotes: 1

Remy Lebeau
Remy Lebeau

Reputation: 596206

*this = p; invokes your matrix's operator=(matrix) method, if it has one, otherwise it invokes a compiler-generated operator=() that simple performs a member-by-member copy of p's fields into this's fields (using their respective operator=() implementations).

Upvotes: 0

Related Questions