in, out and inout for function arguments

Derek Parnell derek at psyc.ward
Thu Oct 12 03:42:08 PDT 2006


On Thu, 12 Oct 2006 08:46:32 +0000 (UTC), SKS wrote:

> I have a program:
> import std.file;
> 
> public static void foo(in int i, out int o, inout int io)
> {
> 	i++; o--; io++;
> 	printf("foo %d, %d, %d\n", i, o, io);
> }
> 
> int main (char[][] args)
> {
> 	int i1 = 1, i2 = 123, i3 = 234;
> 	printf("before foo %d, %d, %d\n", i1, i2, i3);
> 	foo(i1, i2, i3);
> 	printf("after foo %d, %d, %d\n", i1, i2, i3);
> 	return 0;
> }
> 
> Why this compiles successfully with dmd compiler?
> I expect 'out' parameter modification to cause error. Is it a bug in compiler
> implementation or wrong usage?

No it is not a bug. The 'out' qualifier causes the argument to be set to
the datatype's .init value before the function gets control. The 'inout'
qualifier allows the value of the argument to passed to the function by the
caller, just like 'in' does. Once the function gets control, it can modify
the passed arguments as much as it likes, but only changes to 'in' and
'inout' arguments get fed back to the calling code.
 
> Also looking at sample programs I don't find in/out usage as common?

That's because it is better to limit cohesion between caller and called
code. The use of 'in' and 'out' reduces the possibility of side-effects
that are unknown to the caller and reduces the need for the called function
to be responsible for changes to data it doesn't own.

When 'inout' is used, it is usually as a compromise to improve performance.
For example, it can be a performance cost to copy large structs or
fixed-length arrays betwen functions, and 'inout' is a way to avoid that.

-- 
Derek Parnell
Melbourne, Australia
"Down with mediocrity!"



More information about the Digitalmars-d mailing list