処理系の独自拡張は出来るだけ使いたくないのだが、アセンブラで書く量を出来るだけ少なくしたいと思うと、使用もやむなしといったところ。
処理系の独自拡張は出来るだけ使いたくないのだが、アセンブラで書く量を出来るだけ少なくしたいと思うと、使用もやむなしといったところ。
結局exeファイルが1MB増えた。今回追加した部分で2×2×14×2×2×2=448通りコードを生成させているわけで、関係する一つの関数が数百バイト程度でも、数百キロバイトまで増えてしまうことになる。これはさすがにイタイ。ということで、テンプレート引数に依存しない、かつ、処理速度にさほど影響しない部分を非テンプレートな基底クラスへ移してみる。これらの関数は逆にインライン展開して欲しくない、というのは何とも皮肉。
たった一ファイルなのに、こんなに速いマシンなのに、コンパイル時間かかりすぎ。テンプレートとマクロで各モードの全組み合わせを生成しているせいだと思う。
と、.objファイルのサイズを見たら……100MB!!? あ、ありえねぇ……。
いろいろ調べてみたら、関数テンプレート内で、std::vector<関数ローカルクラス>を使っていたのが悪かったみたい。そりゃ、一つ一つのテンプレートインスタンスに対して個別のvectorができあがっちゃうわけで、肥大するわな。ローカルクラスを外に出したら10MBまで下がり、さらにvectorをやめて固定長の配列にしたら8MBまで下がった。