/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Librerias Estáticas Vs. Dinámicas

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
patriciaydaniel



Registrado: 22 Jul 2006
Mensajes: 45

MensajePublicado: 04/08/2006 7:01 am
Título: Librerias Estáticas Vs. Dinámicas

Buenas a todos. He estado jugando con el lenguaje C un rato, y he intentado compilar algunas librerias estáticas.

Lo que he hecho hasta ahora simplemente es generar un proyecto de libreria estática en Dev-C++, le agrego el código de una o más funciones, lo compilo y me genera un archivo con extensión *.a.

Luego creo otro proyecto cualquiera, por ejemplo, aplicación de consola. Desde main() llamo a alguna funcion de las que aparecen en mi nueva biblioteca estática, luego en las opciones del proyecto, en la pesta#a Parámetros>Linker, agrego la libreria, procedo a compilar y todo sale perfecto.

Y todo sale perfecto aunque no declaré la función de la biblioteca estática en ninguna parte, simplemente al llamarla. Mi primera duda es... no era necesario declararla en alguna parte, en un archivo cabecera o directamente en el fuente donde está main()? Por qué no me da error? Aunque no me de error es más correcto declararla? Cómo la declaro?

Ahora mi otra pregunta. Estoy desarrollando un sistema, creo que he escrito bastante al respecto en el foro.. jeje.. y quiero que sea multiplataforma, de manera que solo sea necesario realizar una recompilación y modificaciones mínimas para ejecutarlo en Linux o en Mac. Por eso tengo algo de dudas con las bibliotecas dinámicas; En Windows el esqueleto que me genera el Dev-C++ cuando creo un proyecto DLL hace llamadas a la API de windows, y me imagino que en Linux o en Mac funcionan muy diferente (no tengo ni idea). Pero si el rendimiento justifica el trabajo adicional entonces empezare a aprender como hacerlas en los diferentes sistemas.

Finalmente: en cuanto al rendimiento de un programa, que es más eficiente, las bibliotecas dinámicas o las estáticas? Hay alguna diferencia en el rendimiento? Son necesarias estas llamadas a la API de Windows para crear bibliotecas dinámicas en este sistema operativo? o basta solamente con pasarle las opciones correctas al compilador (-DBUILDING_DLL=1, creo)?

Tercera pregunta: Si en ciertas funciones no veo la necesidad de usar Clases, sino simplemente funciones al estilo convencional de C, puedo llamar a estas funciones escritas en C desde el programa principal hecho en C++? (creo que si, pero de todas formas pregunto). hay alguna diferencia en el rendimiento entre funciones hechas en C y las clases de C++? Que me recomiendan?

Bueno.. creo que he preguntado bastante para un solo Post. jejeje.

Atte. Daniel
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 4656
Ubicación: Mexico

MensajePublicado: 05/08/2006 12:08 am
Título: Re: Librerias Estáticas Vs. Dinámicas

patriciaydaniel escribió:
Y todo sale perfecto aunque no declaré la función de la biblioteca estática en ninguna parte, simplemente al llamarla. Mi primera duda es... no era necesario declararla en alguna parte, en un archivo cabecera o directamente en el fuente donde está main()?

Tal vez tu programa funcione (o parezca funcionar) correctamente pero es una mala practica llamar a funciones sin declararlas previamente.

patriciaydaniel escribió:
Por qué no me da error? Aunque no me de error es más correcto declararla? Cómo la declaro?

Supongo que no te marca un error debido a que no estas compilando en el modo mas estricto posible que permita tu compilador.

Lo mejor y mas sencillo es declarar las funciones antes de cualquier definicion de funcion y el prototipo (declaracion) debe coincidir exactamente con la definicion en el numero (y tipo) de argumentos y tambien en el valor de retorno.

Por ejemplo:
Código:
/* prototipos */
int foo(int bar, int foozle);

/* main es la unica funcion que no requiere declaracion */
int main(void)
{
   /* ... */
}

/* Definiciones */
int foo(int bar, int foozle)
{
   /* ... */
}


Lo usual es colocar los prototipos en archivos de inclusion o headers e incluirlo en toda unidad que utilize alguna de las funciones y por supuesto tambien en la unidad donde se encuentren las definiciones de estas.

patriciaydaniel escribió:
Finalmente: en cuanto al rendimiento de un programa, que es más eficiente, las bibliotecas dinámicas o las estáticas?

En MS Windows la eleccion entre vinculacion estatica y dinamica depende principalmente del tipo de proyecto que se este desarrollando: la vinculacion estatica es resultado de codigo fuente mas portable mientras que la vinculacion dinamica tiene como ventaja principal evitar la redundancia.

patriciaydaniel escribió:
Hay alguna diferencia en el rendimiento?

El factor principal en el rendimiento de una aplicacion es el algoritmo utilizado. Por poner un ejemplo una aplicacion hecha en assembly pero utilizando un algoritmo que no sea eficiente (o que no sea el adecuado) no sera mas rapida que una aplicacion en C o C++ utilizando el algoritmo correcto.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
patriciaydaniel



Registrado: 22 Jul 2006
Mensajes: 45

MensajePublicado: 05/08/2006 12:31 am
Título:

Gracias por la respuesta Very Happy ...

Te voy a plantear la misma pregunta desde otra perspectiva. Si utilizas el mismo algoritmo, y lo codificas en tres librerias (estáticas o dinámicas): una en C, otra en C++ y otra en ASM, me imagino que la versión en ASM tendrá algún aporte en rendimiento con respecto a las otras dos. Pero entre C y C++ hay alguna diferencia en el rendimiento (empleando por su puesto el mismo algoritmo implementado de manera similar)?.

Atte. Daniel
Volver arriba
Requiem



Registrado: 11 Abr 2006
Mensajes: 689

MensajePublicado: 05/08/2006 6:27 am
Título:

Hola,
Si no me pongo en lugares donde no tendria que ponerme... creo que las diferencias a veces pueden ser importantes...

En prinicipio te diria que C tiene que ser mas rapido que c++ (por q internamente es de mas bajo nivel y por tanto mas cercano al codigo ASM)
Pero hayuna cosa muy divertida que normalmente no se tiene en cuenta y es el padding...EL padding es el hecho de tener un procesador de 32 bits (por ejemplo) y utilizar variables de 16 bits...(por decirlo algo)
Normalmente ,si tienes una cierta experiencia, con c++ te es mas facil solucionar los problemas de padding....
PEro bueno.... sin llegar a tantas frikadas.. si el algoritmo es parecido la velocidad tendra que ser mas o menos parecida...
Vaya bien
Requiem
Volver arriba
patriciaydaniel



Registrado: 22 Jul 2006
Mensajes: 45

MensajePublicado: 05/08/2006 9:02 am
Título:

Donde consigo información sobre Padding? He buscado en Google y casi todo lo que he conseguido no tiene nada que ver con Lenguaje C o C++, sino con Hojas de Estilo en Cascada, etc.

Gracias por tu respuesta.. seguiré buscando... si alguien consigue algo por favor cuelgue el link por aqui..

Atte. Daniel
Volver arriba
Requiem



Registrado: 11 Abr 2006
Mensajes: 689

MensajePublicado: 05/08/2006 10:04 am
Título:

Hola,
A ver.. lo q te he dicho es una frikada muy grande...
Normalmente la diferencia de ejecucion no sera lo suficientemente grande como para que te des cuentadel padding...
Cuando realmente se nota es en programas donde la velocidad de ejecucion es primordial por ser aplicaciones en tiempo real (vease un motor grafico, una inteligencia artificial, un sistema de encriptación....)
Si me puedes explicar un poco mas tu problema te podre intentarn ayudar un poco mas...
Pero piensa que casi siempre , pasaras por una fase de optimizacion "logica", es decir, aplicar cuatro chorradas para mejorar el rendimiento y a partir de ahi tirar de la imaginacion y de la suerte
Vaya bien....
Requiem....
P.D: No sera todo esto para el programa del barco no?
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 4656
Ubicación: Mexico

MensajePublicado: 05/08/2006 11:02 am
Título:

patriciaydaniel escribió:
Te voy a plantear la misma pregunta desde otra perspectiva. Si utilizas el mismo algoritmo, y lo codificas en tres librerias (estáticas o dinámicas): una en C, otra en C++ y otra en ASM, me imagino que la versión en ASM tendrá algún aporte en rendimiento con respecto a las otras dos.

En un plano puramente teorico la mejora en rendimiento al utilizar assembly en lugar de C es (segun un articulo de Radsoft) del 20%. Citan a Brian W. Kernighan pero por desgracia no he encontrado el documento original de la cita.

Ahora bien, para que se materialize esta mejora (teorica) en el rendimiento se deben cumplir ciertos requisitos:

Primero el proceso debe ser perfectible, en otras palabras si un compilador de C hace un trabajo aceptable seria una perdida de tiempo implementar una solucion en assembly donde la mejora en rendimiento fuera imperceptible. Traduccion al español: si la solucion en assembly es solo unos milisegundos mas rapida ...

El segundo requisito es en relacion al programador, este debe manejar de una forma avanzada:

* El lenguaje C.
* El compilador de C que se utilize.
* El lenguaje assembly en cuestion (Wintel, Linux + Intel, etc.).

Aqui un manejo a nivel intermedio no es suficiente ya que debemos ser capaces de analizar el codigo fuente en assembly (cortesia de nuestro compilador de C) y concluir en que partes nosotros como programadores de assembly podemos hacer un trabajo mejor que un compilador de (por poner un ejemplo) un fabricante como Microsoft o Intel.

Como puedes ver "assembly es mejor que el lenguaje X" no es una afirmacion que pueda hacerse de forma general.

A esto hay que agregar que la portabilidad es cero y por lo que comentas en otro mensaje tu proyecto lo piensas ejecutar en varias plataformas (Linux y Mac si recuerdo bien) y utilizando un "toolkit" como QT o GTK.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
patriciaydaniel



Registrado: 22 Jul 2006
Mensajes: 45

MensajePublicado: 05/08/2006 12:35 pm
Título:

Si, en todo tienes razon. Very Happy

Y con respecto al Padding que nombro Requiem hay algo que puedas decir?

Otra pregunta. Leyendo el manual de C "Aprenda C como si estuviera en Primero..." encontré algo de declarar las variables como Register, para de ser posible manejarlas con los registros de la CPU. Esto realmente funciona? mejora el rendimiento con respecto a si no declaramos las variables como Register?

Toda la razon en cuanto a que la portabilidad es MUY importante en mi programa. Very Happy

Gracias por la respuesta...

Atte. Daniel
Volver arriba
Requiem



Registrado: 11 Abr 2006
Mensajes: 689

MensajePublicado: 05/08/2006 1:19 pm
Título:

Hola...
rir... aunque en general estaria de acuerdo con lo que has dicho, no tienes la razon al 100 % de lo q dices...Hay ciertos algoritmos que de implementarse en ASM a cualquier otro lenguaje la diferencia de tiempo puede ser del 50 % o mas!!!!. Por ponerte ejemplos estan las rutinas de transformadas de fourier, de multiplicacion de quads y algunas mas....ES cierto que tal no sean las mas usuales, pero en ocasiones se puede conseguir MUCHO mas que un 20 % de mejora...Por el resto tienes razon... un buen compilador te puede resolver bastante la papeleta
Para dani... Si utilizas el DevCpp con la optimizacion al maximo(esta en las opciones del compilador...) las ventajas en cuanto a velocidad se notan un cojon....
En cuanto a la portabilidad... niño... cuanto mas optimices (o puedas optimizar) en general , menos portabilidad te permitira...

Vaya bien
Requiem
Volver arriba
patriciaydaniel



Registrado: 22 Jul 2006
Mensajes: 45

MensajePublicado: 05/08/2006 1:42 pm
Título:

Por ahora tengo pensado hacer la interface gráfica en C++, con ayuda de un Toolkit, como dijo rir3760, pero no GTK+ ni Qt, sino wxWidgets.

Esa es la parte que no quiero tener que escribir nuevamente para cada sistema operativo. Quiero dise#arla una sola vez y solo incluir poco código especifico para cada plataforma.

Pero las bibliotecas que contengan las funciones críticas, pienso que las puedo optimizar para cada sistema, claro... cuando tenga los conocimientos necesarios, y aún falta mucho. Por allí estoy escribiendo el primer algoritmo (y programa) que necesito, que es una integración numérica por el método de los trapecios.. cuando lo tenga listo lo publico para que me aconsejen y critiquen constructivamente. Necesito calcular áreas dados un conjunto de puntos, con la dificultad que tengo que reconocer en el algoritmo el área definida por la curva, pero solo dentro de la curva.. ya que la misma no necesariamente delimita con un eje coordenado, y tengo que restar áreas y esas cosas. En el papel ya lo hice, ahora falta pasarlo a C, y luego de sus sugerencias optimizarlo.

Me gustaria aprender a trabajar con aritmetica de punteros, aunque ni siquiera entiendo bien el Post de el Triangulo de Pascal que esta publicado en el foro (muy polemico, aunque interesante.. jejeje).

Gracias nuevamente Requiem y rir3760 por su respuestas..

Atte. Daniel

P.D.: jejeje.. Requiem, si.. todo es para el programa del barco.. en eso es lo único en lo que pienso últimamente (y en ti Patricia mi amor.. ).. Wink
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com