Thread overview
function ref param vs pointer param
Apr 24, 2015
ref2401
Apr 24, 2015
bearophile
Apr 24, 2015
ref2401
Apr 24, 2015
bearophile
Apr 24, 2015
Ali Çehreli
Apr 24, 2015
ref2401
April 24, 2015
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
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
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
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
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
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
Thank you