目次: Linux
たまにLinux kernelをコンパイルしていると 'func' is deprecated. と言われることがあります。自分が見かけたのは、kernel/intermodule.cというファイルのinter_module_registerという関数でした。(昔の2.6系には残っていましたが、最新版(2.6.23.8)では存在しません)
見てみると関数の宣言に __deprecatedと書いてあり、define部分を探すとinclude/linux/compiler.hに書いてあります。しかし宣言の中身は空、というのもgccだけがdeprecated警告をするので、include/linux/compiler-gcc.hの方に書いてあるんですね。
#define __deprecated __attribute__((deprecated))
こんな定義です。関数プロトタイプに対して __attribute__((deprecated)) と書いておくと、その関数を使った人に対して冒頭で述べたような警告がでます。
これはコードの作者あるいは古いコードをいつまでも使っている人への警告でしょうね。もう使われない(deprecated)関数をお使いのようですけど、いずれなくなってあなたのコードは動かなくなりますよ!それまでには直してくれよ、ヨロシクね!ってことです。
他にcompiler.hで面白いなと思うのは、likelyとunlikelyマクロでしょうか。以下のようなマクロです。
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
キーワード __builtin_expectはコンパイラに対して、第一引数の結果が第二引数の結果になるときに高速動作するコードを出力しなさい、とコンパイラにヒントを与えます。ヒントが正しければプログラムが高速に動作するはずです。
具体的には likelyマクロは引数xが真であるとき、unlikelyは逆にxが偽であるときに高速動作せよと、コンパイラに指示しています。ではlikelyとunlikelyの効果を以下の実験コードで確かめてみましょう。
int func_likely();
int func_unlikely();
volatile int i;
int main(int argc, char *argv[])
{
func_likely();
func_unlikely();
return 0;
}
int func_likely()
{
int c = 0;
while (likely(i)) {
c++;
}
return c;
}
int func_unlikely()
{
int c = 0;
while (unlikely(i)) {
c++;
}
return c;
}
注目点はfunc_likelyとfunc_unlikelyです。ループの条件に付けたlikelyマクロとunlikelyマクロ以外に違いがないことを確認していただけると思います。これをgccでコンパイルしてみましょう。2.95でも対応していたと思いますが、3.xくらいのgccなら確実だと思います。
あとコンパイル時に -O2を付けることを忘れずに。
$ emacs a.c
$ gcc --version
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
$ gcc -O2 -S a.c
$ cat a.s
(コードは一部抜粋です)
(func_likelyの説明)
カウント文と分岐文が連続している。条件は真の可能性が高いと信じて
いるから、「カウント分」「条件判定」「分岐」という一連の命令を連
続して並べる。これにはキャッシュに乗りやすい、プリフェッチしやす
いなど様々な理由があると思う。
一方、リターン文は遠くに配置される。これはコンパイラにとって、ルー
プの条件が成立しないのは、稀なケースであって滅多に実行しないと信
じているから。
func_likely:
jmp .L8 ;(条件判定へ)
.p2align 4,,7
.L9:
incl %edx ;(カウント文)
.L8:
movl i, %eax
testl %eax, %eax ;(i != 0の条件チェック)
jne .L9 ;(分岐文、真だったらループの先頭へ)
popl %ebp
movl %edx, %eax
ret ;(リターン文)
(func_unlikelyの説明)
カウント文とリターン文が連続している。
分岐文もあるが真じゃない可能性が高いと信じているので、条件は成立
せずに即座に終了するはずである。
逆に、条件が成立するときは遠くに置いた判定文へ飛ぶ。これはコンパ
イラにとって、条件が成立することが稀なケースであって、滅多に実行
しないと信じているから。
func_unlikely:
.L2:
movl i, %eax
testl %eax, %eax ;(i != 0の条件チェック)
jne .L3 ;(分岐文、真だったらカウント文へ)
popl %ebp
movl %edx, %eax
ret ;(リターン文)
.L3:
incl %edx ;(カウント文)
jmp .L2 ;(条件判定へ)
ヒントがどういう効果をおよぼすか、ご理解いただけたかと思います。このくらいの小さい関数では効率が変わらないので、例としてはあまり良くないかも…。
最後に !!(x) と引数を二重否定している理由ですが、1ではないけど真(5とか10とか -1とか)である値を1に正規化するためです。以下の例を見ていただくとわかるかと思います。
x = 5 //真だけど1ではない !(x) => 0 //偽 !!(x) => 1 //真で1である
お前の説明じゃまったくわからんぞ!!って人はGoogle先生にも聞きましょう。有名なマクロなので、他のサイトでも紹介されています。
この記事にコメントする
平日は家、仕事、家、仕事…の繰り返しなので、特に日記に書くことがないんですな。
学生時代は忙しいと連呼する社会人が不思議に思えましたが、いざやってみるとうっすら理由がわかります。忙しいというより「まとまった時間」が取れなくて、やる気が失せると言う方が近いです。朝起きるためには夜更かしできない、帰ってきたら既に夜、土日は平日にたまった用事を片付けて終わりです。一気にやりたいのにできないなんて、やる気なくなるでしょ?
ぱっと思いついたアイデアを実践してみる、なんてことが難しくなります。だからこそ何かにトライすべきですが、夜は眠くなっちゃうし、机で寝たら風邪引くしなあ。いかんな…既にやる気が削げてるじゃないかよ。
この記事にコメントする
ファミコン時代のドラクエ4の二大バグ技と言えば、「838861枚のコインを5Gで買う」と「8回逃げた後は100%会心の一撃が出る」ですよね。当時はこのバグを当たり前のように使っていたため、DS版をプレイするにあたり大きな壁にぶち当たっています。
カジノをまじめにやるとすると、闘技場が一番効率良いと思います。それでもまぐれで3連勝してせいぜい2000枚です。はぐれメタルヘルムが許されざるハイパーぼったくり景品(必要枚数100,000枚)だということに今更気づきました。こんな枚数ありえねぇー。
カジノのコインを貯めることがこんなに難しいなんてー!!
ラスボス(ピサロ様)とご対面するところまでは楽勝で進めたので、このままエンディング見ちゃうぞーっとか思ってたんですけど、ピサロ様ったら異常に強いです。特に最終形態が強すぎます。最大HP 250くらいなのに一発120強くらって、瞬殺されたーヨ。
で、デスピサロがこんなに強いなんてー!!
カードとETCの車載器が届きました。カードは普段使っているクレディセゾンの派生カード(下の写真)でカードは無料です。さらに塚田氏から教えてもらった JRSのETC無料キャンペーンを利用し、車載器も無料です。車載器は古野電気製でした。
あの狭い駐車場でETCの機械を車に付ける作業なんてできるんかな。店に頼むと数千円取られるらしいので、自分でやるしかないなあと諦めています。年内に付けたいな…。
この記事にコメントする
会社に何も貢献していないのに、金曜日にボーナスをいただいたわけですけども、所得税と厚生年金でがさっと減る様が悲しいです。
ボーナスをもらうといきなり人が変わったように買い物を始める人が居ますけど、ここは一つ何も買わないで放置をオススメ。お金が遊んでいる状態こそ、これぞ究極の贅沢だと思いませんか?
…勢いで書いてたら意味がわからなくなってきた。やめやめ。
いざつくばへ。昼に出たもんだから、ついたら既に日が暮れてました。園芸の皆さんと食事に行くも和食屋には嫌われてしまいました。海鮮料理屋(旭屋?、土浦市R6沿い)で食事しました。
少し早いですが大下さんからクリスマスプレゼントをもらいました。言われてみれば年内はもう会えなさそうだなあ。こちらも考えて持って行くべきだった。
この記事にコメントする
会社の部署全体(360人中、140人参加)での忘年会がありました。これほどの規模を毎年開催しているのはうちの会社でも珍しいらしいです。
1、2年目の人は実行委員会なるものに参加しなければならない習わしです。しかし年々新人が減り続けており、去年、今年は2人。合わせても4人。そして10年目くらいの先輩2人が忘年会幹事ですので合わせても6人しかいません。少ねえよー。
忘年会が終わってから、たった6人で、仕事の傍ら、こんな宴会をよく回したなあ…としみじみ思いました。疲れた。
この記事にコメントする
ドラクエではとかくAボタンを押すことが多いです。戦闘や会話送りなどみんなAボタンです。戦闘で雑魚を倒すときなんか連打するので特に使います。今やっているドラクエIVもAボタンばかり押していたせいか、DSのAボタンがスカスカになってきました。そのうち壊れるんじゃなかろうか?
が、しかし今はDSの時代。AとBのボタンしかなかったファミコンとは違いDSにはボタンがA, B, X, Y, L, Rの6つもあり、しかも決定ボタンとしてAとXが割り当てられています。
なので雑魚を抹殺するときはAとXを連打すれば、見えないくらいの勢いでコマンドが選択されて戦闘が終わります。A連打なんてもう過去の遺物なんだね…。
この記事にコメントする
最近、コンビニでは味付き海苔をまいたおにぎりが増えています。ご飯の味気なさをカバーする意味では歓迎しますが、コンビニには並べて欲しくない一品です。
理由は手が汚れるからです。汚れるというより何となくベタベタして、おしぼりくらいではすっきり取れません。気軽に食べられるはずのおにぎりなのに、食べた後にしっかり手を洗わなければならないのはちょっとね。
そんなわけで味付き海苔おにぎりはなるべく避けて買い物しています。おにぎり好きなのに、選択肢が非常に狭まってしまい悲しい…。
通勤時間に、味付き海苔に触らないようなデザインを考えていました。一つは海苔を二種類使って、隅の部分だけ味なしにする方法です。もう一つは裏だけ味付きの海苔を作って使う方法です。どちらも持ちやすいでしょうが、おにぎりの味が変わってしまうので微妙です。
包装でなんとかするとしたら、丸いおにぎりやハンバーガーのような包装がありますが、ご存じの通り、海苔とご飯がくっついているため海苔がふやけます。これはこれで良いのですが、パリパリの海苔が好きな人には残念な結果になります。
そういえばバナナって(頑張れば)手が汚れないですよね。あれを見習って、頂点から4つに割って、包装がはがせるようなバナナタイプの包装なんてあればいいなあ。今の形のおにぎりだとちょっとバランスが悪いかな?
この記事にコメントする
I/Oデータとかバッファローが使っているマッハUSBの紹介記事を読んでいたら、VirtualBoxのフィルタドライバが見えてるキャプチャ画像が載っていました。原稿書き用の私物マシンで適当にキャプチャしたのか、評価機に偶然VirtualBoxがインストールされていたか。
普段の記事ならまだ良しとしても、今回は特にドライバについて取り上げている記事なんですから、本題と関係ないドライバを載せるのは良くないと思いますけど。大雑把な記者ですね。
ちなみに画像は「マッハUSBで差別化」と言う段落の最後にあります。ITmediaはrefererがITmediaからじゃないと画像を見せてくれない仕様ですので、頑張って探してください。
この記事にコメントする
ドラクエ4をやってたら一日が終わりました。おかげで2章の序盤から一気に5章まで行った。
ファミコン版のドラクエは全部主人公を男にしてきたので、リメイク版をやるときは全部女に(といっても選べるのは3と4くらい)してます。街の人の台詞が微妙に違う気がします。しかしファミコン版の内容を全て覚えているはずもなく、結局良くわかりません。今のところはそんなもんです。
DS版のドラクエ4には「せんれき」というコマンドがあって、何回戦ったとか全滅したとかが分かるようになっています。5章序盤にして既に5回全滅…なんてのがバレバレです。嫌なカウントだな。
この記事にコメントする
今年の出身大学リクルータになりました。さすがにまだ細かいことは決まってませんけど、いずれ就活時期に筑波大学に訪れるでしょう。
鼻&のどが調子悪いのがなかなか直りません。部屋が異常に乾燥しているせいだと思うのですが、加湿器はどこか見えないところがカビそうで嫌なんだよなあ…。
この記事にコメントする
| < | 2007 | > | ||||
| << | < | 12 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | - | - | - | - | - | 1 |
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | - | - | - | - | - |
25年10月6日
25年10月6日
25年9月29日
25年9月29日
20年8月24日
20年8月24日
16年2月14日
16年2月14日
25年7月20日
25年7月20日
25年7月20日
25年7月20日
25年7月20日
25年7月20日
20年8月16日
20年8月16日
20年8月16日
20年8月16日
24年6月17日
24年6月17日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: