D - What does 'this' point to?
- Matthew (36/36) Apr 05 2005 I have enough confusion about the pass by reference or is it value conve...
- Benjamin Herr (24/27) Apr 05 2005 You are not printing the value of the this-ptr. You are printing its
- Matthew (6/33) Apr 05 2005 Thanks Benjamin that seems to help. I did realize that class objects ha...
- Walter (9/13) Apr 15 2005 conventions
I have enough confusion about the pass by reference or is it value conventions in D that I usually just pass my class or structs as inout parameters to mimic Java or C like behaviour. However I am in the midst of debugging a rather complex tree like data structure that uses a bit of recursion. I wanted to keep track of which class reference is pointing to which class. I thought I would simply print out the addresses of the class references and compare those with one another to see. The surprise I found was that the pointers were changing all the time. In fact the 'this' pointer changes when making a call from one function to another within the same class! Observe the following code snippet: // start code import std.file ; class Bigclass { int var = 0 ; void ptr1() { printf("In ptr1 var: %d this: %x\n", var, cast(uint) &this) ; } void ptr2() { var = 2 ; printf("In ptr2 var: %d this: %x\n", var,cast(uint) &this) ; ptr1() ; } } // end Bigclass int main(char[][] args) { Bigclass cl = new Bigclass() ; cl.ptr2() ; return(0) ; } // finish code The output is: In ptr2 var: 2 this: 12ff2c In ptr1 var: 2 this: 12ff10 Thus the address of the this reference has actually changed from one method call to another within the same class! This is going to make debugging pretty tricky I think. Any comments on this behavior?
Apr 05 2005
Matthew wrote:In fact the 'this' pointer changes when making a call from one function to another within the same class! Observe the following code snippet:printf("In ptr1 var: %d this: %x\n", var, cast(uint) &this) ;You are not printing the value of the this-ptr. You are printing its location on the stack. #class Foo { #int main() { printf("%p\n", this) should do what you want. Object references seem to be actually pointers. --Benjamin
Apr 05 2005
In article <d2ufpj$2dhd$1 digitaldaemon.com>, Benjamin Herr says...Matthew wrote:Thanks Benjamin that seems to help. I did realize that class objects had to be pointer references, otherwise the performance of some recursive data structures such as trees or graphs would be abysmal, when in fact I get very good performance, even better than C in some cases. RegardsIn fact the 'this' pointer changes when making a call from one function to another within the same class! Observe the following code snippet:printf("In ptr1 var: %d this: %x\n", var, cast(uint) &this) ;You are not printing the value of the this-ptr. You are printing its location on the stack. #class Foo { #int main() { printf("%p\n", this) should do what you want. Object references seem to be actually pointers. --Benjamin
Apr 05 2005
"Matthew" <Matthew_member pathlink.com> wrote in message news:d2ucb2$2966$1 digitaldaemon.com...I have enough confusion about the pass by reference or is it valueconventionsThus the address of the this reference has actually changed from onemethodcall to another within the same class! This is going to make debuggingprettytricky I think. Any comments on this behavior?You're printing the address of 'this', not the value of 'this'. 'this' is implemented as a local variable in each method. 'this' is implemented as a pointer to the instance, as it is in C++. Try your program in C++, you'll find the results are the same.
Apr 15 2005