Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #147647

Re: One works, the other doesn't?

From Barry Schwarz <schwarzb@delq.com>
Newsgroups comp.lang.c
Subject Re: One works, the other doesn't?
Date 2019-11-05 17:53 -0800
Organization A noiseless patient Spider
Message-ID <cc54setvt0i8kn89fi629vcm2tnc18k9r9@4ax.com> (permalink)
References <OHIvF.6838$u_3.620@fx29.iad> <qppdj2$52q$1@dont-email.me> <0EgwF.8082$kt1.6599@fx46.iad> <qpscqt$g9n$1@dont-email.me> <iKnwF.65564$P37.23863@fx33.iad>

Show all headers | View raw


On Tue, 5 Nov 2019 18:35:08 -0500, DFS <nospam@dfs.com> wrote:

<snip>

>Now I see where you were going.  Since all I ever did was copy the 
>unique elements to finalarr then print them from finalarr, there was no 
>need for it to even exist.  You're right.
>
>My thinking was this:
>- two initial arrays of the same size N/2
>- combine them into a new array size N
>- sort and dedupe and copy the unique elements into a final array of the
>   exact size N-dupes.
>
>But rather than grow that last array as each element is added, you 
>pointed out it's better to allocate bigger chunks.  Then realloc(arr,0) 
>will free extra-allocated memory.

realloc with a zero count will free ALL the memory allocated to that
pointer.

<snip>

>https://www.thegeekstuff.com/2010/10/linux-error-codes/
>
>Looking there, it seems ENOMEM (out of memory) is the only error that 
>would be returned by malloc() or realloc().  If so, would you typically 
>end the program, or would you try to free unused memory from elsewhere?

The standard (C11) does not require either routine to set errno nor
does it document ENOMEM.  This would be an extension provided by
whatever run-time library you are using.  The standard error
indication from allocation is a return value of NULL.

What you do after detecting the error depends on your program needs.

<snip>

>Once I fixed that format spec issue, the program ran fine with this call 
>to realloc() that was executed once per loop iteration:
>
>  finalarr = realloc(finalarr, sizeof(char*) * (cnt+1));
>
>My goal was to size the final array to the exact size needed.  But, as 
>you say above, it's 'very expensive' to call realloc.  It doubled the 
>processing time vs my original (from 2 to 4 seconds, but still).
>
>
>> A common strategy
>> is to initially call malloc() to allocate significantly more than one
>> object, and to only call realloc() when you reach the end of the current
>> allocation and need to add more to it. 
>
>Using that strategy, I have this (seems to work, and very quickly):
>
>
>   int cnt=0, reallocated = 0;
>   char **finalarr = malloc(sizeof(char*) * (arrsize/2));
>   for(i=0;i<arrsize;i++) {
>   while (i<arrsize-1 && strcasecmp(randoms3[i],randoms3[i+1])==0) {i++;}
>    finalarr[cnt] = randoms3[i];
>    cnt++;			
>    if(cnt>=(arrsize/2) && reallocated==0) {
>     finalarr = realloc(finalarr, sizeof(char*) * (arrsize));
>     printf("reallocated at cnt = %d\n",cnt);
>     reallocated = 1;
>    }
>   }
>   realloc(finalarr, 0);

This did not do what you thought.

>   printf("%.4fs to remove %d dupes\n",elapsedtime(start),arrsize-cnt);

<snip>

>I would like to free any unused memory right after this 'copy unique 
>items' operation.

There is no standard way to free part of an allocation.  Calling
realloc with a lesser count than currently allocated MAY accomplish
this if the function decides to reuse the current allocated area but
this is not guaranteed.  If memory has become fragmented, realloc may
decide to use a smaller available area and allow the original area to
be joined with an adjacent free area to create a larger free area.

>Looks like realloc(finalarr,0) does it.

No it doesn't.  You need to read the description of realloc in the
standard, not in a file that expresses someone's opinion.

>And that lets me continue to use finalarr afterwards, but then a call to 
>free(finalarr) at the end of the code throws an error.  Which is good, I 
>think, because it means there is no longer any unused memory allocated 
>to finalarr, right?

If you want finalarr to point to only as much memory as you need, then
call realloc with a count of sizeof *finalarr * cnt.

