Use of placement new in memory mapped i/o

S

Samshayam

I have come across the application of placement new in memory mapped
i/o in a number of books.I am not able to understand it completely, may
be becaues of my lack of knowledge with memory mapped i/o.In my
understanding it is a system where I/O devices are treated as memory
locations and are addressed using same number of address lines.How an
object placed at a specific location makes a difference to this?Some
body pls clarify?
 
R

rami

Samshayam,

Memory Mapped I/O need not be just on device and can be for files as
well. In that case you can create your structure in memory location
which will automatically be saved in the file (if this address is at
the location where file is being mapped). Obviously the implementation
is not as easy and requires to go through a lot of issues like
framentation, memory management etc..

Simple yet powerful technique and is used a lot in databases etc..

Regards,
Ramneek Handa
www.lazybugz.net
 
S

Samshayam

Rami,
Thanks alot.
C++ FAQ , says the following as application of placement new.
"For example, when your hardware has a memory-mapped I/O timer device,
and you want to place a Clock object at that memory location."
This is making a me again confused

regards
Sam
 
I

Ian Collins

Rami,
Thanks alot.
C++ FAQ , says the following as application of placement new.
"For example, when your hardware has a memory-mapped I/O timer device,
and you want to place a Clock object at that memory location."
This is making a me again confused
Please don't top post, your reply should be after, or interleaved with
the message you are replying to.

This is a common situation with embedded applications, where you have
hardware device registers in your memory map and want to map a C++
struct over the registers. You use placement new to create the object
at the memory location occupied by the hardware device.
 
A

Alf P. Steinbach

* (e-mail address removed):
> [top-posting, excessive quoting]

Please don't top-post in this group. Please don't quote excessively.
Please read the FAQ on how the post.

Thanks in advance.


* (e-mail address removed):
C++ FAQ , says the following as application of placement new.
"For example, when your hardware has a memory-mapped I/O timer device,
and you want to place a Clock object at that memory location."
This is making a me again confused

As well it should: hardware is very seldom C++-oriented. Placing a POD
(C-like struct) at some memory address to access memory mapped hardware
is useful, but you don't need placement new for that. A non-POD object
can have "hidden" fields, like a vtable pointer, and also its fields can
be in an unpredictable order; using such an object for memory mapped i/o
is a recipe for disaster.

In short, the example, at <url:
http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10>, seems to be
a leftover from some earlier editing, and in addition the 'new' in the
code there should be '::new'.

CC: Marshall Cline (the FAQ maintainer).
Thanks: Marshall Cline, for maintaining the FAQ.
 
S

Samshayam

This is a common situation with embedded applications, where you have
hardware device registers in your memory map and want to map a C++
struct over the registers. You use placement new to create the object
at the memory location occupied by the hardware device.

Thanks Collins.
Is there any specific advantage by doing it this way than accessing the
hardware directly?

regards
Sam
 
I

Ian Collins

Thanks Collins.

It's Ian.
Is there any specific advantage by doing it this way than accessing the
hardware directly?
You get a nice tidy wrapper round the hardware. You could achieve the
same result with a wrapper object that takes the address of the hardware
as its constructor parameter, all down to style realy.

By the way, it's customary not to quote signatures (the bit below the --).
 
M

mlimber

Alf said:
* (e-mail address removed):

As well it should: hardware is very seldom C++-oriented. Placing a POD
(C-like struct) at some memory address to access memory mapped hardware
is useful, but you don't need placement new for that. A non-POD object
can have "hidden" fields, like a vtable pointer, and also its fields can
be in an unpredictable order; using such an object for memory mapped i/o
is a recipe for disaster.

In short, the example, at <url:
http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10>, seems to be
a leftover from some earlier editing, and in addition the 'new' in the
code there should be '::new'.

