This is the mail archive of the
c++-embedded@sourceware.cygnus.com
mailing list .
Re: biggest deterrant to using C++?
- To: "c++-embedded at cygnus dot com" <c++-embedded at cygnus dot com>
- Subject: Re: biggest deterrant to using C++?
- From: "Kenneth Porter" <shiva at well dot com>
- Date: Mon, 24 Aug 1998 17:48:01 +0700
- Reply-To: "Kenneth Porter" <shiva at well dot com>
On Mon, 24 Aug 1998 03:37:50 +0200, Michael Bruck wrote:
>const atom_bomb my_bomb(50, 100);
>
>I would like to have my_bomb somewhere in the ROM. And the example above
>should not generate any code as long as I don't call the constructors in
>another context. What happens is, that the compiler always generates
>a function for each source file that calls all the constructors and
>then generates a section that contains the pointer to that function.
>These sections from all files are then linked together into a table of
>function pointers and the init-functions of all global objects are
>called at program startup through this table. This is ok if my
>constructors are doing something other than just copying around values.
>This would cause in most situations just some overhead,
>but if you want to use ROM it's impossible to use (virtual) classes.
I doubt we'll see compilers soon that are clever enough to statically
init an object with a vpointer and only scalar initializers in the
ctor. 'Twould be nice, though!
I recall looking up this question a few weeks ago (can't remember
where) and I recall reading that the proper way to do this was to put
things with static data in ROM'd POD structs and including an instance
or reference to the struct in a small RAM-based class object. To hide
the POD internal structure, declare it within the class:
class Thing {
struct ThingROMData {
const int weight;
};
const ThingROMData& data;
Thing(const ThingROMData& _data) : data(_data) {};
public:
static void InitThings(); // calls special ctor
virtual bool get();
};
static const Thing::ThingROMData thing1data = { 100 }; // this gets
ROM'd
The actual machinery of Thing initialization will be
application-specific, but this gives the basic idea of how to structure
the ROM part of the data.
In your example, since you want to parameterize the ctor, I'd suggest
using a macro to perform the parameterization (since macros are
expanded at compile time). I was going to suggest a template, but I
can't see how to use a template to instantiate a class instead of
creating a new type.
Kenneth Porter
Systems Engineer
Kensington Laboratories, Inc.
750 National Court
Richmond, CA 94804-2008
Voice: 510-620-0235
FAX: 510-233-5544
mailto:kenneth_porter@kensingtonlabs.com
http://www.kensingtonlabs.com