level 1
黄金止手
楼主
operator := (x:TypeA) y:TypeB;
这里整个子程序被实现成 function 而非 procedure,y是函数返回值,而非赋值号左边变量的引用。
假设 TypeB 变量的大小很大或赋值次数很多,那么这种实现会造成不小的效率下降,效率正常的形式是
procedure SetFrom(var y:TypeB; const x:TypeA);
同样 inc 和 dec 运算符亦有此问题。
FP 甚至有这两者的返回值与首个参数类型不相同也能编译的 bug 。准确来说,假如使用了这个运算符,且返回值不能赋值给首个参数,才会编译错误。
简而言之, OI 里拿 Pascal 的重载运算符写高精度会有一定的效率牺牲。
但用 C++ 的话问题不大,甚至可以认为对效率没有影响。
Pascal (FP?) 的这种运算符重载更像是为引用类型打造的,使用于值类型(当 size 很大)时需要谨慎。
2016年09月04日 12点09分
1
这里整个子程序被实现成 function 而非 procedure,y是函数返回值,而非赋值号左边变量的引用。
假设 TypeB 变量的大小很大或赋值次数很多,那么这种实现会造成不小的效率下降,效率正常的形式是
procedure SetFrom(var y:TypeB; const x:TypeA);
同样 inc 和 dec 运算符亦有此问题。
FP 甚至有这两者的返回值与首个参数类型不相同也能编译的 bug 。准确来说,假如使用了这个运算符,且返回值不能赋值给首个参数,才会编译错误。
简而言之, OI 里拿 Pascal 的重载运算符写高精度会有一定的效率牺牲。
但用 C++ 的话问题不大,甚至可以认为对效率没有影响。
Pascal (FP?) 的这种运算符重载更像是为引用类型打造的,使用于值类型(当 size 很大)时需要谨慎。