事前に libiconv, gettext を入れておいた方が良い。
CFLAGS
はお好みで。
$ wget -c http://www.tortall.net/projects/yasm/releases/yasm-0.5.0.tar.gz $ zcat yasm-0.5.0.tar.gz | tar xvf - $ cd yasm-0.5.0/ $ ./configure $ make && make check $ sudo make install
事前に関係ライブラリ群
(SDL, libpng, libjpeg, libtiff, Expat, libiconv, libzlib など)
を出来るだけ多く入れておきたいところ。
もちろん CFLAGS
はお好みで。
$ wget -c http://jaist.dl.sourceforge.net/sourceforge/wxwindows/wxWidgets-2.7.0-1.tar.bz2 $ bzcat wxWidgets-2.7.0-1.tar.bz2 | tar xvf - $ mkdir wxWidgets-2.7.0-1/carbon_build $ cd wxWidgets-2.7.0-1/carbon_build $ ../configure --enable-monolithic --with-sdl --enable-stl --enable-unicode --with-opengl $ make && make samples $ sudo make install
メモ。
ずっと SH でソフトウェア開発している方に、 「for ループはインクリメントよりデクリメントの方が速いよ」と言われ、 実験してみた。
#include <iostream>
static const int loop(100000000);
size_t LoopFunctionI(void) { size_t ret_val(0); for (int i(0); i < loop; ++i) { ++ret_val; } return ret_val; }
size_t LoopFunctionD(void) { size_t ret_val(0); for (int i(loop); 0 < i; --i) { ++ret_val; } return ret_val; }
int main(void) { std::cout << LoopFunctionI() << ':' << LoopFunctionD() << std::endl;
return 0; }
で、これを Mac OS X (on x86), GCC 4.0.1 で g++ -O2 main.cpp -S して、main.s を開くと…。
.globl __Z13LoopFunctionIv __Z13LoopFunctionIv: LFB1447: pushl %ebp LCFI0: movl %esp, %ebp LCFI1: xorl %eax, %eax L2: addl $1, %eax cmpl $100000000, %eax jne L2 popl %ebp ret LFE1447: .align 1,0x90
.globl __Z13LoopFunctionDv __Z13LoopFunctionDv: LFB1448: pushl %ebp LCFI2: movl %esp, %ebp LCFI3: xorl %eax, %eax L9: addl $1, %eax cmpl $100000000, %eax jne L9 popl %ebp ret LFE1448: .align 1,0x90
ふむ…?
最適化って凄い・怖いですねぇ…。
って言うか、そこまでやるならいきなり 100000000
返して欲しい…。
(← shinh さんとこの GCC 4.1 on Linux だとこうなったそうだ)
loop
や i
を unsigned int
にしたら、
ちゃんとインクリメントとデクリメントが保持された。
けっこう神経質なんだ、GCC って。
もっとちゃんと考えた例じゃないと意味がなさそう
(LoopFunctionI()
, LoopFunctionD()
がダメすぎ等)
なので、またそのうち実験してみるか…。