Mail Archives: cygwin/2002/09/24/22:06:20
Hans,
That looks like over 80 megabytes just for the dynamically allocated "node"
instances:
85000 * 30 * (8 + 8) * 2
If I understand correctly, all Cygwin app memory comes out of a single pool
(hence the Cygwin heap size registry entry), so a proper accounting of
available memory must take the other concurrently executing Cygwin
applications into account.
Randall Schulz
Mountain View, CA USA
At 18:00 2002-09-24, Hans Horn wrote:
>Igor,
>
>"Igor Pechtchanski" <pechtcha AT cs DOT nyu DOT edu> wrote in message
>news:Pine DOT GSO DOT 4 DOT 44 DOT 0209241841560 DOT 7805-100000 AT slinky DOT cs DOT nyu DOT edu...
> > Don't forget the object headers - depending on which options you use, they
> > can be 8 bytes per object. It would really help to see the source of the
> > crashing program, at least the snippet with the allocation and
> dereferencing.
>
>Are there options that cost less (in terms of object headers) that the
>defaults?
>
>Allrighty, here's the essence of what's going on:
>
>// compiled with : gcc -O2 tst.cpp -o tst -lstdc++
>// gcc version: 3.2
>
>#define NUM_POINTS 85000
>#define NON_ZERO 30
>
>// problem: have a collection of NUM_POINTS points,
>// - each point has attached ca 2800 byte descriptive info
>// - each point has two kinds (left and right) of neighbors.
>// actual neighborhood of all points is given by a very sparse
>// NUM_POINTS * NUM_POINTS matrix,
>// having on average only NON_ZERO non-zero elements per row/column.
>
>#include <stdio.h>
>#include <iostream.h>
>#include <assert.h>
>
>// an element of a linked list
>typedef struct node {
> node (int _v, node* _n) : v(_v), next(_n) {}
> int v;
> node* next;
>};
>
>int main (int argc, char** argv) {
> // allocate descriptions of points
> char** points = new char*[NUM_POINTS]; assert(points);
> for (int i = 0; i < NUM_POINTS; i++) {
> points[i] = new char[2800]; assert(points[i]);
> }
> cout << "inited points[]" << endl;
>
> // represent neighborhood for each point via linked lists :
> node** adjl = new node*[NUM_POINTS]; assert(adjl); // neighbors to the left
> node** adjr = new node*[NUM_POINTS]; assert(adjr); // neighbors to the
> right
> for (int i = 0; i < NUM_POINTS; i++) { adjl[i] = adjr[i] = NULL; }
> for (int i = 0; i < NUM_POINTS; i++) {
> for (int j = 0; j < NON_ZERO; j++) {
> adjl[i] = new node(j, adjl[i]); assert(adjl[i]);
> adjr[i] = new node(j, adjr[i]); assert(adjr[i]);
> }
> cout << "i " << i << ": total " << (i+1) * 2 * NON_ZERO << endl;
> // last output: "i 29950: total 1797060"
> }
> cout << "inited adjl,r[]" << endl;
>
> // process points[] and adjl,r[]
>
> // clean-up
>
> return 0;
>}
>
>Hans
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -