abi_comparison.dhover×77all
// Compare ABI codegen: normal vs NamedOnly sentinel
// Compile with: ldc2 -O2 -release -output-s abi_comparison.d
//
// Finding: free-function sentinel is zero-overhead (identical asm).
// Struct-field sentinel adds sizeof/alignment overhead (1 byte + padding).

private struct 
(struct) abi_comparison.NamedOnly
NamedOnly
{}
struct
(struct) abi_comparison.Rect
Rect
{ int
(field) int abi_comparison.Rect.x
x
,
(field) int abi_comparison.Rect.y
y
,
(field) int abi_comparison.Rect.width
width
,
(field) int abi_comparison.Rect.height
height
;
} // NamedOnly is 1 byte => 4 bytes with alignment padding before the first int. // RectNamed.sizeof == 20, Rect.sizeof == 16. struct
(struct) abi_comparison.RectNamed
RectNamed
{
(struct) abi_comparison.NamedOnly
NamedOnly
(field) abi_comparison.NamedOnly abi_comparison.RectNamed._
_
=
(struct) abi_comparison.NamedOnly
NamedOnly
.
(constant) abi_comparison.NamedOnly abi_comparison.NamedOnly.init = NamedOnly()
init
;
int
(field) int abi_comparison.RectNamed.x
x
,
(field) int abi_comparison.RectNamed.y
y
,
(field) int abi_comparison.RectNamed.width
width
,
(field) int abi_comparison.RectNamed.height
height
;
} pragma(msg, "NamedOnly.sizeof = ", NamedOnly.sizeof); pragma(msg, "Rect.sizeof = ", Rect.sizeof); pragma(msg, "RectNamed.sizeof = ", RectNamed.sizeof); // --- Free functions: zero overhead --- export
(struct) abi_comparison.Rect
Rect
abi_comparison.Rect abi_comparison.withSentinel(abi_comparison.NamedOnly _ = NamedOnly(), int x = 0, int y = 0, int width = 0, int height = 0, int margin = 0)
withSentinel
(
(struct) abi_comparison.NamedOnly
NamedOnly
(parameter) abi_comparison.NamedOnly _
_
=
(struct) abi_comparison.NamedOnly
NamedOnly
.
(constant) abi_comparison.NamedOnly abi_comparison.NamedOnly.init = NamedOnly()
init
,
int
(parameter) int x
x
= 0, int
(parameter) int y
y
= 0, int
(parameter) int width
width
= 0, int
(parameter) int height
height
= 0, int
(parameter) int margin
margin
= 0,
) { return
(struct) abi_comparison.Rect
Rect
(
(parameter) int x
x
-
(parameter) int margin
margin
,
(parameter) int y
y
-
(parameter) int margin
margin
,
(parameter) int width
width
+ 2 *
(parameter) int margin
margin
,
(parameter) int height
height
+ 2 *
(parameter) int margin
margin
);
} export
(struct) abi_comparison.Rect
Rect
abi_comparison.Rect abi_comparison.withoutSentinel(int x, int y, int width, int height, int margin)
withoutSentinel
(int
(parameter) int x
x
, int
(parameter) int y
y
, int
(parameter) int width
width
, int
(parameter) int height
height
, int
(parameter) int margin
margin
)
{ return
(struct) abi_comparison.Rect
Rect
(
(parameter) int x
x
-
(parameter) int margin
margin
,
(parameter) int y
y
-
(parameter) int margin
margin
,
(parameter) int width
width
+ 2 *
(parameter) int margin
margin
,
(parameter) int height
height
+ 2 *
(parameter) int margin
margin
);
} // --- Call sites --- export
(struct) abi_comparison.Rect
Rect
abi_comparison.Rect abi_comparison.callSentinel(int x, int y, int w, int h, int m)
callSentinel
(int
(parameter) int x
x
, int
(parameter) int y
y
, int
(parameter) int w
w
, int
(parameter) int h
h
, int
(parameter) int m
m
)
{ return
abi_comparison.Rect abi_comparison.withSentinel(abi_comparison.NamedOnly _ = NamedOnly(), int x = 0, int y = 0, int width = 0, int height = 0, int margin = 0)
withSentinel
(x:
(parameter) int x
x
, y:
(parameter) int y
y
, width:
(parameter) int w
w
, height:
(parameter) int h
h
, margin:
(parameter) int m
m
);
} export
(struct) abi_comparison.Rect
Rect
abi_comparison.Rect abi_comparison.callPlain(int x, int y, int w, int h, int m)
callPlain
(int
(parameter) int x
x
, int
(parameter) int y
y
, int
(parameter) int w
w
, int
(parameter) int h
h
, int
(parameter) int m
m
)
{ return
abi_comparison.Rect abi_comparison.withoutSentinel(int x, int y, int width, int height, int margin)
withoutSentinel
(
(parameter) int x
x
,
(parameter) int y
y
,
(parameter) int w
w
,
(parameter) int h
h
,
(parameter) int m
m
);
}