Question

I'm writing a class member function to remove a row from a (m x n) matrix. The memory model for the matrix (from a standard linear algebra library) is guaranteed to be a contiguous block such that the (i, j)th element maps to the (i * n + j)th element of that memory block.

I'd like to use ::memcpy for clarity and performance reasons. (The alternative ways using for loops are cumbersome.) But I need some reassurance.

In general, the destination location overlaps the source location since, if I'm deleting row r, I'd use (dropping any casts for clarity),

::memcpy(r * n, (r + 1) * n, bigger than n in general)

If ::memcpy is guaranteed to copy from the start of the block, then this will be fine. But, does the standard guarantee this? I can't see why it would and suspect the behaviour of such code is undefined.

Was it helpful?

Solution

You should use memmove instead of memcpy. The overlapping behaviour for memmove is defined.

User thang pointed out in a comment, there is a related article which dicusses the difference between memcpy and memmove.

OTHER TIPS

Have you considered using std::copy or std::copy_backwards?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top