Ver Mensaje Individual
  #19 (permalink)  
Antiguo 19/01/2013, 06:40
Avatar de dontexplain
dontexplain
 
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 11 meses
Puntos: 127
Respuesta: [C++] ¿como lo soluciono?

byxtyle, no es tu culpa, tú eres sólo una víctima. No me parece muy inteligente el diseño de un lenguaje que según qué circunstancias tiene esas excepciones. Una persona tarda en entender que C aplica ciertas excepciones en lugar de usar una metodología homogénea.

Si un array es un puntero hacia el primer elemento del array lo lógico es pensar que el compilador actuase igualmente ante arrays de chars que ante arrays de int, pero no, los genios de C consideraron que era correcto

Código C:
Ver original
  1. int a[] = {3,2,1};
  2. cout << a; // dirección memoria del primer elemento de a, o sea, 3;
  3. char b[] = "e";
  4. cout << b; // imprime e

A cualquier novato esto lo despista y piensa que los chars son entidades especiales, más lejos de la realidad, tanto el array de chars como el de enteros se recolocan en la memoria siendo simples dword ptr y byte ptr al referenciarse.

No sólo eso, si no que si no especificas la longitud y usas un string literal (literal es que va entre comillas) ese string es en sí mismo un objeto ya recolocado en memoria por lo que lo que hace es doble operación para definirlo en memoria y recopiarlo en otra dirección afectando muy positivamente al rendimiento:

Código ensamblador:
Ver original
  1. mov  ax,word ptr ds:[00F9CC8Ch]  // en esa dirección de memoria es un dword con [B]e[/B] y \0
  2. mov  word ptr [b],ax  // lo mueve nuevamente a la dirección que apunta b

en la memoria es

0x00F9CC8C: 65
0x00F9CC8D: 00

Y como se ve, también añade un \0 (00h), por lo que es un 2x1! Hay una explicación fundamental para usar 00 y es que es el carácte NUL de fin de cadena, que en cualquier caso me parece más lógico que haya que indicarlo manualmente para que la persona entienda de una vez que se trata de un array con un tamaño+1.

Luego, también consideran que char tiene que ser char porque ellos son los listos número 1 y obviamente nadie iba a usar un entero ultramegacorto si no es para chars ascii así que ellos mandan y char es carácter, aunque sea un simple entero de 8 bits que es un __int8.

Los enteros de 1 byte tampoco se pueden imprimir como números aunque se definan como __int8, el mínimo es __int16 en cualquier caso, y por tanto en el type casting consume más recursos haciendo muchas chorradas por lo que (__int16) __int8 tiene que volver a convertirlo todo haciendo llamadas, incluso si usas __int8 sin typecasting no te preocupes que el compilador lo convertirá a char haciendo una llamada a std::operator<<<std::char_traits<char> >.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 19/01/2013 a las 07:18