|
lhayes00 wrote: My question is this, would there be any performance differences between the above source and the source listed below?
IMHO none noticeable (There are two constructors instead of one, though, if you have a huge number of objects...).
lhayes00 wrote: The first example would be easier for me to maintain because there will be many variations of 'AnotherClass'.
The above is a good reason to go on with inheritance.
lhayes00 wrote: Also do overloaded methods cause performance differences?
IMHO no, they are translated by the compiler to different named methods (in fact functions).
BTW C++ language is fairly efficient (is one of its design goals), I think that you should first address your efforts to good, clean design and then on optimization of your algorithms, and finally worry about efficiency of different language constructs.
Please note that I gave you general guidelines, I'm not an expert of that
lhayes00 wrote: nitty-gritty low-level
things.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
I should learn to read the whole message
Also do overloaded methods cause performance differences?
Well, a normal non-virtual function call has the normal overhead of a, well, normal function call. That is, the arguments are pushed to the stack, the return address is pushed to the stack, etc.
(As far as I know) If you have a polymorphic object, in most implementations it keeps a (hidden) pointer to a table of function pointers (known as 'vtable'). So, before making the call, the pointer to the vtable and then the one to the function would have to be de-referenced. (I really don't know how expensive that is; it may be significant on some systems, but probably nothing significant for normal use).
However, if the compiler is able to tell the exact type of the object, it won't need to call the function virtually.
For example
<br />
Derived x;<br />
x.bar();
<br />
Base *x;<br />
x->foo();
If you really think it would make a difference, try it both with virtual and with non-virtual and see what happens. (And let us known what the result was )
Florin Crisan
|
|
|
|
|
Googling around for virtual function calls, I found this research paper[^], but I'm too lazy to read it. Hope it helps.
Florin Crisan
|
|
|
|
|
What a mess. It took me so many messages to say so little.
I'm going to get some sleep before the party. Happy New Year!
Florin Crisan
|
|
|
|
|
Florin Crisan wrote: Also do overloaded methods cause performance differences?
Florin Crisan wrote: (As far as I know) If you have a polymorphic object, in most implementations it keeps a (hidden) pointer to a table of function pointers (known as 'vtable'). So, before making the call, the pointer to the vtable and then the one to the function would have to be de-referenced. (I really don't know how expensive that is; it may be significant on some systems, but probably nothing significant for normal use).
However, if the compiler is able to tell the exact type of the object, it won't need to call the function virtually.
For example
Derived x;
x.bar(); // x is a derived -- call Derived::bar() directly
Base *x;
x->foo(); // is x a Base or a Derived? use the function pointer to be sure
Method overload and method override are two quite distinct concepts, he asked for the former, you're talking about the latter.
Florin Crisan wrote: Derived x;
x.bar(); // x is a derived -- call Derived::bar() directly
Base *x;
x->foo(); // is x a Base or a Derived? use the function pointer to be sure
AFAIK method invocation is always done via vtables.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
CPallini wrote: Method overload and method override are two quite distinct concepts, he asked for the former, you're talking about the latter.
My bad.
CPallini wrote: AFAIK method invocation is always done via vtables.
I remember reading differently in Stroustrup's book, but it might be just the lack of sleep. I guess it's really up to the compiler's implementer.
Florin Crisan
|
|
|
|
|
Florin Crisan wrote: I remember reading differently in Stroustrup's book
Well, I surely don't debate against C++ founder, maybe you're right.
Happy New Year
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thank you very much for all of your input!
I am just about to get started on the link you suggested, it looks for interesting reading.
Happy new year!!
|
|
|
|
|
hi to all
itook a varible BYTE *bByte and want to convert bByte[1] into a CString type varible,bByte varible has hex value,
i done CString csValue=(CHAR)bByte;
where am i wrong
|
|
|
|
|
Assuming that you want to create a string representation of the number (that is 32 => "32" rather than 32 => " " – space being the character with the ASCII code 32), you can use something like this:
CString x;<br />
BYTE b = 123;<br />
x.Format("%u", (unsigned int) b);
or
x.Format("%x", (unsigned int) b); // "7b"
You need to convert it to unsigned int because there doesn't seem to be a way to specify a 1-byte integer in the format string.
Or, if you feel adventurous, you can try stringstream[^] or The Boost Format Library[^].
Florin Crisan
|
|
|
|
|
In your code, bByte is actually a pointer to a BYTE rather than a BYTE . You should have named it better: pbySomethingUseful . p stands for pointer, by stands for byte (b stands for bool , and that one is actually as big as an int ). The rest should be a useful name
So your code should look like:
csValue.Format("%x", (unsigned int) (*pbySomethingUseful)) .
Florin Crisan
|
|
|
|
|
You can use CString::Format
csValue.Format( "%x", bByte[1] );
modified on Monday, December 31, 2007 9:36:06 AM
|
|
|
|
|
Hi,
You are attempting to cast a BYTE* into a CHAR. A BYTE* is a pointer to BYTE data....so the casted CHAR will be a CHAR representation of the pointer address of bByte.
CString csValue = (CHAR)bByte[0]; // for individual character
or
CString csValue = (CHAR*)bByte;
If you want to show the hex value of the byte, you can do something like the following:
CString csValue;<br />
csValue.Format(_T("%02X"), bByte[0]);
If you wanted to show the entire contents of the byte array as hex then you will need to wrap the above within a loop and concatenate the result each time to the result string.
<br />
CString csValue, csTemp;<br />
BYTE *pActiveByte = bByte;<br />
while(*pActiveByte)<br />
{<br />
csTemp.Format(_T("%02X"), *pActiveByte++);<br />
csValue.Append(csTemp);<br />
}
I hope that this helps...
Lea Hayes
|
|
|
|
|
I must say that I am little surprised that it works with a BYTE . Weren't %x and %u supposed to take a (four-byte) integer?
Florin Crisan
|
|
|
|
|
Hi all
There is a mfc project and uses my extension mfc dlls. When i look with "Process Explorer" at my mfc exe, the virtual memory of the project is growing. But i am sure there is no memory leak, i tested my projects with Devpartner.
What can be the reason of this growth?
thx.
caner abali
|
|
|
|
|
Maybe there aren't leaks but, neverthless, your application is allocating more and more memory.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
CPallini thx your reply
yeah i know there are lots memory allocations. i think i have to be much more clear.
When i start my app and it is on idle mode, then it gets some notifications from out of my app, it does its job and again it is on idle mode, but virtual memory size is not as same as first idle mode. and vitrual memory size increases rapidly the third idle mode and followinds idle modes.
i hope i am clear. (sorry for my deficient english
thx much
caner abali
modified on Monday, December 31, 2007 8:59:10 AM
|
|
|
|
|
canercaner wrote: sorry for my deficient english
Don't worry about, your English (as far as I can recognize, I'm not and English man too) is enough clear.
When your app does it's job servicing another one, does it release all the memory allocated resources?
Post the relevant code, if you think that it may help.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
yeah in real, it must be a service app, but now it is standard mfc exe.
i think it releases all memory allocated by app because when i exit the app, there is no memory leak. i tested it with Devpartner. And the source code is not small to send in here.
caner abali
|
|
|
|
|
canercaner wrote: i think it releases all memory allocated by app because when i exit the app, there is no memory leak. i tested it with Devpa
Yes, it maybe that final cleanup is correct, but, neverthless, you application holds too much memory while running.
canercaner wrote: And the source code is not small to send in here
Hence, ... Good Luck!
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
canercaner wrote: But i am sure there is no memory leak
How are you sure?
|
|
|
|
|
i tested my projects with Devpartner.
caner abali
|
|
|
|
|
This may simply be the Process Working Set and therefore would be normal. To see if this is the case, after you notice the increase, minimize your window to the taskbar and see what happens to the virtual memory...if it returns to nearly what it was when you started, then what you are seeing is the working set.
Hope that helps.
Karl - WK5M
PP-ASEL-IA (N43CS)
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
|
|
|
|
|
canercaner wrote: What can be the reason of this growth?
Most likely a memory leak, though you say there isn't one.
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
|
|
|
|
|
Anyone tell me some about the WM_TIMER message handler. How it does works? I was try to a switch for nIDEvent but it does not give a result. I am guessing that no need to use CTime() or SetTimer()
Code:
<br />
void CEfeView::OnTimer(UINT nIDEvent) <br />
{ <br />
if((nIDEvent == ID_RECTANGLE)&&(m_bMouseMoving == TRUE))<br />
SetJoyLockRectangle(1700,700,1710,710); <br />
else<br />
AfxMessageBox(...<br />
KillTimer(1);<br />
modified 13-Mar-13 6:09am.
|
|
|
|