2010-11-13 23 views
14

En el momento 0:43:15 en este Tech-Talk about D, se describe la implementación de la función min. Las preocupaciones sobre "estabilidad" y "mezcla adicional (si los valores son iguales)" cuando se usa en algún algoritmo (s) se propone como una de las razones para la implementación mostrada.Implementación correcta de min

¿Alguien puede proporcionar un caso de uso real/práctico (o proporcionar una explicación más detallada) donde esta implementación específica de min es "estable" (mejor) en comparación con su otra posible implementación? ¿O es solo otro ejemplo de alfa-geeks yendo demasiado lejos?

aplicación recomendada:

template <class LHS, class RHS, class Return> 
inline Return min(LHS& lhs, RHS& rhs) 
{ 
    return (rhs < lhs) ? rhs : lhs; 
} 

Otra posible aplicación:

template <class LHS, class RHS, class Return> 
inline Return min(LHS& lhs, RHS& rhs) 
{ 
    return (lhs < rhs) ? lhs: rhs; 
} 

Propuesta N2199 proporciona implementaciones que se basan en este último, tenga en cuenta que la propuesta no tuvo éxito en este momento.

Otras propuestas relacionadas con mínimo/máximo son N1840, N2485 y N2551

+6

No lo entiendo. No veo ninguna ventaja para una de las implementaciones que muestra. En algún momento, uno de ellos debe ser elegido ... –

+1

Me resulta muy entretenido cómo una pregunta de enfoque muy limitado y aplicabilidad limitada se califica extremadamente alta cuando se trata de una cuestión de enfoque muy amplio y aplicable a casi todo el mundo 'off- tema'. Sé que en la programación los detalles pueden ser extremadamente importantes. Pero esta es muy estrechamente importante y nunca dependería de la estabilidad de min para ser correcto en el código que escribí de todos modos porque es un detalle demasiado pequeño para depender de que alguien acierte. – Omnifarious

+5

@Omnifarious: Creo que ha entendido mal el tema, no se trata de algo trivial, sino más bien de un problema que ha estado persiguiendo a C++ durante los últimos 10 años, pero para seguir adelante, uno de los expertos mundiales en el lenguaje y algunas personas en una organización un poco prestigiosa como Google, han hecho un comentario, y lo han hecho sonar tan normal y "de hecho" cuando la mayoría en la industria estaría de acuerdo con lo contrario, que uno no puede evitar preguntarse si este es otro Kepler o La situación de Galileo de llamar al mundo ... lo más probable es que todo sea una tontería, pero ¿por qué no discutirlo? –

Respuesta

35

En este caso, estoy bastante seguro de "estable" se está refiriendo a estable, ya que está aplicado en la clasificación - es decir, que cuando/si dos elementos son iguales, permanecen ordenados en el mismo orden que tenían para empezar. Para lograr eso, desea devolver lhs cuando es menor o igual a rhs - pero en C++ usted (normalmente) desea hacer eso usando solo operator<, sin depender de tener operator<=.

-3

En general, no hay ninguna ventaja para una implementación sobre la otra. Si está implementando min para un uso específico, puede tener sentido elegir uno de los formularios en función de los datos a los que se aplicará para aprovechar al máximo las predicciones de bifurcación.

Si para la mayoría de los casos de uso el mínimo esperado es rhs, elija la primera implementación. Si es lhs, elija la segunda implementación.

+0

La predicción de ramas puede predecir los falsos de manera útil como trues. – Puppy