>Is there an easy way to measure the amt of memory freed by that command?

That command frees ALL the memory!

<snip>

>Those are interesting refinements.  I'm going to work with Refinement #1 
>and see if I can get any significant speed increases.

It would make more sense to first understand the functions that you
are using and then worry about refinements.

-- 
Remove del for email

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

One works, the other doesn't? DFS <nospam@dfs.com> - 2019-11-03 17:39 -0500
  Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-04 00:20 +0000
  Re: One works, the other doesn't? Jorgen Grahn <grahn+nntp@snipabacken.se> - 2019-11-04 06:53 +0000
  Re: One works, the other doesn't? James Kuyper <jameskuyper@alumni.caltech.edu> - 2019-11-04 09:45 -0500
    Re: One works, the other doesn't? DFS <nospam@dfs.com> - 2019-11-05 10:34 -0500
      Re: One works, the other doesn't? mark.bluemel@gmail.com - 2019-11-05 07:45 -0800
        Re: One works, the other doesn't? DFS <nospam@dfs.com> - 2019-11-05 10:53 -0500
          Re: One works, the other doesn't? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-05 08:04 -0800
            Re: One works, the other doesn't? DFS <nospam@dfs.com> - 2019-11-05 11:29 -0500
              Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-05 23:24 +0100
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-05 23:06 +0000
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-06 12:31 +1300
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-05 23:43 +0000
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-06 12:54 +1300
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-06 01:35 +0000
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-06 15:16 +1300
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-06 11:11 +0000
                Re: One works, the other doesn't? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-06 01:59 -0800
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-06 11:35 +0100
                Re: One works, the other doesn't? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-06 08:57 -0800
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-07 07:24 +1300
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-06 22:59 +0100
                Re: One works, the other doesn't? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-06 14:37 -0800
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-07 00:58 +0100
                Re: One works, the other doesn't? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-07 02:08 -0800
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-07 15:43 +0100
                Re: One works, the other doesn't? Robert Wessel <robertwessel2@yahoo.com> - 2019-11-07 16:15 -0600
                Re: One works, the other doesn't? Jorgen Grahn <grahn+nntp@snipabacken.se> - 2019-11-10 20:01 +0000
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-11 15:26 +1300
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-11 12:37 +0100
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-07 07:21 +1300
                Re: One works, the other doesn't? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-06 10:39 -0800
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-07 07:47 +1300
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-07 08:14 +1300
                Re: One works, the other doesn't? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-06 12:30 -0800
                Re: One works, the other doesn't? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-08 21:04 -0800
                Re: One works, the other doesn't? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2019-11-09 01:37 -0800
                Re: One works, the other doesn't? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2019-11-09 01:38 -0800
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-10 08:32 +1300
                Re: One works, the other doesn't? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-28 16:09 -0800
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-29 11:33 +0100
                Re: One works, the other doesn't? Öö Tiib <ootiib@hot.ee> - 2019-11-30 14:20 -0800
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-12-01 12:15 +1300
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-06 10:07 +0100
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-06 10:58 +0000
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-07 10:05 +0100
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-06 09:52 +0100
                Re: One works, the other doesn't? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2019-11-06 00:56 -0800
                Re: One works, the other doesn't? "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2019-11-06 01:00 -0800
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-06 11:32 +0000
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-06 23:11 +0100
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-06 23:22 +0000
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-07 01:04 +0100
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-07 01:13 +0000
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-07 10:22 +0100
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-07 11:51 +0000
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-07 15:58 +0100
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-07 16:34 +0000
                Re: One works, the other doesn't? DFS <nospam@dfs.com> - 2019-11-07 12:40 -0500
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-07 17:57 +0000
                Re: One works, the other doesn't? Keith Thompson <kst-u@mib.org> - 2019-11-07 21:14 -0800
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-08 09:45 +0000
                Re: One works, the other doesn't? Keith Thompson <kst-u@mib.org> - 2019-11-08 09:56 -0800
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-08 19:47 +0000
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-09 09:14 +1300
                Re: One works, the other doesn't? Keith Thompson <kst-u@mib.org> - 2019-11-08 19:10 -0800
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-09 12:24 +0000
                Like an old married couple... (Was: One works, the other doesn't?) gazelle@shell.xmission.com (Kenny McCormack) - 2019-11-08 20:25 +0000
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-07 19:58 +0100
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-07 19:31 +0000
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-08 08:56 +1300
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-07 20:06 +0000
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-08 09:21 +1300
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-07 21:20 +0000
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-08 10:28 +1300
                Re: One works, the other doesn't? Bart <bc@freeuk.com> - 2019-11-07 22:35 +0000
                Re: One works, the other doesn't? Ian Collins <ian-news@hotmail.com> - 2019-11-09 09:22 +1300
                Re: One works, the other doesn't? jadill33@gmail.com - 2019-11-07 08:37 -0800
                Re: One works, the other doesn't? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-07 08:52 -0800
                Re: One works, the other doesn't? jadill33@gmail.com - 2019-11-07 09:52 -0800
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-07 20:04 +0100
                Re: One works, the other doesn't? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-08 19:50 -0800
            Re: One works, the other doesn't? Bonita Montero <Bonita.Montero@gmail.com> - 2019-11-05 18:05 +0100
              Re: One works, the other doesn't? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-05 09:28 -0800
                Re: One works, the other doesn't? Bonita Montero <Bonita.Montero@gmail.com> - 2019-11-05 19:02 +0100
                Re: One works, the other doesn't? David Brown <david.brown@hesbynett.no> - 2019-11-05 23:21 +0100
                Re: One works, the other doesn't? Bonita Montero <Bonita.Montero@gmail.com> - 2019-11-06 18:36 +0100
      Re: One works, the other doesn't? James Kuyper <jameskuyper@alumni.caltech.edu> - 2019-11-05 12:51 -0500
        Re: One works, the other doesn't? DFS <nospam@dfs.com> - 2019-11-05 18:35 -0500
          Re: One works, the other doesn't? Barry Schwarz <schwarzb@delq.com> - 2019-11-05 17:53 -0800
          Re: One works, the other doesn't? James Kuyper <jameskuyper@alumni.caltech.edu> - 2019-11-06 09:33 -0500
      Re: One works, the other doesn't? Barry Schwarz <schwarzb@delq.com> - 2019-11-05 13:36 -0800
      Re: One works, the other doesn't? jak <nospam@please.ty> - 2019-11-07 10:17 +0100
        Re: One works, the other doesn't? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-07 12:19 +0000
          Re: One works, the other doesn't? jak <nospam@please.ty> - 2019-11-07 18:59 +0100
            Re: One works, the other doesn't? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-08 00:02 +0000
              Re: One works, the other doesn't? jak <nospam@please.ty> - 2019-11-20 10:54 +0100
                Re: One works, the other doesn't? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-20 11:14 +0000
                Re: One works, the other doesn't? jak <nospam@please.ty> - 2019-11-20 13:22 +0100
                Re: One works, the other doesn't? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-28 15:54 -0800
                Re: One works, the other doesn't? Keith Thompson <kst-u@mib.org> - 2019-11-20 08:42 -0800
                Re: One works, the other doesn't? Manfred <noname@add.invalid> - 2019-11-21 18:56 +0100
                Re: One works, the other doesn't? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-22 01:07 +0000
                Re: One works, the other doesn't? Manfred <noname@add.invalid> - 2019-11-22 15:27 +0100
                Re: One works, the other doesn't? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-28 15:47 -0800
        Re: One works, the other doesn't? DFS <nospam@dfs.com> - 2019-11-07 18:41 -0500
    Re: One works, the other doesn't? Bonita Montero <Bonita.Montero@gmail.com> - 2019-11-05 17:39 +0100
      Re: One works, the other doesn't? DFS <nospam@dfs.com> - 2019-11-05 11:47 -0500
        Re: One works, the other doesn't? Bonita Montero <Bonita.Montero@gmail.com> - 2019-11-05 17:54 +0100
          Re: One works, the other doesn't? luser droog <luser.droog@gmail.com> - 2019-11-05 09:00 -0800
        Re: One works, the other doesn't? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-08 21:02 -0800
          Re: One works, the other doesn't? DFS <nospam@dfs.com> - 2019-11-09 02:09 -0500

csiph-web