Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
April 24, 2015 function ref param vs pointer param | ||||
---|---|---|---|---|
| ||||
What advantages do ref params give over pointer params? struct MyStruct { string str; this(string str) { this.str = str; } } void processRef(ref MyStruct ms) { writeln("processRef: ", ms); } void processPointer(MyStruct* ms) { writeln("processPointer: ", *ms); } void main(string[] args) { auto ms = MyStruct("the ultimate answer to everythin is the number 42"); processRef(ms); processPointer(&ms); } |
April 24, 2015 Re: function ref param vs pointer param | ||||
---|---|---|---|---|
| ||||
Posted in reply to ref2401 | ref2401:
> void processRef(ref MyStruct ms) {
> writeln("processRef: ", ms);
> }
>
> void processPointer(MyStruct* ms) {
> writeln("processPointer: ", *ms);
ref params don't need the "*" every time you use them inside the function, and don't need the "&" when you call the function.
Bye,
bearophile
|
April 24, 2015 Re: function ref param vs pointer param | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | processPointer(&ms); I think doing this way is more descriptive. Now all readers know that ms might be changed inside the function. |
April 24, 2015 Re: function ref param vs pointer param | ||||
---|---|---|---|---|
| ||||
Posted in reply to ref2401 | On Friday, 24 April 2015 at 13:39:35 UTC, ref2401 wrote:
> processPointer(&ms);
> I think doing this way is more descriptive.
> Now all readers know that ms might be changed inside the function.
C# avoids that problem requiring (in most cases) the usage of "ref" at the calling point too. But this idea was refused for D (also because it goes against UFCS chains).
Bye,
bearophile
|
April 24, 2015 Re: function ref param vs pointer param | ||||
---|---|---|---|---|
| ||||
Posted in reply to ref2401 | On 4/24/15 9:23 AM, ref2401 wrote:
> What advantages do ref params give over pointer params?
>
> struct MyStruct {
> string str;
>
> this(string str) { this.str = str; }
> }
>
> void processRef(ref MyStruct ms) {
> writeln("processRef: ", ms);
> }
>
> void processPointer(MyStruct* ms) {
> writeln("processPointer: ", *ms);
> }
>
> void main(string[] args) {
> auto ms = MyStruct("the ultimate answer to everythin is the number
> 42");
>
> processRef(ms);
> processPointer(&ms);
> }
A ref param is somewhat safer, because you cannot do pointer arithmetic on it. A ref will ALWAYS point at the same memory location, because it cannot be rebound.
The compiler can also take advantage of the characteristics of ref, as it does with the -dip25 switch.
-Steve
|
April 24, 2015 Re: function ref param vs pointer param | ||||
---|---|---|---|---|
| ||||
Posted in reply to ref2401 | On 04/24/2015 06:23 AM, ref2401 wrote: > What advantages do ref params give over pointer params? Another difference is that a ref parameter is not null and what is referred to is not an rvalue. However, it is possible to break that expectation if a pointer is dereferenced and passed to a ref-taking function but then the actual object is gone before the reference is used. Ali |
April 24, 2015 Re: function ref param vs pointer param | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Thank you |
Copyright © 1999-2021 by the D Language Foundation