[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [escepticos] ***Una ayudita,plis :)
Ramón Ordiales wrote:
Me da la impresión de que te servirá, pero eso sólo puedes juzgarlo
tú.
Viva DELPHI!!! :-)
La plataforma .NET le debe mucho a Delphi... incluso unas sospechosas
("Sender") en los eventos ;-)
Hace poco lei que la informatica hubiera avanzado mucho más sino fuera por
Stroup, el encargado del standard C++, que es más fundamentalista y taliban
con el C++ que se negaba año tras año a incorporar al C++ aquellos avances
necesarios para la programación moderna.
De hecho, Microsoft se cabreó en el momento en que no podía añadir a las
definiciones de clase de forma nativa métodos "published" y porque no
terminaba de añadir las cadenas (string) como clase nativa.
El problema es que alguien escriba lo siguiente
if ( IDautor == "fernando" )
  IDlibro.autor = "pedro";
en lugar de lo siguiente:
if ( IDautor == IDfernando )
  IDlibroEstado = s_cedido;
Con una sola instruccion assembler, te pules un asignacion
esto IDlibroEstado = s_cedido;
se escribe asi en asm:
mov         dword ptr [IDlibroEstado],17h
mientras que de la otra manera hacen falta M operaciones (siendo M un 
numero grande)
push        offset ___xt_z+118h (00418d5c)
lea         ecx,[sIDlibroEstado]
call 
 en ILT+40(std::basic_string<char,std::char_traits<char>,std::allocator<char> 
>::operator=)
....
Una de las razones por usar C++, o algo como C, y no contar con un buen 
recolector de basura, es manejar "detalles" como que es mas optimo 
identificadores numericos que strings. Aunque el codigo sea ligeramente 
mas feo por contra mas mantenible... es una trampa, a la larga es mas 
dificil trabajar con cadenas que con costantes. Es el caso de alguien 
que hiciera una aplicacion enorme, con montones de cadenas en cada 
fichero, y luego lo necesitara traducir al ruso.. o al ingles, etc... 
utilizando costantes, extraes las particularidades de las cadenas a otro 
lugar. Ademas, el codigo de programacion se cifra en ascii de 7 bits, 
normalmente, ...que la mayor parte de los europeos podamos mezclar 
codigo c++,java,perl, etc.. y texto, es solo una "casualidad"... algo 
endogamica porque nosotros hemos definido el charset, probablemente los 
indios, judios y chinos lo tienen mas dificil para meter cadenas en el 
codigo fuente.
//
// APENDICES
//
Ejemplo del mundo real:
http://cvs.sourceforge.net/viewcvs.py/*checkout*/war3d/War3DSource/animaEscenario.cpp?rev=1.7
Ejemplo comparativo.
#include <string>
using namespace std;
const IDfernando = 80;
const s_cedido = 23;
int main(int argc, char* argv[])
{
	string sIDautor, sIDlibroEstado;
	int  IDautor,  IDlibroEstado;
	
	if ( sIDautor == "fernando" )
		sIDlibroEstado = "cedido";
	if ( IDautor == IDfernando )
		IDlibroEstado = s_cedido;
	return 0;
}
13:   int main(int argc, char* argv[])
14:   {
00401110   push        ebp
00401111   mov         ebp,esp
00401113   push        0FFh
00401115   push        offset $L9219 (00414be2)
0040111A   mov         eax,fs:[00000000]
00401120   push        eax
00401121   mov         dword ptr fs:[0],esp
00401128   sub         esp,30h
0040112B   push        edi
0040112C   lea         edi,[ebp-3Ch]
0040112F   mov         ecx,0Ch
00401134   mov         eax,0CCCCCCCCh
00401139   rep stos    dword ptr [edi]
15:       string sIDautor, sIDlibroEstado;
0040113B   lea         eax,[ebp-35h]
0040113E   push        eax
0040113F   lea         ecx,[sIDautor]
00401142   call 
 en ILT+125(std::basic_string<char,std::char_traits<char>,std::allocator<char> 
>::basic_str
00401147   mov         dword ptr [ebp-4],0
0040114E   lea         ecx,[ebp-36h]
00401151   push        ecx
00401152   lea         ecx,[sIDlibroEstado]
00401155   call 
 en ILT+125(std::basic_string<char,std::char_traits<char>,std::allocator<char> 
>::basic_str
0040115A   mov         byte ptr [ebp-4],1
16:
17:       int  IDautor,  IDlibroEstado;
18:
19:       if ( sIDautor == "fernando" )
0040115E   push        offset ___xt_z+10Ch (00418d50)
00401163   lea         edx,[sIDautor]
00401166   push        edx
00401167   call         en ILT+20(std::operator==) (00401019)
0040116C   add         esp,8
0040116F   and         eax,0FFh
00401174   test        eax,eax
00401176   je          main+75h (00401185)
20:           sIDlibroEstado = "cedido";
00401178   push        offset ___xt_z+118h (00418d5c)
0040117D   lea         ecx,[sIDlibroEstado]
00401180   call 
 en ILT+40(std::basic_string<char,std::char_traits<char>,std::allocator<char> 
>::operator=)
21:
22:       if ( IDautor == IDfernando )
00401185   cmp         dword ptr [IDautor],50h
00401189   jne         main+82h (00401192)
23:           IDlibroEstado = s_cedido;
0040118B   mov         dword ptr [IDlibroEstado],17h
24:
25:
26:       return 0;
00401192   mov         dword ptr [ebp-3Ch],0
00401199   mov         byte ptr [ebp-4],0
0040119D   lea         ecx,[sIDlibroEstado]
004011A0   call 
 en ILT+70(std::basic_string<char,std::char_traits<char>,std::allocator<char> 
>::~basic_str
004011A5   mov         dword ptr [ebp-4],0FFFFFFFFh
004011AC   lea         ecx,[sIDautor]
004011AF   call 
 en ILT+70(std::basic_string<char,std::char_traits<char>,std::allocator<char> 
>::~basic_str
004011B4   mov         eax,dword ptr [ebp-3Ch]
27:   }
/////////////////////////////////