2012-09-04 19 views
6

Asistí a una sesión en la que se enseñaba que no deberíamos usar "using namespace std", sino "std :: cout" para usar alguna llamada del espacio de nombres std como this aumentará el tamaño del código binariola inclusión del espacio de nombres aumenta el tamaño de exe

He intentado verificar lo mismo con el siguiente experimento. El código & su salida es la siguiente: -

[[email protected]]$ cat namespacestd.cpp 
    #include<iostream> 

    #ifdef STD 
      using namespace std; 
    #endif 

    int main() 
    { 
    #ifndef STD 
      std::cout<<"\n ==> Workign \n"; 
    #else 
      cout<<"\n ==> Workign \n"; 
    #endif 

    return 0; 

    } 


    [[email protected]]$ time g++ -c namespacestd.cpp -DSTD 

    real 0m0.246s 
    user 0m0.215s 
    sys  0m0.030s 
    [[email protected]]$ size namespacestd.o 
     text data  bss  dec  hex filename 
     310  8  1  319  13f namespacestd.o 
    [[email protected]]$ time g++ -c namespacestd.cpp 

    real 0m0.258s 
    user 0m0.224s 
    sys  0m0.034s 
    [[email protected]]$ size namespacestd.o 
     text data  bss  dec  hex filename 
     310  8  1  319  13f namespacestd.o 

    [[email protected]]$ time g++ -o namespacestd namespacestd.cpp -DSTD 

    real 0m0.293s 
    user 0m0.251s 
    sys  0m0.042s 
    [[email protected]]$ size namespacestd 
     text data  bss  dec  hex filename 
     1980  580  288 2848  b20 namespacestd 
    [[email protected]]$ time g++ -o namespacestd namespacestd.cpp 

    real 0m0.274s 
    user 0m0.239s 
    sys  0m0.035s 
    [[email protected]]$ size namespacestd 
     text data  bss  dec  hex filename 
     1980  580  288 2848  b20 namespacestd 
    [[email protected]]$ 

mi punto de vista de mi experimento que

no hay ningún efecto en el tamaño del binario

única

hay una diferencia en el tiempo de compilación.

favor corríjanme si mis conclusiones son erróneas

Gracias

+0

Podría haber diferencias en el tiempo de compilación (como en, el 'using' podría causar más trabajo), pero es muy teórico ... –

+0

No me gustaría prestar mucha atención a la diferencia en el tiempo de compilación, a menos ensayos repetidos muestran una diferencia consistente. 'g ++' golpeará al menos unas pocas docenas de archivos para compilar ese programa, y ​​los tiempos pueden variar. –

+0

Acepto que el tiempo de compilación es irrelevante – Fooo

Respuesta

3

usando namespace std no debe afectar al tamaño binario con la mayoría de los compiladores. Todavía debe evitarse por otro motivo:

El espacio de nombres estándar es realmente grande. Hay literalmente miles de identificadores que están dentro del alcance de su programa. Esto aumenta la probabilidad de colisiones con sus propios identificadores o identificadores de otras bibliotecas que pueden causar algunas sorpresas desagradables.

Ver también esta pregunta relacionada: Why is "using namespace std" considered bad practice?

2

no hay ningún efecto en el tamaño del binario

No debería haber ninguna diferencia para el código ejecutable y los datos, ya que en ambos casos está haciendo lo mismo con el mismo objeto, y el proceso de búsqueda para encontrar ese objeto a partir de su nombre ocurre durante la compilación. Sin embargo, es posible que, en algunas circunstancias, generen diferentes cantidades de metadatos, como información de depuración.

hay una diferencia en el tiempo de compilación

Cualquier cambio a la fuente potencialmente podría cambiar el tiempo de compilación, pero no se han presentado datos suficientes para determinar si la diferencia es estadísticamente significativa. Debería repetir el experimento varias veces para cada configuración, calcular la media y la varianza de las dos muestras y aplicar una prueba de significación a la diferencia de medias.

En cualquier caso, incluso si determina que la contaminación del espacio de nombres global hace la compilación fraccionalmente más rápida, cualquier tiempo ahorrado será pequeño en comparación con el tiempo potencialmente perdido rastreando las colisiones de nombres. Hay muchos nombres en el espacio de nombres std, muchos de los cuales es posible que desee utilizar en su propio código. Esa es la razón para evitar la contaminación del espacio de nombres; cualquiera que afirme que afectará el tamaño del binario no entiende completamente de qué están hablando.

2

Los binarios no son lo mismo, porque en uno tienes una STD definida, y en otra no. También recibo diferentes tamaños.

Sin embargo, si tiene strip símbolos, obtendrá binarios casi idénticos (lo que es diferente son algunos parámetros de encabezado ELF, como el tiempo de compilación).

Si cambia ejemplo de esto:

#include<iostream> 

    using namespace std; 


    int main() 
    { 
    #if 0 
      std::cout<<"\n ==> Workign \n"; 
    #else 
      cout<<"\n ==> Workign \n"; 
    #endif 

    return 0; 

    } 

y luego se compila con #if 1 y #if 0, que se van a poner los binarios del mismo tamaño, incluso sin símbolos de trazado de líneas.

La diferencia en el tiempo de compilación es normal. Con la macro definida, el archivo es más grande y el preprocesador tiene que hacer más. Sin embargo, las nuevas PC son tan poderosas que simplemente ignoraría este aumento de tiempo.

2

que asistieron a una sesión en la que se enseñaba que no debemos usar "using namespace std", en lugar de hacer "std :: cout" para el uso de alguna llamada del espacio de nombres std ya que esto aumentará el tamaño del binario .

Muy buen consejo, razonamiento sin sentido. Esa razón es una optimización prematura, y es un error arrancar.

Nunca use using namespace std; en un archivo de encabezado. Esa directiva en un archivo de encabezado contamina el espacio de nombres global con elementos del espacio de nombre std en cada archivo que # incluye su archivo de encabezado.

Incluso en un archivo fuente, muchos prefieren std::whatever porque hace que el código sea más legible, más comprensible y menos propenso a errores. Con el costo único de algunos caracteres de tipeo, ese prefijo std:: comunica para siempre el intento al compilador y, lo que es más importante, al lector humano/mantenedor humano del código. No hay duda de que el código está invocando algo de la biblioteca estándar.

La única justificación para emplear una directiva using namespace <namespace_name>; es pura holgazanería en la parte del programador para guardar unos pocos caracteres de mecanografía. Esos pocos caracteres guardados de mecanografía tienen un gran costo.

Cuestiones relacionadas