viernes, 29 de enero de 2010

Apuntes de optimizacion de C++

Algunos detalles sobre optimizacion de código de C++ que he ido encrontrando por ahi:

1. Inicializar clases
Inicializar las properties de las clases. La inicialización de las clases, se hacen despues de crear las clases contenidas. Es decir, si tenemos una clase A que contiene una clase B y una C, en el momento que creamos la clase A, antes de considerarse creada, se han creado las clases B y C. Asi, si creamos la clase player : tenemos que primero se crea los strings m_Name y m_Profesion y despues entramos en el codigo del constructor. Por eso este código:

class Player
{
public:
Player(const std::string &name)
{
m_Nombre = name;
}
private:
std::string m_Nombre;
std::string m_Profesion;
};

es mas lento que este

class Player
{
public:
Player(const std::string &name)
:m_Nombre(name)
{
}
private:
std::string m_Nombre;
std::string m_Profesion;
};

Porque en el primer caso, primero inicializamos m_Nombre a su valor por defecto y despues a 'name'

2. Crear y definir en la misma linea:

En vez de usar

int nPlayer;
nPlayer = 10;

Es mejor usar

int nPlayer = 10;

Por lo mismo que antes.

3. Mejor preincremento que post incremento:
Es mejor ++i que i++;

4. Sumas de variables:
Casi siempre es mejor

value3 += value2;

que

value3 = value2 + value1;


5. Crea las variables cuando toque:
No crees la variable al principio de la funcion, asi:

bool foo(CVehicle* veh)
{

CPlayer tempPlayer;
if (veh == NULL)
return false;

//.....
}

En este codigo, si veh es nulo, para que crear tempPlayer? Ni no se va a usar....

martes, 19 de enero de 2010

Interfaces graficas con QT

Últimamente, ademas de haber estado viciado al assassin's creed 2, me he dedicado a echarle un vistazo a QT. Estas librerias, hechas por trolltech hasta que nokia las compro, son librerías para hacer interfaces gráficas de usuario (GUIs). Son multiplataforma, echas en C++, LGPL y muy robustas y rapidas. Es decir, un verdadero paraiso. Si ademas estas trabajando en Visual Studio, no hay problema: te las compilas, instalas el Visual Studio Add-in y ya puedes compilar tus programas con tus GUIs desde VS. Hacerlo es muy facil. Te lo resumo en estos sencillos pasos:
1.- Bajarse la version del framework para windows de QT (actualmente la 4.6)
2.- Bajarse el visual studio add-in
3.- Instalar las librerias de QT en un directorio SIN ESPACIOS (por ejemplo C:\QT\2009.06)
4.- Crear una variable de entorno que apunte a tu directorio de instalacion llamada QTDIR
5.- Abrir la consola para visual studio o abrir la linea de comandos y llamar a vcvars32.bat. LA consola de visual studio se puede abrir desde el menu inicio, dentro del grupo de visual studio, o desde dentro del visual studio, en Herramientas -> Visual Studio 2008 Command Prompt
6.- Usar la consola que hemos abierto para ir al directorio de instalacion de QT
7.- Escribir C:\Qt\2009.06\configure -platform win32-msvc2008 (si falla la compilación, hay mucha gente que desconecta el Webkit añadiendo -no-WebKit)
8.- Escribir nmake
9.- Esperar....
10.-Esperar un rato mas....
11.- Segun la máquina que tengas, en unas 2 horas (que tambien pueden ser 5), se acabará compilando el codigo.
12 .- Instalar el visual studio add-in
13.- Hacer un proyecto de prueba. Para hacer la prueba crea un nuevo proyecto de QT en Visual Studio. Escribe este código en el main.cpp

#include
#include

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPushButton hello("Hello world!");

hello.show();
return app.exec();
}

Si te funciona a la primera, felicidades. Yo he tenido que consultar algunos foros por que no acababa de funcionar. Una de las cosas que pasaban es que el manifest tool de Visual Studio daba problemas. Lo mejor es que si falla la compilación, ves al antivirus y excluye el mt.exe de la monitorizacion continua, y tambien la ruta del QT. Parece que eso hace que desaparezca ese tipo de error. Otra es que tuve que NO instalar el webkit, por que fallaba la compilación.

Tienes un montón de documentación sobre QT. Especialmente te recomiendo los tutoriales. Todavia tengo que mirar como cuadra el QT designer con el código generado en Visual Studio.