elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Es seguro reemplazar el paso de parametros por valor, utilizando punteros a constantes ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Es seguro reemplazar el paso de parametros por valor, utilizando punteros a constantes ?  (Leído 4,662 veces)
Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Es seguro reemplazar el paso de parametros por valor, utilizando punteros a constantes ?
« en: 27 Julio 2021, 23:37 pm »

Quiero decir, se podría reemplazar completamente paso por valor, para solo utilizar punteros? Por ejemplo, la siguiente función no necesita punteros pero pienso que actuaría mejor (dado un programa más grande)
(Aunque esta función sería mejor hacerla en linea pero sirve como ejemplo)

Código
  1. #include <stdio.h>
  2.  
  3. int sumaEnteros(const int *pNum,const int *pOtroNum);
  4.  
  5. int main()
  6. {
  7.    char buffer[5] = { 0 };
  8.    int num = 0, otroNum = 0, res = 0;
  9.  
  10.    printf("Ingrese un numero: ");
  11.    fgets(buffer, 4 , stdin);
  12.  
  13.    sscanf(buffer,"%d",&num);
  14.  
  15.    printf("Ingrese otro numero: ");
  16.    fgets(buffer, 4 , stdin);
  17.    sscanf(buffer, "%d" , &otroNum);
  18.  
  19.    res = sumaEnteros(&num,&otroNum);
  20.  
  21.    printf("\n\n %d + %d = %d\n",num,otroNum,res);
  22.  
  23.    return 0;
  24. }
  25.  
  26. int sumaEnteros(const int *pNum, const int *pOtroNum)
  27. {
  28.    return *pNum + *pOtroNum;
  29. }
  30.  
  31.  


« Última modificación: 27 Julio 2021, 23:41 pm por Locura_23 » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Es seguro reemplazar el paso de parametros por valor, utilizando punteros a constantes ?
« Respuesta #1 en: 28 Julio 2021, 00:16 am »

Reemplazar los tipos de los parametros por punteros a esos tipos, poder se puede, y por lo general, no debería fallar, pero tiene algunas complicaciones:
1. En la función habría que asegurarse (o dejar claro), que no puede recibir un nullptr o un puntero inválido. Para asegurar esto suele ser más visual pasar parámetros por referencia en vez de un puntero.
2. Pasar un puntero a int es tan costoso o más que pasar un int. Copiar un int o copiar un puntero, suele ser idéntico (ambos son tipos de dato entero, y el tamaño suele ser el mismo). Con lo cual, rara vez se gana nada, es raro ver un puntero a const int como parámetro, la verdad (lo mismo con cualquier otro tipo entero o float/double).
3. La norma general: usar cada cosa en su momento. Por muy grande que sea un programa, sus funciones son pequeñas, y cuanto más precisas sean sus definiciones, mejor. Es decir, si una funcion sum(a, b) necesita 2 enteros, pide 2 enteros, no 2 punteros, porque pedir punteros complica el uso de la función, y puede dar a pensar que la función haga otras cosas (¿Por qué pediría un puntero si no?). En caso de clases que no queramos copiar, por el motivo que sea (rendimiento, no se pueda copiar, etc etc), entonces pasar por referencia (const Class&) suele ser más efectivo.

Nota: Lo de paso por referencia es un tema de C++, no C. Si estás trabajando con C, ignora lo del paso por referencia: es poco más que una "utilidad" para facilitar el uso de punteros


En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Es seguro reemplazar el paso de parametros por valor, utilizando punteros a constantes ?
« Respuesta #2 en: 28 Julio 2021, 00:58 am »

Estarías haciendo lo mismo, internamente toma el puntero de las variables y por supuesto trabajar con punteros nunca es seguro así que prescinde de los punteros siempre que sea necesario
En línea

Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Es seguro reemplazar el paso de parametros por valor, utilizando punteros a constantes ?
« Respuesta #3 en: 30 Julio 2021, 18:09 pm »

@ivancea96 , @srWhiteSkull  gracias por sus respuestas!

Sí sobre esta forma lo leí en un libro, el cual argumenta que de esta manera se combina la seguridad que ofrece el paso de parámetros por valor, pues al ser constantes los punteros, los valores están protegidos, y también la eficiencia al rendimiento de los punteros.

Sin embargo si es posible que haga un poco torpe la lectura de las funciones
En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Es seguro reemplazar el paso de parametros por valor, utilizando punteros a constantes ?
« Respuesta #4 en: 30 Julio 2021, 21:12 pm »

Aunque se puede, no tiene caso hacerlo con tipos básicos, como te dijo ivancea96. De hecho, aparte de los inconvenientes que él te menciona, también está el hecho de que ya no podrías pasarle constantes literales; además de que lo que leíste en el libro sólo aplica si los parámetros son objetos grandes, como estructuras. Ahí se justifica pasar por puntero porque es más eficiente copiar un único valor de 32 o 64 bits, que todos los campos de una estructura o clase, (por no hablar de las llamadas a constructores que se llevarían a cabo si hablamos de C++), por más que el compilador pueda hacer optimizaciones que lo hagan menos ineficiente.

Pero si hablamos de tipos simples, como int, el paso por puntero es de hecho menos eficiente. Dado que el parámero que la función recibe es sólo una dirección, antes de acceder al valor en sí, hay que ir a buscarlo a la memoria, lo cual no sucede con el paso por valor.

En resumen, a menos que se trate de objetos grandes, no tiene sentido pasar punteros a funciones que no necesitan modificar los parámetros. Eso sólo hace tus funciones menos legibles, menos seguras, menos flexibles y menos eficientes.
En línea

Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Es seguro reemplazar el paso de parametros por valor, utilizando punteros a constantes ?
« Respuesta #5 en: 30 Julio 2021, 23:25 pm »

@RayR gracias por tu respuesta

Ya veo,ahora quedó más claro. Saludos  :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
qué pasó con XSL,XQL,XLL,XPATH, se siguen utilizando?
Desarrollo Web
jhonatanAsm 2 3,351 Último mensaje 15 Junio 2016, 19:03 pm
por jhonatanAsm
Paso de parametros.
ASM
0xDani 5 3,986 Último mensaje 21 Agosto 2012, 16:51 pm
por Eternal Idol
duda parametros por referencia vs punteros(Pascal/C)
Programación General
Shp112 0 1,915 Último mensaje 10 Enero 2014, 02:29 am
por Shp112
Duda con recursividad, punteros y parametros por dirección
Programación C/C++
jmrivas 3 2,217 Último mensaje 7 Julio 2014, 17:40 pm
por eferion
Paso de parametros y rendimiento
Java
Sistematic 4 2,308 Último mensaje 29 Junio 2015, 06:08 am
por jhonatanAsm
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines