ラベル C Language の投稿を表示しています。 すべての投稿を表示
ラベル C Language の投稿を表示しています。 すべての投稿を表示

2008/12/23

C言語: ファイルサイズの取得

C言語の標準関数では直接ファイルサイズを取得する関数が無い.
そこで,fseekとfgetposを使ってファイルポインタの位置を調べることで
間接的にファイルサイズを取得するそうな.
fpos_t fpos;
FILE *fp = fopen(fname, "rb");

fseek(fp, 0, SEEK_END);
fgetpos(fp, &fpos);
fclose(fp);

fpos.__pos; // これがファイルサイズ


// Reference
ファイルサイズの取得方法
半年くらい前にはまったこと
標準C言語関数

2008/12/15

likely / unlikely

likely / unlikelyマクロはコンパイラに分岐予測のヒントを与える.
分岐予測ミスによる投機実行ペナルティを減らすために使う.

プログラムのアルゴリズムには影響を与えないため,ソースを読む際には無視して良い.



// Example
int i = 0;
while (1) {
 i++;
 if (unlikely(i > 100))
  break;
}
上記の例では,ループを抜ける条件式の
if ( unlikely(i > 100) )
が成り立つのは,101回の比較の中で1回のみである. よって,この場合はunlikelyがあった方がコンパイラは 最適化されたコードを生成する.はず.


// Reference
likely()-linux2.6 - LinuxKernelHackJapan

2008/12/14

C言語: マクロ展開マクロ

Xenのコードを眺めていたらマクロを展開するためのマクロを見つけたのでメモメモ.
下記のようなマクロが定義されているものとする.

#define EXPAND_MACRO(_MACRO) \
 _MACRO(a) \
 _MACRO(b) \

#define DEFINE(_X) int _X;
#define FUNC(_X) do { func(_X); } while (0);

このとき,
EXPAND_MACRO(DEFINE);
は下記のように展開される.
int a;
int b;

同様に
EXPAND_MACRO(FUNC);
は下記のように展開される.
func(a);
func(b);

便利そうな気もするけど多用すると混乱しそう.

local_irq_save / local_irq_restore

[local_irq_save]
この関数を呼び出したCPUの割り込み禁止/許可状態(EFLAGSレジスタ)を引数で与えた値に保存する.

[local_irq_restore]
この関数を呼び出したCPUの割り込み禁止/許可状態(EFLAGSレジスタ)を引数で与えた値に設定する.

// Reference
local_irq_save()-linux2.6 - LinuxKernelHackJapan
local_irq_restore()-linux2.6 - LinuxKernelHackJapan
spin_lock_irqsave()-linux2.6 - LinuxKernelHackJapan
_spin_lock_irqsave()-linux2.6 - LinuxKernelHackJapan
EFLAGS - 通信用語の基礎知識