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


/////////////////////////////////