C # optimizar operadores sobrecarregados
Pergunta
Voltando um novo objeto de operadores sobrecarregados parece ser a única coisa a fazer. Certo?
- Se você tem uma classe (X) que contém um grande buffer
- Parte do buffer contém conteúdo, o descanso é livre.
- ter sobrecarregado o operador + binário para fundir dois objectos (do mesmo tipo) com a criação de um novo objecto que contém os conteúdos de ambos os operandos anexas.
Em outras palavras:
z = x + y // z is a new object containing the appended data from x and y.
Esta é obviamente bom porque nós não queremos mangle x ou y durante a operação. No entanto, C # linguagem especificações 7.2.2 digamos:
Quando um operador binário está sobrecarregado, o operador de atribuição correspondente (se houver) é também sobrecarregada implicitamente.
Isto significa que:
x += y; // will create a new x, copy contents of old x merged with y
// and the old x will be garbage collected at some point
Esta é doloroso, porque ele pode ser muito mais rápido para apenas copiar o conteúdo de y na porção livre de x. Dessa forma, não copie um objeto grande e deixar uma bagunça para a pessoa agradável coletor de lixo.
Eu percebo que isso poderia ser feito com um simples x.Add (y). Estou curioso para saber se há uma maneira de fazê-lo usando operadores. por exemplo, para descobrir o que está dentro do operador de atribuição e executar a rotina otimizada.
Solução
Eu, pessoalmente, gosto de como C # implementado este.
É mais "óbvio" que:
x += y;
e
x = x + y;
deve ter o mesmo comportamento. Em C #, esta é aplicada. Com sobrecargas separadas, as pessoas poderiam abusar do operador e evitar que isso agindo da mesma.
A diferença perf será tão mínima, e isso também faz com que seja mais fácil de implementar e manter, por isso prefiro fortemente a abordagem C #.
Outras dicas
Todos os operadores binários matemáticas retorna um novo objeto. Por exemplo. Você não gostaria que 2 + 3 para alterar o valor de um deles a cinco só porque você estava adicionando-os. Em outras palavras a semântica dos operadores em questão é muito clara e executada através das especificações. Se você quiser algo diferente, você terá que fazer algo diferente :). E eu pessoalmente como se comparar com c ++ onde você pode fazer a sobrecarga tal a A = B = C pode resultar em C sendo excluído, B sendo unassigned e A igualando qualquer valor sem que diz respeito à C ou B