[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: }
/////////////////////////////////