Eu uso principalmente o GCC, para plataformas ARM, MIPS32, SuperH4 e x86_64 é
claro. Uso eles principalmente em Linux, mas tambem muito em OS X e FreeBSD.
A minha dúvida é como otimizar meu código para que rode mais rápido. Tenho
umas 'boas praticas' tipo use flags '-O3 -fomit-frame-pointer -
fvisibility=hidden' c/ um belo 'strip' depois. Tem coisas que eu nunca
cheguei a fazer em um 'caso real' mas me parecem ajudar bastante, como por
exemplo Profile-guided optimization:
http://jasondclinton.livejournal.com/70872.html
ou então comparar um projeto compilando funções como inline vs
__attribute__((pure)) ou usar '-std=c++0x'
Uso o Valgrind/calgrind de vez em quando para ver onde devo investir mais
tempo também:
http://kcachegrind.sourceforge.net/html/Shot3Large.html
Mas e vcs? Alguem já comparou GCC c/ Profile-guided vs LLVM por exemplo? Tem
alguma dica? Alguma mágia negra ou simpatia p/ rodar mais rápido?
Notem por favor que eu pergunto do binário gerado rodar mais rápido; não me
importa qual compilador compila mais rápido. Afinal, isso já é outro problema
para distcc, etc...
Na verdade const raramente pode ser utilizado como forma de otimização.
A unica forma de otimização mais reliable é a de possibilitar colocar
um objeto em um espaço de memória read-only, como por exemplo uma ROM,
já que modificar um objeto definido como const é undefined-behavior.
Porém, isto é perfeitamente legal:
TU 1:
-- A.hpp --
struct A { int x; };
int f(A const&);
-- main.cpp --
int main()
{
A a = {5};
f(a); // recebe por referencia constante
// O compilador não pode fazer a asserção de que a.x == 5 aqui
// pois ele nao tem como provar que A nao foi modificado em f, mesmo
// tendo sido passado como referencia constante.
}
-
TU2
-- A.h --
struct A { int x; }
int f(A const&);
-- A.cpp --
int f(A const& a)
{
const_cast<A&>(a).x = 4; // perfeitamente legal
}
--
PS: O mesmo não vale pra se A fosse definido como const. Neste caso
executar f implicaria em undefined behavior.
O compilador só pode fazer constant folding se ele puder provar que
não há modificação alguma do objeto (ou se uma possivel modificação
implicasse undefined behavior), o que só é possivel tendo conhecimento
de todo o código sendo executado, com ou sem const.
[snip]
--
Felipe Magno de Almeida