Fun with pointers in C++
-
what about:
int* a;
int* b;
if ((a = GetA()) && (b = GetB()))
{
*a = *b;
}#SupportHeForShe
If your actions inspire others to dream more, learn more, do more and become more, you are a leader.-John Q. Adams You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun Only 2 things are infinite, the universe and human stupidity, and I'm not sure about the former.-Albert Einstein
That does work, but
if (a = GetA()) ...
is too easy to mistake for
if (a == GetA()) ...
Which is why I never leave the comparison implied, so we get:
if ((a = GetA()) != NULL && (b = GetB()) != NULL)
which is rather unwieldy. And for what purpose? The longer version I posted will produce the exact same object code.
Truth, James
-
That does work, but
if (a = GetA()) ...
is too easy to mistake for
if (a == GetA()) ...
Which is why I never leave the comparison implied, so we get:
if ((a = GetA()) != NULL && (b = GetB()) != NULL)
which is rather unwieldy. And for what purpose? The longer version I posted will produce the exact same object code.
Truth, James
James Curran wrote:
The longer version I posted will produce the exact same object code.
Will it? The version you and I just discussed has the advantage of short-circuiting, where the first version you posted does not. Which is a "limitation" you pointed-out.
#SupportHeForShe
If your actions inspire others to dream more, learn more, do more and become more, you are a leader.-John Q. Adams You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun Only 2 things are infinite, the universe and human stupidity, and I'm not sure about the former.-Albert Einstein
-
James Curran wrote:
The longer version I posted will produce the exact same object code.
Will it? The version you and I just discussed has the advantage of short-circuiting, where the first version you posted does not. Which is a "limitation" you pointed-out.
#SupportHeForShe
If your actions inspire others to dream more, learn more, do more and become more, you are a leader.-John Q. Adams You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun Only 2 things are infinite, the universe and human stupidity, and I'm not sure about the former.-Albert Einstein
I was referring to the second version I posted (i.e., "the longer version", the one with nested if()s). And that does produce identical object code. From VisualStudio 2013, Release build: Mine:
; 21 : void Method2()
; 22 : {
; 23 : A* pa = GetA();00023 e8 00 00 00 00 call ?GetA@@YAPAHXZ ; GetA
00028 8b f0 mov esi, eax; 24 : if (pa != NULL)
0002a 85 f6 test esi, esi
0002c 74 0d je SHORT $LN6@wmain; 25 : {
; 26 : B* pb = GetB();0002e e8 00 00 00 00 call ?GetB@@YAPAHXZ ; GetB
; 27 : if (pb != NULL)
00033 85 c0 test eax, eax
00035 74 04 je SHORT $LN6@wmain; 28 : *pa = *pb;
00037 8b 08 mov ecx, DWORD PTR [eax]
00039 89 0e mov DWORD PTR [esi], ecx
$LN6@wmain:; 29 : }
; 30 : }and yours:
; 32 : void Method3()
; 33 : {
; 34 : A* a;
; 35 : B* b;
; 36 : if ((a = GetA()) && (b = GetB()))0003b e8 00 00 00 00 call ?GetA@@YAPAHXZ ; GetA
00040 8b f0 mov esi, eax
00042 85 f6 test esi, esi
00044 74 0d je SHORT $LN13@wmain
00046 e8 00 00 00 00 call ?GetB@@YAPAHXZ ; GetB
0004b 85 c0 test eax, eax
0004d 74 04 je SHORT $LN13@wmain; 37 : {
; 38 : *a = *b;0004f 8b 08 mov ecx, DWORD PTR [eax]
00051 89 0e mov DWORD PTR [esi], ecx
$LN13@wmain:That's with all standard "Release mode" optimizations on, except "Whole Program Optimization" (to prevent it from inlining GetA & GetB)
Truth, James
-
I was referring to the second version I posted (i.e., "the longer version", the one with nested if()s). And that does produce identical object code. From VisualStudio 2013, Release build: Mine:
; 21 : void Method2()
; 22 : {
; 23 : A* pa = GetA();00023 e8 00 00 00 00 call ?GetA@@YAPAHXZ ; GetA
00028 8b f0 mov esi, eax; 24 : if (pa != NULL)
0002a 85 f6 test esi, esi
0002c 74 0d je SHORT $LN6@wmain; 25 : {
; 26 : B* pb = GetB();0002e e8 00 00 00 00 call ?GetB@@YAPAHXZ ; GetB
; 27 : if (pb != NULL)
00033 85 c0 test eax, eax
00035 74 04 je SHORT $LN6@wmain; 28 : *pa = *pb;
00037 8b 08 mov ecx, DWORD PTR [eax]
00039 89 0e mov DWORD PTR [esi], ecx
$LN6@wmain:; 29 : }
; 30 : }and yours:
; 32 : void Method3()
; 33 : {
; 34 : A* a;
; 35 : B* b;
; 36 : if ((a = GetA()) && (b = GetB()))0003b e8 00 00 00 00 call ?GetA@@YAPAHXZ ; GetA
00040 8b f0 mov esi, eax
00042 85 f6 test esi, esi
00044 74 0d je SHORT $LN13@wmain
00046 e8 00 00 00 00 call ?GetB@@YAPAHXZ ; GetB
0004b 85 c0 test eax, eax
0004d 74 04 je SHORT $LN13@wmain; 37 : {
; 38 : *a = *b;0004f 8b 08 mov ecx, DWORD PTR [eax]
00051 89 0e mov DWORD PTR [esi], ecx
$LN13@wmain:That's with all standard "Release mode" optimizations on, except "Whole Program Optimization" (to prevent it from inlining GetA & GetB)
Truth, James
Interesting. Thanks.
#SupportHeForShe
If your actions inspire others to dream more, learn more, do more and become more, you are a leader.-John Q. Adams You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun Only 2 things are infinite, the universe and human stupidity, and I'm not sure about the former.-Albert Einstein
-
C3D1 wrote:
Returning references would make it much harder to read
We'll just have to agree to disagree on that. IMO, this is a quite useful C++ paradigm.
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill
-
Daniel Pfeffer wrote:
IMO, this is a quite useful C++ paradigm.
...and that makes me even happier to barely being able to read C++ :laugh:
De gustibus non est disputandum :)
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill
-
De gustibus non est disputandum :)
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill
-
That's what I like about this forum. You go in thinking programming and you get a bit of Latin training. Hope I remember what the phrase means next time I see it.
Me too. There are plenty of sites around that merely answer programming questions, but only a few with the range of highly intelligent, humorous, and opinionated contributors that you find here. Amazingly, the amount of sniping and backbiting is kept to a minimum! Long may it last!
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill
-
Me too. There are plenty of sites around that merely answer programming questions, but only a few with the range of highly intelligent, humorous, and opinionated contributors that you find here. Amazingly, the amount of sniping and backbiting is kept to a minimum! Long may it last!
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill
-
Me too. There are plenty of sites around that merely answer programming questions, but only a few with the range of highly intelligent, humorous, and opinionated contributors that you find here. Amazingly, the amount of sniping and backbiting is kept to a minimum! Long may it last!
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill
-
In two hours you can have a great lunch, jogging, some fun with your partner, some nice song listening/playing and also a shower. All that cannot be done because the language is cryptic: that's why I hate C/C++! Good post, though...
Mario Vernari wrote:
that's why I hate C/C++!
Yea, I kind of agree with that sentiment, however, I have yet to run across the language that will supply me with a great lunch, but I do admit to sometimes having fun with it. (Does that mean I'm cheating on my partner?)
-
In two hours you can have a great lunch, jogging, some fun with your partner, some nice song listening/playing and also a shower. All that cannot be done because the language is cryptic: that's why I hate C/C++! Good post, though...
Mario Vernari wrote:
that's why I hate C/C++!
Yea, I kind of agree with that sentiment, however, I have yet to run across the language that will supply me with a great lunch, but I do admit to sometimes having fun with it. (Not C++ and does that mean I'm cheating on my partner?)
-
De gustibus non est disputandum :)
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill
Daniel Pfeffer wrote:
De gustibus non est disputandum :)
I.e. C++ is the Durian (stinkfruit) in Software Development.
-
C3D1 wrote:
Returning references would make it much harder to read
We'll just have to agree to disagree on that. IMO, this is a quite useful C++ paradigm.
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill
I agree, but I definitely would not name such a function "GetA".
"If you don't fail at least 90 percent of the time, you're not aiming high enough." Alan Kay.
-
Sorry, that's not my code, an i cant change it. I just saw it in some code and where surprised what's that :D Returning references would make it much harder to read:
GetA() = GetB()
looks like What the hell? Assignment to a Function? :omg: :wtf:
You can't read C++ code without knowing the types. Who knows if equals was overridden, everything could happen. Even then you should read, GetA() return something, then operator = is called on this something.