I still contend that ::new is unnecessary (cf.
http://groups.google.com/group/comp.lang.c++/browse_frm/thread/b656e66e030cd196).
If one defines a custom placement new, it is intended to be used (even
if it just forwards to the global new).

Cheers! --M
 
R

rami

Rami,
Thanks alot.
C++ FAQ , says the following as application of placement new.
"For example, when your hardware has a memory-mapped I/O timer device,
and you want to place a Clock object at that memory location."
This is making a me again confused

Sam,
The reason why they mentioned was just so you know that an object
can be required to be in a fixed position and thus the reason of the
placement new operator. It doesnt matter what the example says. To have
a look at real world usage check:
http://lightwave2.com/persist/

Hope it helps,
Ramneek
http://www.lazybugz.net
 
M

mlimber

I have come across the application of placement new in memory mapped
i/o in a number of books.I am not able to understand it completely, may
be becaues of my lack of knowledge with memory mapped i/o.In my
understanding it is a system where I/O devices are treated as memory
locations and are addressed using same number of address lines.How an
object placed at a specific location makes a difference to this?Some
body pls clarify?

Let's say you have a read-only, 32-bit hardware register mapped at
address 0x8000 that has two fields, bit 0 and bits 1-5 respectively.
Assuming int is 32 bits, you might map it like this:

class Reg
{
private:
typedef unsigned int ui32;
ui32 reg_;
public:
ui32 GetField1() const volatile { return reg_ & 1; }
ui32 GetField2() const volatile { return (reg_ >> 1) & 0x1f; }
};

int main()
{
void* const regAddr = reinterpret_cast<void*>(0x8000);
const volatile Reg* const reg = new( regAddr ) Reg;

cout << "the first field is " << reg->GetField1() << '\n';
cout << "the second field is " << reg->GetField2() << '\n';
}

Since the Reg object is located at 0x8000 thanks to placement new, that
means that the sole POD datum is located at that address. As others
have noted, there are alternate ways of accomplishing this same thing
with accompanying advantages and disadvantages, but this one will work
and illustrates what the FAQ is talking about.

Cheers! --M
 
A

Alf P. Steinbach

* mlimber:
Let's say you have a read-only, 32-bit hardware register mapped at
address 0x8000 that has two fields, bit 0 and bits 1-5 respectively.
Assuming int is 32 bits, you might map it like this:

class Reg
{
private:
typedef unsigned int ui32;
ui32 reg_;
public:
ui32 GetField1() const volatile { return reg_ & 1; }
ui32 GetField2() const volatile { return (reg_ >> 1) & 0x1f; }
};

int main()
{
void* const regAddr = reinterpret_cast<void*>(0x8000);

For the sake of discussion, let's assume this works.

const volatile Reg* const reg = new( regAddr ) Reg;

cout << "the first field is " << reg->GetField1() << '\n';
cout << "the second field is " << reg->GetField2() << '\n';
}

Since the Reg object is located at 0x8000 thanks to placement new, that
means that the sole POD datum is located at that address.

No, not necessarily. You have 'private' data so this is not a POD, and
the compiler is free to reorder things, including placing some padding
at the start. A POD, on the other hand, would be OK except if it had
padding at the end which intruded into a read-only or non-existent
address area -- doing hardware level things is fraught with dangers
like that, and using non-POD classes introduces additional gotchas.
 
M

mlimber

Alf said:
* mlimber:

For the sake of discussion, let's assume this works.



No, not necessarily. You have 'private' data so this is not a POD, and
the compiler is free to reorder things, including placing some padding
at the start. A POD, on the other hand, would be OK except if it had
padding at the end which intruded into a read-only or non-existent
address area -- doing hardware level things is fraught with dangers
like that, and using non-POD classes introduces additional gotchas.

Fair enough. Make the data public or live with non-portability (of
course, working with hardware is usually inherently non-portable
anyway).

Cheers! --M
 
R

rami

Alf said:
* mlimber:

For the sake of discussion, let's assume this works.



No, not necessarily. You have 'private' data so this is not a POD, and
the compiler is free to reorder things, including placing some padding
at the start. A POD, on the other hand, would be OK except if it had
padding at the end which intruded into a read-only or non-existent
address area -- doing hardware level things is fraught with dangers
like that, and using non-POD classes introduces additional gotchas.

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?


Wow, I didnt know that compiler could reorder in non-POD classes??? Are
you sure?
Can you give me some references??

Ramneek
www.lazybugz.net
 
A

Alf P. Steinbach

* rami:
> [quoting signature, excessive quoting]

Please don't quote signatures. Please don't quote excessively. Please
read the FAQ on how to post.

Thanks in advance.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,773
Messages
2,569,594
Members
45,120
Latest member
ShelaWalli
Top