Hi,
I have some questions about whats written in http://www.parashift.com/c++-faq-lit...html#faq-11.14
(Describing some memory pool)
#1 From what i understand this will also work for new x[] and delete
[]x, or did i misunderstand something ?
and,
#2 At the time of destruction i do know from which pool my object came,
and thus i'd like to avoid using a global delete operator.
The example says that I could simply call the destructor and then my
pool's dealloc method.
But, what do I have to do if I do not have one single object, but an
array of objects ?
Call each objects destructor and then a dealloc for the whole array ?
Isn't there a way to simply call some delete[] (mypool) my_array ?
with kind regards philip 9 7225
John Harrison wrote: #2 At the time of destruction i do know from which pool my object came, and thus i'd like to avoid using a global delete operator.
The example says that I could simply call the destructor and then my pool's dealloc method. But, what do I have to do if I do not have one single object, but an array of objects ? Call each objects destructor and then a dealloc for the whole array ?
That's right.
But this is a hassle for me, since I then have to rember the size of
each array (the number of elements in there) or otherwise i would not be
able to delete it correctly.
Looks like this will just increase my overhead and not give me any
significant speedups.
My problem is, i'm doing billions (!) of new and delete (and copy ctors)
on small int arrays, which results in quie slow code. Isn't there a way to simply call some delete[] (mypool) my_array ?
It might work, but rules of C++ say that if you use placement new you must use explicit delete. So, best stick to the rules.
Well, not sure if you understood what i meant.
I'm looking for something like
int * foo = new (mypool) int[x];
delete[] (mypool) foo;
Something that will call the ctors and then call my pools delete, but
for arrays, and for my specific pool, just like the placement new does.
with kind regards philip
"Philip Lawatsch" <ph****@waug.at > wrote in message
news:3f******** @e-post.inode.at.. .
John Harrison wrote:
#2 At the time of destruction i do know from which pool my object came, and thus i'd like to avoid using a global delete operator.
The example says that I could simply call the destructor and then my pool's dealloc method. But, what do I have to do if I do not have one single object, but an array of objects ? Call each objects destructor and then a dealloc for the whole array ?
That's right.
But this is a hassle for me, since I then have to rember the size of each array (the number of elements in there) or otherwise i would not be able to delete it correctly.
Looks like this will just increase my overhead and not give me any significant speedups.
My problem is, i'm doing billions (!) of new and delete (and copy ctors) on small int arrays, which results in quie slow code.
Perhaps you should have a look at the small object allocator that is part of
the Loki library. I did some tests on it myself and found a significant
speed up compared to the allocator that comes with my compiler. http://sourceforge.net/projects/loki-lib/
Also described in the book 'Modern C++ Design' by Andrei Alexandrescu. Well
worth having. Isn't there a way to simply call some delete[] (mypool) my_array ?
It might work, but rules of C++ say that if you use placement new you
must use explicit delete. So, best stick to the rules.
Well, not sure if you understood what i meant. I'm looking for something like
int * foo = new (mypool) int[x]; delete[] (mypool) foo;
Well that's fine. Something that will call the ctors and then call my pools delete, but for arrays, and for my specific pool, just like the placement new does.
with kind regards philip
john
John Harrison wrote: Well, not sure if you understood what i meant. I'm looking for something like
int * foo = new (mypool) int[x]; delete[] (mypool) foo;
Well that's fine.
Really ?
Neat, from what I understood this is not valid, I really gotta write
some small example and give it a try.
Perhaps the FAQ should be updated slightly to make that more clear
with kind regards Philip
"Philip Lawatsch" <ph****@waug.at > wrote in message
news:3f******** @e-post.inode.at.. .
John Harrison wrote:
Well, not sure if you understood what i meant. I'm looking for something like
int * foo = new (mypool) int[x]; delete[] (mypool) foo;
Well that's fine.
Really ? Neat, from what I understood this is not valid, I really gotta write some small example and give it a try. Perhaps the FAQ should be updated slightly to make that more clear
with kind regards Philip
Actually its not, I don't know what I was thinking of. Sorry about that.
Placement delete does exist but it is only called during exception handling,
it can't be called explicitly. E.g.
#include <iostream>
using namespace std;
class Pool
{
};
class X
{
public:
X() { /*throw "error";*/ }
void* operator new[](size_t bytes, Pool& p)
{
cout << "placement new\n";
return malloc(bytes);
}
void operator delete[](void* ptr, Pool& p)
{
cout << "placement delete\n";
free(ptr);
}
void operator delete[](void* ptr)
{
cout << "ordinary delete\n";
free(ptr);
}
};
int main()
{
Pool pool;
try
{
X* x = new (pool) X[10];
delete[] x;
}
catch (...)
{
}
}
This program prints
placement new
ordinary delete
but uncommect the throw statement from the X constructor and it prints
placement new
placement delete
See http://std.dkuug.dk/jtc1/sc22/wg21/d...1995/N0642.pdf for
instance.
john
> Placement delete does exist but it is only called during exception
handling, it can't be called explicitly. E.g.
#include <iostream> using namespace std;
class Pool { };
class X { public: X() { /*throw "error";*/ } void* operator new[](size_t bytes, Pool& p) { cout << "placement new\n"; return malloc(bytes); } void operator delete[](void* ptr, Pool& p) { cout << "placement delete\n"; free(ptr); } void operator delete[](void* ptr) { cout << "ordinary delete\n"; free(ptr); } };
int main() { Pool pool; try { X* x = new (pool) X[10]; delete[] x; } catch (...) { } }
This program prints
placement new ordinary delete
but uncommect the throw statement from the X constructor and it prints
placement new placement delete
See http://std.dkuug.dk/jtc1/sc22/wg21/d...1995/N0642.pdf for instance.
john
However AFAIK you can call placement delete explicitly, e.g. in terms of the
code above
X::operator delete[](x, pool);
of course you have to call destructors explicitly as well.
I think you know as much about this topic as I do (if not more).
john
Philip Lawatsch <ph****@waug.at > wrote in message news:<3f******* *@e-post.inode.at>. .. John Harrison wrote:
#2 At the time of destruction i do know from which pool my object came, and thus i'd like to avoid using a global delete operator.
The example says that I could simply call the destructor and then my pool's dealloc method. But, what do I have to do if I do not have one single object, but an array of objects ? Call each objects destructor and then a dealloc for the whole array ?
That's right.
But this is a hassle for me, since I then have to rember the size of each array (the number of elements in there) or otherwise i would not be able to delete it correctly.
My problem is, i'm doing billions (!) of new and delete (and copy ctors) on small int arrays, which results in quie slow code.
No, it won't be slow - at least not for the reasons mentioned -
because deleting an int is a no-op.
You don't even have to write the explicit dtor call, though.
int, like all C types is called a 'POD' in C++. That means Plain Old
Data. For C compatibility, you can still treat those types like in C.
Regards
--
Michiel Salters
Michiel Salters wrote: No, it won't be slow - at least not for the reasons mentioned - because deleting an int is a no-op.
You don't even have to write the explicit dtor call, though. int, like all C types is called a 'POD' in C++. That means Plain Old Data. For C compatibility, you can still treat those types like in C.
Well, for the sake of code beautifullness, i'd like to let the compiler
handle all of these.
This stuff would go right into an array template class, and thus i'd
have to distinguish between atomic types and objects, which is something
i'd rather avoid. (I do not have rtti support in my programme for
instance, and have no intentions to add it)
But, from all the answers i've got it seems that everything boils down
to exaclty this.
Sad though, since i thought that there was a better solution to this
Btw, is there a nice way to differ between atomic (PODs) and other types
at compile time ? (for templates)
Like
template <class A>
class foo
{
void something()
{
if (A kindof POD)
somecode
else
othercode
}
};
But at compile time, NOT runtime ?!
with kind regarsd philip
John Harrison wrote: However AFAIK you can call placement delete explicitly, e.g. in terms of the code above
X::operator delete[](x, pool);
of course you have to call destructors explicitly as well.
Hmmmm ...
Just a thought, my pools delete ops will only get called in case of an
exception by new, isn't it ?
Wouldnt it be possible for me to write a delete operator that takes a
ptr to my Base class and call the destructors in there ?
pseudo code:
class memory_pool
{
void operator delete (void * ptr, Pool & pool) // used in case of
exception at new
void operator delete (void * ptr) // used for atomic types
void operator delete (Base * ptr) // used for everything derived from Base
}
and have a template class
template <class A>
{
void free()
{
some_pool::oper ator delete (data);
}
A * data
}
In this case the free method of the template would always choose the
correct delete itself, isn't it ?
Its just really bad if you try to delete something that needs a dtor but
is NOT derived from Base ...
with kind regards philip
On Wed, 09 Jul 2003 17:10:28 +0200, Philip Lawatsch <ph****@waug.at >
wrote: Btw, is there a nice way to differ between atomic (PODs) and other types at compile time ? (for templates)
Yes, type traits, although compiler support is required to determine
that some types are PODS. A type traits implementation without
compiler support can manage to tell that these are PODs:
int
double
etc.
int*
T*
POD[]
etc.
but can't for UDT's like this:
struct POD
{
int x;
int y;
};
Some compilers do provide support with intrinsic type traits (SGI's
and perhaps Metroworks?) Like
template <class A> class foo { void something() { if (A kindof POD) somecode else othercode } }; But at compile time, NOT runtime ?!
Here's one way:
template<class A, bool impl = is_pod<A>::valu e>
class foo
{
//pod implementation
};
template <class A>
class foo<A, false>
{
//non pod implenentation
};
Obviously you can select at a finer grain if you prefer, using
forwarding to overloaded "something_impl " functions taking a true_type
and false_type.
You can get type_traits from www.boost.org, or you could implement
them yourself if you really wanted.
Tom This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Tron Thomas |
last post by:
As part of applying for a programming position at a company, I
recently I had submitted some code samples to one of the developers
for review.
This is the feedback I received:
One of his concerns was frequent calls to new and delete, which can
cause
memory fragmentation over time. An example is the allocation and
destruction
|
by: Tron Thomas |
last post by:
Given the following information about memory management in C++:
-----
The c-runtime dynamic memory manager (and most other commercial memory
managers) has issues with fragmentation similar to a hard drive file
system.
Over time, the more often use call new/delete or alloc/free, there
will be
gaps and fragments in the heap. This can lead to inefficient use of
available memory, as well as cache-hit inefficiencies.
|
by: xixi |
last post by:
hi, we are using db2 udb v8.1 for windows, i have changed the buffer
pool size to accommadate better performance, say size 200000, if i
have multiple connection to the same database from application
server, will each connection take the memory 800M (200000 x 4k = 800
M), so the memory took will be 800M times number of connections, or
the total memory get from bufferpool will be 800M?
|
by: bull |
last post by:
hi
could any one explain with example the following in a better way to
understand
1. what is stack in memory, how the programs are stored in stack , what
is the use of stack
2. What is heap in memory, how the programs are stored in heap , what
is the use of heap
3. what is pool memory otherwise memory pool, what is the use of memory
pool
4. what is difference between stack and heap
|
by: arcticool |
last post by:
I had an interview today and I got destroyed :(
The question was why have a stack and a heap?
I could answer all the practical stuff like value types live on the
stack, enums are on the stack, as are structs, where classes are on
the heap... when value types go out of scope the memory is re-
allocated, object remain in memory waiting to be cleaned up by the
garbage collector, etc, but he responded 'so why not just put say a
class on the...
| |
by: Raj |
last post by:
We are on a db2 v8.2 (fix 8) with DPF & intra parllelism. Below are
sort related configuration settings
-----------------------------------------------------------------------------------------------------------------------------------
Sort heap threshold (4KB) (SHEAPTHRES) = 200000
Sort heap thres for shared sorts (4KB) (SHEAPTHRES_SHR) = (SHEAPTHRES)
...
|
by: Jerry Adair |
last post by:
Hi,
I have been playing around with the suggestions and code shown in
http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.14
regarding memory allocation/deallocation (mem pools). I think I understand
what the FAQ was getting at (emphasis on "think") so I concluded that
attempting to make a delete statement on an area of memory that was created
in a pool with the placement new operator (overloaded) would not allow me to
|
by: frederic.pica |
last post by:
Greets,
I've some troubles getting my memory freed by python, how can I force
it to release the memory ?
I've tried del and gc.collect() with no success.
Here is a code sample, parsing an XML file under linux python 2.4
(same problem with windows 2.5, tried with the first example) :
#Python interpreter memory usage : 1.1 Mb private, 1.4 Mb shared
#Using http://www.pixelbeat.org/scripts/ps_mem.py to get memory
information
|
by: Grey Alien |
last post by:
I am looking to write a very simple memory pool library to store only
one data type at a time - i.e. to provide a contiguous block of memory
to be alloc'd free'd by the calling program. I am
I have come up with this API so far and will welcome any feedback on it.
In particular, I will need help with implementing the linked lists used
for record keeping as to which blocks were free or not (and for
"defragging" the pool when "holes"...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
| |
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
| |
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |