|
Not at all. Because someone created a technology it doesn't follow that they are the best ones to explain its ideas.
Kevin
|
|
|
|
|
Hello,
What you need to reed depends on what you want to do. If you want to write windows programs, you can study MFC or WIN32. I don't recommand WIN32 since MS is moving to another platform.
When you want to learn how the standard library works, you should read 'The C++ programming language' by Bjarne Stroustrup. This book was already suggested.
My suggestion is that you start to build small C++ programs in C++. Design them well first and read about each topic you come across. If you need some data structure for example, read about vectors, maps, lists, etc.. So for your first toy app, you almost read an entire bookm but you'll read less and less each time. I found that this is an easy way to learn a new language if you are an experianced developer.
One more tip, learn about the C++ memory model very fast. Since it is not managed like C#, you can easy leak tons of memory. This was one of the biggest pitfalls for developers who step down to C++ from a managed language.
Hope this helps.
Behind every great black man...
... is the police. - Conspiracy brother
Blog[^]
|
|
|
|
|
Thanks for that Bob... Yes Memory allocation etc is something i have generally been able to avoid using VB and .NET. I will keep it in mind.
MCSD(VB6/SQL7)
MCAD(C#/SQL2000)
MCSD(C#/SQL2000)
|
|
|
|
|
A common error for C# or Java programmers moving to C++ is the tendency to use heap allocation (new) everywhere. But the general strategy for C++ is to
1. Use dynamic allocation only when its necessary.
2. Prefer using library data structures, e.g., std::vector, std::list, to rolling your own.
3. If you must use dynamic allocation, use a smart pointer class, e.g., auto_ptr or boost::shared_ptr
Kevin
|
|
|
|
|
|
I will work my way through those.
Thanks Kevin - and to everyone else who responded.
MCSD(VB6/SQL7)
MCAD(C#/SQL2000)
MCSD(C#/SQL2000)
|
|
|
|
|
Hello guys,
I have next situation : I have a class CHugeInteger , which has four public functions :
1) CString add(CString &a,CString &b)
2) CString sub(CString &a,CString &b)
3) CString mul(String &a,CString &b)
4) CString div(CString &a,CString &b)
I also have two(or more) protected member functions : foo1(..) ,foo2(..) ,...;
The later four public functions I need for doing arithmetic operations on very large numbers.
The protected functions are called by public functions very many times,especially when I am doing arithmetic operations with very big numbers(more than 500 digits).
Also public functions call each other very many times , for example div calls add ,sub and mul .
My questions is : what is the best way in this case to declare these functions(static,friend,inline,global..) in order to get best performance ?
My first implementation looked like this :
-The four public functions(add,mul,div,sub) were declared as friend functions.
-All protected members as static .
So the class's user interface was also easy to use as the client could call the functions straight like :
CString s = mul("23423423498989898877234234","4568988590866085685686805680")
but the user interface is not important for me.And I thought that latter implementation was not the best way of declaring functions for getting highest performance.
Can anyone help??
thanks
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
me think the cost of calling a function/method will be negligeable compared to the cost of doing the calculation.
but I might be wrong.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
Maximilien wrote: me think the cost of calling a function/method will be negligeable compared to the cost of doing the calculation.
Of course you are right , but I have modified the functions as much as I could in order ro achieve better performance , but now if I increased the speed of calling them It wouls do me a hand.
Imagine the case when I need to call the protected members or public for example 10^100 times.I really think in this case the calling method would give me a difference in time.
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
calling a protected or a public member function is the same thing, those keywords are only used by the compiler, not the execution; they do not change the calling convention.
if you want to look for performance gain, have a look at the constructor,
CString s = mul("23423423498989898877234234","4568988590866085685686805680")
I'm not a guru, but if you do this, maybe you are creating (new and delete ) a temporary object when calling the mul function ( whether it's a free function, static or a member function ).
as the other wrote, do some measurements, try to document your findings, but I'm sure that you will not see a big difference between the different ways of calling a function.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
Maximilien wrote: calling a protected or a public member function is the same thing, those keywords are only used by the compiler, not the execution; they do not change the calling convention.
I know this I just thought that declaring them as static or friend or inline or global function would influence the calling time.
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
Giorgi Moniava wrote: I just thought that declaring them as static or friend or inline or global function would influence the calling time.
inline , yes, as it suppresses (if the compilers effectively aggreed to inline the function) a function call... but, it will weight your exe size consequently too...!
TOXCCT >>> GEII power [toxcct][VisualCalc]
|
|
|
|
|
here is how i would have defined the class...
<font color=blue>class</font> CHugeInteger {
<font color=green>
<font color=blue>private</font>:
CString m_strHugeIntegerValue; <font color=green>
<font color=blue>public</font>:
CHugeInteger(); <font color=green>
CHugeInteger(const CString&); <font color=green>
CHugeInteger(<font color=blue>int</font>); <font color=green>
CHugeInteger(<font color=blue>const</font> CHugeInteger&); <font color=green>
~CHugeInteger(); <font color=green>
<font color=green>
CString& <font color=blue>operator</font> CString();
<font color=blue>friend</font> CHugeInteger& <font color=blue>operator</font> CHugeInteger(<font color=blue>const</font> CString&);
<font color=green>
CHugeInteger& <font color=blue>operator</font> + (<font color=blue>const</font> CHugeInteger&) <font color=blue>const</font>;
CHugeInteger& <font color=blue>operator</font> - (<font color=blue>const</font> CHugeInteger&) <font color=blue>const</font>;
CHugeInteger& <font color=blue>operator</font> * (<font color=blue>const</font> CHugeInteger&) <font color=blue>const</font>;
CHugeInteger& <font color=blue>operator</font> / (<font color=blue>const</font> CHugeInteger&) <font color=blue>const</font>;
CHugeInteger& <font color=blue>operator</font> % (<font color=blue>const</font> CHugeInteger&) <font color=blue>const</font>;
CHugeInteger& <font color=blue>operator</font> ^ (<font color=blue>const</font> CHugeInteger&) <font color=blue>const</font>;
CHugeInteger& <font color=blue>operator</font> = (<font color=blue>const</font> CHugeInteger&);
CHugeInteger& <font color=blue>operator</font> = (<font color=blue>const</font> CString&);
CHugeInteger& <font color=blue>operator</font> = (<font color=blue>int</font>);
};
...but that's just my humble point of view...
TOXCCT >>> GEII power [toxcct][VisualCalc]
-- modified at 12:30 Wednesday 2nd November, 2005
|
|
|
|
|
Yes I also first thought about that , but I think it will be slower than just calling the functions, maybe I am wrong.
But I would really do it so if i was developing a fully implemented class with operator overloading(+,-,/,%,*,^,..),casting,....
But in these case I just need these 4 functions.
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
nop, as maximilien said, writing code like this will not make the performance lower than just writing a simple function and wall it, because the compiler recognizes the call to an operator just as a member function. if you have this :
CHugeInteger i1 = 1, i2 = 2, i3;
i3 = i1 + i2
here, the compiler will traduce it like this :
i3.operator=(i1.operator+(i2));
and, this, will not lower you executing time !!!
moreover, such function call would be nothing compared to your treatment times !!!
TOXCCT >>> GEII power [toxcct][VisualCalc]
-- modified at 11:32 Wednesday 2nd November, 2005
|
|
|
|
|
Ok I'll try it ..
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
Giorgi Moniava wrote: The four public functions(add,mul,div,sub) were declared as friend functions.
How does declaring them as friend help performance? Declaring them inline is a reasonable decision, though it's still up to the compiler to honour your directive.
Whatever you do, don't forget to measure. First code for readability and intuitiviness, measure the performance and if it's not upto the mark, you can then worry about minor adjustments.
Regards
Senthil
_____________________________
My Blog | My Articles | WinMacro
|
|
|
|
|
S. Senthil Kumar wrote: How does declaring them as friend help performance
I did not say that...
S. Senthil Kumar wrote: First code for readability and intuitiviness, measure the performance and if it's not upto the mark, you can then worry about minor adjustments.
In this case my main point is performance.
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
Giorgi Moniava wrote: I did not say that...
It sure appears like you might have here.
In any case, the only way to know for sure is to try each method that you have a question about and measure it. In about as much time as it takes to post to this thread, you should have your answer.
"Take only what you need and leave the land as you found it." - Native American Proverb
|
|
|
|
|
DavidCrow wrote: In about as much time as it takes to post to this thread, you should have your answer.
Yep , you are right it took me really long to post this thread , now I regret that I posted
DavidCrow wrote: In any case, the only way to know for sure is to try each method
I'll do this
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
Giorgi Moniava wrote: now I regret that I posted
you regret it ???
i'm wonder why i'm still helping this forum...
TOXCCT >>> GEII power [toxcct][VisualCalc]
|
|
|
|
|
toxcct wrote: i'm wonder why i'm still helping this forum...
come on tox , you know this forum needs you
I meant that I should first try out all variants and then if did not get any results post the question , but I did it on the contrary.
That was what I regretted.
But thanks for your reply as I told you I will try what you suggested first.
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
ah, now you said it
have a good luck with that project sir.
ps: i may be interrested in it... is there any way to end it as an article ?
TOXCCT >>> GEII power [toxcct][VisualCalc]
|
|
|
|
|
toxcct wrote: ps: i may be interrested in it... is there any way to end it as an article ?
Yes there is , and maybe I will write down a fully implemented class for that with many methods and operator overloading and so on.
Tomorrow I am going to buy the book of D.Knuth so I hope to find there algorithms of implementing the arithmetic operations with high performance.
Because what I wrote till now were simple algorithms which came to my mind , but they were not bad
Anyway you will be first to know , if I write down this class.
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
Giorgi Moniava wrote: now I regret that I posted
Why ? you got good and polite answers ( IMHO )
Imagine that in fact there was a performance gain by using friends or static member functions, we all would have learned sometihng new today.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|