![]() |
| | #1 |
| System Novice Join Date: Jan 2006 Location: Tehran
Posts: 1,075
| renew
__________________ Microsoft Visual Studio 2008 Professional (On Microsoft Windows XP SP2) Learn the language before using it. (C++ Books and C Books) Read the FAQ before making a problem. Then make a Google and Forum search. My code painter new version Version 0.97 DOWNLOAD NOW! (Let the pop up, pop!) SiavoshKC |
| siavoshkc is offline | |
| | #2 |
| C++ Witch Join Date: Oct 2003 Location: Singapore
Posts: 11,230
| There is none (not as directly, anyway). You could read Why doesn't C++ have an equivalent to realloc()?
__________________ C + C++ Compiler: MinGW port of GCC Build + Version Control System: SCons + Bazaar Look up a C/C++ Reference and learn How To Ask Questions The Smart Way |
| laserlight is online now | |
| | #3 |
| Registered User Join Date: Dec 2006 Location: Canada
Posts: 1,997
| to the best of my knowledge, realloc() changes the size of the memory block pointed to by a pointer. Can you give an example case where "renew" can be used? |
| cyberfish is offline | |
| | #4 | |
| System Novice Join Date: Jan 2006 Location: Tehran
Posts: 1,075
| Quote:
If new is the replacement of malloc() it should has a replacement for realloc(). Example: Code: int *intArr = new int [200]; //We need a bigger array; intArr = renew (intArr) [400];
__________________ Microsoft Visual Studio 2008 Professional (On Microsoft Windows XP SP2) Learn the language before using it. (C++ Books and C Books) Read the FAQ before making a problem. Then make a Google and Forum search. My code painter new version Version 0.97 DOWNLOAD NOW! (Let the pop up, pop!) SiavoshKC | |
| siavoshkc is offline | |
| | #5 | |
| Registered User Join Date: Dec 2006 Location: Canada
Posts: 1,997
| Quote:
| |
| cyberfish is offline | |
| | #6 |
| Kernel hacker Join Date: Jul 2007 Location: Farncombe, Surrey, England
Posts: 15,686
| Since "new" doesn't quite do the same thing as "malloc"[1], what do you expect "renew" to do? If you consider something like this: Code: class blah {
blah() {
a = new int[20];
....
}
private:
int *a;
};
...
class blah *p = new blah[100];
....
p = renew blah[200];
....
If you have a need to "resize" your datablocks, why not allocate them in "chunks" so that you get some spare size left over, and then fill that out until you get to the "size" and then do your own "renew" by using allocating a new array (or whatever it is you're dealing with) and then copying the old content into the new one. As for how to pick a "slightly larger size", perhaps picking the next (1 << n) that is bigger than the reuqested size. Using a fixed addition works well if you often only add a little bit, but if you don't know what size you're going to grow the block of memory to, then you may find that a "double it each time" is a better way [2]. [1] It's certainly possible to implement "malloc" by calling "new", but not the other way around. [2] A collegue of mine worked on a project where someone used the method of "adding a fixed size more" (I think 4K) each time the buffer was too small. It started out at 4K and grew to 16MB in his case. Growing that at 4K at a time is PAINFULL (lots of memory copying). By using the "double the size when it's not large enough", he could reduce the runtime of that particular app by a factor of 10 or so. -- Mats |
| matsp is offline | |
| | #7 | |
| Kernel hacker Join Date: Jul 2007 Location: Farncombe, Surrey, England
Posts: 15,686
| Quote:
As I explained in the previous post, "renew" isn't quite so easy to implement for the more complex scenarios. For trivial "stuff", you could implement something like this: Code: void *renew(void *ptr, size_t origsize, size_t newsize) {
// no error checking here - it should be done.
void *p = new char[newsize];
memcpy(p, ptr, origsize);
return p;
}
-- Mats | |
| matsp is offline | |
| | #8 | |||
| Registered User Join Date: Apr 2006
Posts: 1,303
| Quote:
Quote:
Quote:
__________________ It is too clear and so it is hard to see. A dunce once searched for fire with a lighted lantern. Had he known what fire was, He could have cooked his rice much sooner. | |||
| King Mir is offline | |
| | #9 | ||
| Kernel hacker Join Date: Jul 2007 Location: Farncombe, Surrey, England
Posts: 15,686
| Quote:
Quote:
-- Mats | ||
| matsp is offline | |
| | #10 | ||
| C++ Witch Join Date: Oct 2003 Location: Singapore
Posts: 11,230
| Quote:
Quote:
__________________ C + C++ Compiler: MinGW port of GCC Build + Version Control System: SCons + Bazaar Look up a C/C++ Reference and learn How To Ask Questions The Smart Way | ||
| laserlight is online now | |
| | #11 | ||
| Registered User Join Date: Apr 2006
Posts: 1,303
| Quote:
The OS may allocate 4K to the program. But the c++ code cannot directly access that 4K; it relies on calls to malloc, calloc, new, ext. Thus if you have a size 100 dynamic array, which uses objects with nontrivial constructors, and you want to increase the size by 1, there is currently no way to do it without copying the entire array over and deleting the old array. This is inefficient. Quote:
__________________ It is too clear and so it is hard to see. A dunce once searched for fire with a lighted lantern. Had he known what fire was, He could have cooked his rice much sooner. | ||
| King Mir is offline | |
| | #12 | ||
| Cat without Hat Join Date: Apr 2003
Posts: 8,492
| Quote:
Quote:
__________________ All the buzzt! CornedBee"There is not now, nor has there ever been, nor will there ever be, any programming language in which it is the least bit difficult to write bad code." - Flon's Law | ||
| CornedBee is offline | |
| | #13 | |||
| System Novice Join Date: Jan 2006 Location: Tehran
Posts: 1,075
| I don't repeat King Mir. Quote:
Quote:
You need to get some numbers from input. Initially ou make space for 100 items. But there are 122 items! If you double the allocation, you will have room for 200 items. 200 - 122 = 78 78 unit of memory is wasted. Quote:
renew should first look at the memory allocated by the last new. If it has more room at its tail then that space will be allocated. In this case the pointer does not change. Else it should find a continous free space at the size we want and copy the contents of our array to this new location, delete the old array, return the address of this new location.
__________________ Microsoft Visual Studio 2008 Professional (On Microsoft Windows XP SP2) Learn the language before using it. (C++ Books and C Books) Read the FAQ before making a problem. Then make a Google and Forum search. My code painter new version Version 0.97 DOWNLOAD NOW! (Let the pop up, pop!) SiavoshKC | |||
| siavoshkc is offline | |
| | #14 |
| Kernel hacker Join Date: Jul 2007 Location: Farncombe, Surrey, England
Posts: 15,686
| There's no guarantee that the "behind the scenes" allocation isn't larger than what you need anyways. It's obviously not necessary to DOUBLE the allocation either - adding 50% or some other proportion would work too. If you grow by 25% at "time to grow", you'd end up with 125 items on the growth, and only waste 3 items of memory if you have 122 items acutally in use - but then you get 4 times as many copies if you grow many times. It is the usual tradeoff between "memory and processing power" - you either waste CPU-cycles, but save memory or use less memory-space, but use more CPU-cycles. If you want to know exactly how many items you need, you could read your file twice, once to figure out how many items you have, and the second time to actually fill it in - that's probably not a good idea, but it could be done. realloc also copies the data sometimes, and it's only because of "overallocation" in the first place that realloc is successfull without copying (or that you ONLY have one set of malloc/realloc, so your entire heap is able to grow whenever you realloc - this is unlikely to be the case in any decent-size C++ project, since C++ is very much oriented towards using dynamic memory). Also, if you want to, you can implement your own new operator - either for ALL objects or for certain object types. With that, you could perhaps also add a functionality to support "renew" for simple cases. The complex cases still needs more knowledge of the data than you have available at that point. -- Mats |
| matsp is offline | |
| | #15 |
| Algorithm Dissector Join Date: Dec 2005 Location: New Zealand
Posts: 2,723
| I assume you mean that multiplying the size by some constant > 1, as resizing to 1.5x the size is also acceptable afaik.
__________________ My homepage Advice: Take only as directed - If symptoms persist, please see your debugger |
| iMalc is offline | |
![]() |
| Thread Tools | |
| Display Modes | |
|