#include #include #include // unique_ptr using namespace std; ssize_t tasks = 1, times = 100'000'000, asize = 20; // default values _Task Worker { void main() { for ( int t = 0; t < times; t += 1 ) { #if defined( STACK ) int arr[asize] __attribute__ (( unused )); // prevent unused warning for ( int i = 0; i < asize; i += 1 ) arr[i] = i; #elif defined( UARRAY ) uArray( int, arr, (size_t)asize ); for ( int i = 0; i < asize; i += 1 ) *arr[i] = i; #elif defined( UNIQUEPTR1 ) unique_ptr arr( new int[asize] ); for ( int i = 0; i < asize; i += 1 ) arr[i] = i; #elif defined( UNIQUEPTR2 ) unique_ptr arr[asize]; for ( int i = 0; i < asize; i += 1 ) arr[i] = make_unique( i ); #elif defined( VECTOR1 ) vector arr( asize ); for ( int i = 0; i < asize; i += 1 ) arr.at(i) = i; #elif defined( VECTOR2 ) vector arr; for ( int i = 0; i < asize; i += 1 ) arr.push_back(i); #else #error unknown data structure #endif } // for } // Worker::main }; // Worker int main( int argc, char * argv[] ) { char * nosummary = getenv( "NOSUMMARY" ); // print heap statistics ? struct cmd_error {}; // command-line errors try { // process command-line arguments switch ( argc ) { case 4: if ( strcmp( argv[3], "d" ) != 0 && (asize = convert( argv[3] )) <= 0 ) throw cmd_error(); case 3: if ( strcmp( argv[2], "d" ) != 0 && (times = convert( argv[2] )) <= 0 ) throw cmd_error(); case 2: if ( strcmp( argv[1], "d" ) != 0 && (tasks = convert( argv[1] )) <= 0 ) throw cmd_error(); case 1: break; // use all defaults default: throw cmd_error(); } // switch } catch( ... ) { cerr << "Usage: " << argv[0] << " [ tasks (> 0) [ times (> 0) [ array size (> 0) ] ] ]" << endl; exit( EXIT_FAILURE ); } // try uProcessor p[tasks - 1]; // add CPUs (start with one) { Worker workers[tasks]; // add threads } // wait for threads to terminate if ( ! nosummary ) { malloc_stats(); } } // main