This is an age array called “array of structures versus array structure” that applies to complex numbers. Like most performance issues, in general the answer is "it depends", but in this case I would put my money in an array of versions of structures.
The key to choosing effective data structures for numerical calculations is to save data, which, as a rule, you will need at the same time next to each other in memory. The transition to the main memory for receiving data is slow; you want to add one piece of data to the cache at the same time and make the most of this entire cache line. Since for most meaningful calculations you almost always need both a real and an imaginary component of a complex number, storing them as arrays of (real, imaginary) pairs means that if you are working on a real component, the imaginary component will almost always sit there in the cache ready for calculation.
But it depends on access patterns. Just because the operations that I assume will be useful from an array of complex numbers does not mean that you imagine the same ones; others may benefit from a two-array approach. If you had a lot of operations on matrices A and B, like Re (A) * Im (B) - what would it mean, I don’t know, but still - then I think that, most likely, it will be much faster in CArray's approach, since you won’t need to waste memory space by loading data that you don’t need (for example, Im (A) and Re (B).)
Ultimately, this is an empirical question; if you have an idea of what your combination of access patterns is, just check two approaches. But for models that I can easily imagine, the first approach will win.
The fact that Matlab disagrees with me, through your link, surprises me so much that I almost doubt my answer. I'm not a big fan of Matlab, but Matlab people are smart and concerned about fast computing. But this is one of those decisions that were once made, it is incredibly difficult to cancel - Matlab could not change such a fundamental data layout without violating any other things, both its own and third-party ones, and the decision was probably made several decades ago. when cache performance was less important, and compatibility with some libraries was probably more important. I note that packages such as Lapack are based on a different format, an array of structures (albeit implicitly - in Fortran, complex was a primitive data type since at least FORTRAN 66).