Avatar
omochimetaru 4/27/2017 3:47 AM
protocol Fugable { typealias Element func fug() -> Element } func callIntFugableFuga<F: Fugable where F.Element == Int>(fugable: F) -> Int { return fugable.fuga() } ↑一方こういうのがあるとき、LLVM IR だと↓こうなる define hidden i64 @_TF4main18callIntFugableFugauRq_S_7Fugablezqq_S0_7ElementSi_Fq_Si(%swift.opaque* noalias nocapture, %swift.type* %F, i8** %F.Fugable) #1 { Existentialがないけど、結局、引数として x, wt, xt が並んでる。 (edited)
3:49 AM
あ〜たしかに
3:49 AM
xのサイズが24バイトを超えるかどうかとかで
3:49 AM
直接ペイロードがコピーされてるか 、ポインタ渡しになっているかとかが変わるので
3:49 AM
そこらへんの分岐が、SILのopen_existential_addrがLLVMになる時に
3:49 AM
直接のアドレス操作バイナリにコンパイルされる感じだけど
3:50 AM
間接の場合は引数渡しより遅くなりうるかも??
3:51 AM
あ、でも引数にバラける場合は常にopaqueポインタ渡しになるから、それと同じなのかな、うーん、わからない。