[DUDA] Adición de librerías

Iniciado por DarkItachi, 28 Abril 2010, 06:53 AM

0 Miembros y 1 Visitante están viendo este tema.

DarkItachi

Hola buenas :) Tengo una pregunta, cuando metes una directiva de preprocesador como
Código (cpp) [Seleccionar]
#include <string> el compilador incluye las funciones que usas o todas? Es decir, si vas a usar dos funciones chorra como strlen o strlwr es mejor incluir la librería string o creártelas por tu mismo en el programa? Qué ventajas tiene? Y que desventajas?

Salu2
Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.

Akai

Las incluye todas. A menos que tuvieses límites de meoria y/o espacio, la inclusión de toda la libreria en vez de únicamente las x funciones que tu uses, no debería ser un problema.

Littlehorse

CitarQue desventajas?

Depende la función, pero si hablamos de funciones estándar no seria lo mas adecuado reemplazarla al menos que estemos hablando de algo estrictamente necesario.

Por ejemplo, es muy sencillo hacer una función que cuente los caracteres de un arreglo, pero funcionara igual que la estándar? sera igual de rápida? sera portable? sera igual de segura?.
Ten en cuenta que con ese criterio tendrías que codificar por tu cuenta mas de una función y eso no solo ampliara el tiempo de desarrollo, ademas, hará que el programa final sea mas susceptible a errores (Como se suele decir, prone to error)

Seguramente muchas funciones se podrían hacer en menos lineas, pero menos lineas no siempre significa mejor.

Mi opinión por lo menos es que no existen ventajas de la forma que lo estas planteando.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

DarkItachi

Cita de: Littlehorse en 28 Abril 2010, 08:37 AM
CitarQue desventajas?

Depende la función, pero si hablamos de funciones estándar no seria lo mas adecuado reemplazarla al menos que estemos hablando de algo estrictamente necesario.

Por ejemplo, es muy sencillo hacer una función que cuente los caracteres de un arreglo, pero funcionara igual que la estándar? sera igual de rápida? sera portable? sera igual de segura?.
Ten en cuenta que con ese criterio tendrías que codificar por tu cuenta mas de una función y eso no solo ampliara el tiempo de desarrollo, ademas, hará que el programa final sea mas susceptible a errores (Como se suele decir, prone to error)

Seguramente muchas funciones se podrían hacer en menos lineas, pero menos lineas no siempre significa mejor.

Mi opinión por lo menos es que no existen ventajas de la forma que lo estas planteando.

Saludos

Osea, que es mejor usar librerías aunque vayas a usar solo una función. Pero si incluyes más librerías influye en el tamaño del ejecutable :?

Gracias.
Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.

biribau

Por norma general NO incluye todas las librerías, de una librería sacas libros independientes, o sea funciones. Incluye TODAS las funciones en compilación(declaraciones), pero en linkado(ejecutable final) solo mete las que uses(y dependientes), por eso las librerías son objetos especiales, no simples .obj, sino que son colecciones de simbolos indexados o algo así.

@Littlehorse: es error-prone :P

Por otra parte puedes implementarlas, a veces es util y otras necesario, a veces se necesitan implementaciones ligeras(uClib) otras reimplementaciones (cualquier nuevo sistema operativo necesitará cambios en las llamadas al sistema), mas eficientes(hay multitud de librerias para gestion de heap(malloc/free), smartpointers). Yo hice una vez mi propio new delete, para debuguear memory leaks. Y también es sabido que una de los mayores cuellos de botella fácilmente optimizables son precisamente en la gestión de memoria dinámica(sólo daros cuenta que la implementación que te dan es genérica y debe servir para todos más o menos, pero tú en tu programa tienes más información de como se usa la memoria pues puedes adaptarlo, especializarlo a tí haciendolo más rápido, evitando congelamientos a veces para no desmejorar la inmediatez de la respuesta(que raro suena esto, no recuerdo como era en inglés xD))

Lambda

Cita de: biribau en 28 Abril 2010, 16:31 PM
Por norma general NO incluye todas las librerías, de una librería sacas libros independientes, o sea funciones. Incluye TODAS las funciones en compilación(declaraciones), pero en linkado(ejecutable final) solo mete las que uses(y dependientes), por eso las librerías son objetos especiales, no simples .obj, sino que son colecciones de simbolos indexados o algo así.

@Littlehorse: es error-prone :P

Por otra parte puedes implementarlas, a veces es util y otras necesario, a veces se necesitan implementaciones ligeras(uClib) otras reimplementaciones (cualquier nuevo sistema operativo necesitará cambios en las llamadas al sistema), mas eficientes(hay multitud de librerias para gestion de heap(malloc/free), smartpointers). Yo hice una vez mi propio new delete, para debuguear memory leaks. Y también es sabido que una de los mayores cuellos de botella fácilmente optimizables son precisamente en la gestión de memoria dinámica(sólo daros cuenta que la implementación que te dan es genérica y debe servir para todos más o menos, pero tú en tu programa tienes más información de como se usa la memoria pues puedes adaptarlo, especializarlo a tí haciendolo más rápido, evitando congelamientos a veces para no desmejorar la inmediatez de la respuesta(que raro suena esto, no recuerdo como era en inglés xD))

Las .lib (y creo que las .a tambien) son simples colecciones de .objs, de hecho puedes extraerlos xD

Sobre el tema, cuando incluyes el <string> lo que hace el preprocesador es reemplazar esa linea por todo el contenido del header pero luego a la hora de linkear el linker solo metera las funciones que utilizas.

DarkItachi

Cita de: Lambda en 28 Abril 2010, 16:43 PM
Cita de: biribau en 28 Abril 2010, 16:31 PM
Por norma general NO incluye todas las librerías, de una librería sacas libros independientes, o sea funciones. Incluye TODAS las funciones en compilación(declaraciones), pero en linkado(ejecutable final) solo mete las que uses(y dependientes), por eso las librerías son objetos especiales, no simples .obj, sino que son colecciones de simbolos indexados o algo así.

@Littlehorse: es error-prone :P

Por otra parte puedes implementarlas, a veces es util y otras necesario, a veces se necesitan implementaciones ligeras(uClib) otras reimplementaciones (cualquier nuevo sistema operativo necesitará cambios en las llamadas al sistema), mas eficientes(hay multitud de librerias para gestion de heap(malloc/free), smartpointers). Yo hice una vez mi propio new delete, para debuguear memory leaks. Y también es sabido que una de los mayores cuellos de botella fácilmente optimizables son precisamente en la gestión de memoria dinámica(sólo daros cuenta que la implementación que te dan es genérica y debe servir para todos más o menos, pero tú en tu programa tienes más información de como se usa la memoria pues puedes adaptarlo, especializarlo a tí haciendolo más rápido, evitando congelamientos a veces para no desmejorar la inmediatez de la respuesta(que raro suena esto, no recuerdo como era en inglés xD))

Las .lib (y creo que las .a tambien) son simples colecciones de .objs, de hecho puedes extraerlos xD

Sobre el tema, cuando incluyes el <string> lo que hace el preprocesador es reemplazar esa linea por todo el contenido del header pero luego a la hora de linkear el linker solo metera las funciones que utilizas.

Entonces, no importa si metes muchas librerias?

Salu2
Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.

Littlehorse

No, no importa.

@biribau: Es exactamente lo mismo.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.