C言語
ここまで見てきた計算方法で、どれくらい高速化するか実験します。
引き続き整数の割り算を掛け算に変換する方法について考えます。
引き続き整数の割り算を掛け算に変換する方法について考えます。
コンパイラの出力を見ていると、除数が定数の場合に整数の割り算を掛け算に変換していることに気付きます。これがどんな原理で行われているのか考えてみました。
今まで何度かvoid *の説明を求められましたが、なかなか納得してもらえませんでした。説明を工夫するだけでは限界があると感じたので、別の方法でどうにかならないかを考えてみました。前回の記事の延長線上で説明します。サンプルコードを再掲します。 mov …
対象環境を限定できる場合、バイト配列にリトルエンディアンで32bit値を書き込むときに、私は以下のように書いていました。 char buf[32]; *(int *)&buf[6] = 0x12345678; 非常に分かりにくいとご指摘を受けて色々と変形しましたが、どれもしっくり来ません…
数回に分けて文字列配列を作ってみます。手始めに検証用サブルーチンをJITで作ってみます。 strarray.c #include <stdio.h> #include <string.h> #include <windows.h> // for (i = 0; i < argc; i++) { // printf(argv[i]); // putchar(' '); // } char buf[] = { 0x56, // push esi 0x8b,</windows.h></string.h></stdio.h>…
第6回 コンパイラ実装会で出た話題です。関数のサイズを取ろうとしたら1になりました。なぜ? test.c #include <stdio.h> int main(void) { printf("%d\n", sizeof(putchar)); return 0; } 実行結果 $ gcc test.c $ ./a.exe 1int aへのポインタが&aであるように、putc</stdio.h>…
COMのメモリレイアウトを理解するため、なるべく既存のマクロを使わないでC言語から呼び出してみました。 https://gist.github.com/1362172 手軽にCOMのサンプルを作る方法が見当たらなかったので、以下の Project1.dll を使わせていただきました。 C言語でC…
PE勉強会(1)で配布した資料(id:n7shi:20110219)のサンプルコードに問題があり、ご指摘を受けました。調べた所、色々な意味で突っ込みどころが満載でした。 int _main() {} 結論から言うと、以下のように書くのが無難なようです。 int _main(void) { return…
Haskellをどこから使い始めれば良いのか分からずに放置していたのですが、何気なく検索したFFIが気になったので遊んでみました。
昨日C#で作ったものと同じようなものをC言語で実装してみました。二重起動判定はMutexではなくFindWindow()で行っています。なるべく簡単に実装するため、.NETリモーティングの代わりにWM_SETTEXTを投げています。
【追記】C#移植版 ⇒ id:n7shi:20110204C言語で外部ライブラリ(libjpeg等)を使わずにJPEGの画像サイズを取得するプログラムを書いてみました。パブリックドメインに置いておきます。
C言語で浮動小数点数を算出するプログラムを書いてみました。
ファイルを標準出力に転送しながら進捗を表示する小さなツールを作成しました。 使用例 % sizecat src.tar.bz2.1 src.tar.bz2.2 | bzcat | tar xf - 49% [#########################-------------------------] 92/185 KB上例のようにアーカイブを展開する時…