2011-08-13 14 views
5

Estoy en proceso de crear mi primera aplicación C++ y elegir una biblioteca C++ eficiente en la que confiar en esta etapa, es una de las consideraciones de diseño que estoy considerando.¿Cuál es eficiente, itoa o sprintf?

En consecuencia, quiero convertir un tipo entero en cadena y decidir si usar;

sprintf(string, "%d", x); 

O

entero a ASCI

itoa(x, string); 

Puede alguien sugerir cuál de estos ruta es eficiente y, posiblemente, por qué?

Gracias.

+5

¿Qué pasa con 'istringstream' o' boost :: lexical_cast'? Es C++ después de todo. – pmr

+3

¿Será el formato entero realmente el cuello de botella de su aplicación? –

+1

@Kerrek SB Cada pequeño conteo en esta etapa. – Bitmap

Respuesta

10

No utilice ninguno de estos. Use std::stringstream y así sucesivamente.

std::stringstream ss; 
ss << x; 
ss.str(); // Access the std::string 

De cualquier manera, es muy poco probable que la conversión a cadena será una parte significativa del tiempo de ejecución de la aplicación.

+0

Downvoter: ¿me gustaría comentar? –

+0

No soy yo, pero creo que el voto negativo podría deberse a que esta respuesta no responde a la pregunta original. – legends2k

+1

'stringstream' es extremadamente lento, esto podría ser una parte importante en ALGUNAS aplicaciones (en el comercio de HFT, por ejemplo), y tampoco permite convertir al búfer' char * 'existente. – javapowered

14

Ambos son eficientes. Probablemente sea mucho más relevante observar que itoa() no es parte del estándar C++, y como tal no está disponible en muchos tiempos de ejecución comunes. (En particular, no es parte de libstdc++, por lo que no está disponible en Mac OS X o Linux.)

0

Desde el punto de vista del algoritmo puro se puede argumentar que itoa sería más rápido ya que sprintf tiene el costo adicional de analizar la cadena del descriptor de formato. Sin embargo, sin una evaluación comparativa del costo de las dos funciones en una implementación, con una carga de trabajo no trivial, no se puede estar seguro.

También esto no es una comparación de manzanas a manzanas ya que ambas funciones no son equivalentes. sprintf puede hacer mucho más formateo que itoa, aparte del hecho de que el primero es una función estándar mientras que el segundo no.

Aparte: Si puede utilizar C++ 11 puede utilizar to_string que devuelve un std::string. Si desea representaciones que no sean decimales, puede hacer esto:

int i = 1234; 
std::stringstream ss; 
ss << std::hex << i;  // hexadecimal 
ss << std::oct << i;  // octal 
ss << std::dec << i;  // decimal 

std::bitset<sizeof(int) * std::numeric_limits<unsigned char>::digits> b(i); 
ss << b;     // binary 

std::string str = ss.str(); 
Cuestiones relacionadas