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? 13 2688
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 Sa*******@gmail.com wrote:
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?
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
rami wrote:
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
Sa*******@gmail.com wrote:
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?
Sa*******@gmail.com wrote:
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.
--
Ian Collins.
* Sa*******@gmail.com:
[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.
* Sa*******@gmail.com:
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.
--
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?
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.
--
Ian Collins.
Thanks Collins.
Is there any specific advantage by doing it this way than accessing the
hardware directly?
regards
Sam Sa*******@gmail.com wrote:
>>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.
-- 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 --).
--
Ian Collins.
Alf P. Steinbach wrote:
* Sa*******@gmail.com:
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'.
I still contend that ::new is unnecessary (cf. http://groups.google.com/group/comp....6e66e030cd196).
If one defines a custom placement new, it is intended to be used (even
if it just forwards to the global new).
Cheers! --M Sa*******@gmail.com wrote:
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 Sa*******@gmail.com wrote:
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
* mlimber:
Sa*******@gmail.com wrote:
>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);
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.
--
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?
Alf P. Steinbach wrote:
* mlimber:
Sa*******@gmail.com wrote:
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);
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.
Fair enough. Make the data public or live with non-portability (of
course, working with hardware is usually inherently non-portable
anyway).
Cheers! --M
Alf P. Steinbach wrote:
* mlimber:
Sa*******@gmail.com wrote:
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);
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.
--
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
* 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.
--
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? This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Giancarlo Niccolai |
last post by:
Hello all.
I have peeked through the FAQ and all relevant links, and also through
Stroustrup book, but I have not been able to find an answer, so I have to
post here as a last resort.
It...
|
by: Peter Nolan |
last post by:
Hi All,
I have some software that currently loads database tables into sorted arrays
in memory to be binary searched by processes. (Long story as to why it does
this..)
Each process must either...
|
by: elviin |
last post by:
Hello.
I tried a sample programm using placement new. I am not sure if i
understand this technique correctly. I do not mean usage but a real
world application. Could anyone to describe some...
|
by: ma740988 |
last post by:
I've got a struct which is comprised of POD types. I know in advance
where in memory the struct resides. To make a long story short, I'm
doing transfers of 16 bit ADC sampled data between...
|
by: sreedhar.cs |
last post by:
Hi all,
In my application,I want to place a vector in a specific
location in shared memory.(a user supplied pointer).
I understand that the STL allocator mechanism places the data objects
within...
|
by: mangesh |
last post by:
This code is from c++ faq in section 11 :
void someCode()
{
char memory;
void* p = memory;
Fred* f = new(p) Fred();
f->~Fred(); // Explicitly call the destructor for the placed
object
}
|
by: Lagarde Sébastien |
last post by:
Hello,
I write code to debug new call with following macro:
#define new (MemoryManager::Get().setOwner (__FILE__, __LINE__, _FUNCTION-),
FALSE) ? NULL : new
The setOwner allow to save the...
|
by: LuB |
last post by:
I am constantly creating and destroying a singular object used within
a class I wrote.
To save a bit of time, I am considering using 'placement new'. I guess
we could also debate this decision -...
|
by: karthikbalaguru |
last post by:
Hi,
I find that articles stating that 'placement new' constructs an object
on a pre-allocated buffer and so takes less time.
Actually, we have to consider the allocation of the buffer and then...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 2 August 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM)
The start time is equivalent to 19:00 (7PM) in Central...
|
by: erikbower65 |
last post by:
Using CodiumAI's pr-agent is simple and powerful. Follow these steps:
1. Install CodiumAI CLI: Ensure Node.js is installed, then run 'npm install -g codiumai' in the terminal.
2. Connect to...
|
by: erikbower65 |
last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA:
1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
|
by: Rina0 |
last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
|
by: DJRhino |
last post by:
Private Sub CboDrawingID_BeforeUpdate(Cancel As Integer)
If = 310029923 Or 310030138 Or 310030152 Or 310030346 Or 310030348 Or _
310030356 Or 310030359 Or 310030362 Or...
|
by: lllomh |
last post by:
Define the method first
this.state = {
buttonBackgroundColor: 'green',
isBlinking: false, // A new status is added to identify whether the button is blinking or not
}
autoStart=()=>{
|
by: lllomh |
last post by:
How does React native implement an English player?
|
by: Mushico |
last post by:
How to calculate date of retirement from date of birth
|
by: DJRhino |
last post by:
Was curious if anyone else was having this same issue or not....
I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
| |