Сравнить Код фрагментов A:D неявно Vector (T) типов
struct Vector2(T) {
// ...
auto opCast(U)() {
return U(x, y);
}
void opOpAssign(string op)(Vector2 vector) {
mixin ("x" ~ op ~ "= vector.x;");
mixin ("y" ~ op ~ "= vector.y;");
}
}
void main() {
auto fVec = Vector2!float(1.5, 1.5);
auto dVec = Vector2!double(1.5, 1.5);
// Benchmark: Loop following 10 million times.
fVec += cast(Vector2!float) dVec;
dVec -= cast(Vector2!double) fVec;
}
с B:
struct Vector2(T) {
// ...
void opOpAssign(string op, U)(Vector2!U vector) {
mixin ("x" ~ op ~ "= vector.x;");
mixin ("y" ~ op ~ "= vector.y;");
}
}
void main() {
auto fVec = Vector2!float(1.5, 1.5);
auto dVec = Vector2!double(1.5, 1.5);
// Benchmark: Same as A.
fVec += dVec;
dVec -= fVec;
}
В моих тестах (DMD, Win7), А является ~ 50мс быстрее, чем B. Почему это так? Если A быстрее, я хотел бы использовать его, но я не могу получить Vector2! Double, чтобы неявно использовать float Vector2! Независимо от того, что я пытаюсь. Любая идея о том, как я могу косвенно использовать эти типы? Или есть некоторые аргументы в пользу того, почему я не должен имплицитно их бросать?
Я настраиваю GDC и LDC, чтобы выполнить этот тест с этими компиляторами, но кто-нибудь знает, если это проблема оптимизации только для DMD?
Конечно, но я не могу неявно отбрасывать из Vector2! Float в Vector2! Double. –
, затем добавьте 'opAssign (F) (Vector2! F l), если (isImplicitlyConvertible (F, T)) {x = l.x; y = l.y;}' –