タグ

Cに関するyokochieのブックマーク (126)

  • Man page of QUEUE

  • Perlのメモリリークを見つける方法 - Islands in the byte stream (legacy)

    Perlではメモリリーク検出ツールがいくつか開発されているので、top(1)の結果を眺めるよりそういうツールを使うほうが楽である。 さて、メモリリークが発生しているとき、その可能性としてはだいたい以下の4つが挙げられる。 Perlレベルでの循環参照 グローバル変数に値をどんどん足しているとき*1 XSレベルでリファレンスカウントの管理ミス XSレベルでmalloc()したメモリの管理ミス この1-3についてはすべてPerlインタプリタ内の出来事であり、Test::LeakTraceを使って検出できる。4を検出するのは難しいが、Test::Valgrindが役に立つ。 Test::LeakTraceのSYNOPSISは歴史的経緯によりごちゃごちゃしているが、テストで使うべき関数はno_leaks_ok()とleaks_cmp_ok()だけである。 たとえば、以下のようにして使う*2。 #!p

    Perlのメモリリークを見つける方法 - Islands in the byte stream (legacy)
  • while(1){LOVE++;}を最適化 - duost

    最近ツイッターで "while(1){LOVE++}"と書き込まれてる指輪があって、 そのソースは最適化でLOVEが消えてただの無限ループになる云々という話があったので検証。 http://togetter.com/li/144840 用意したソースはこちら。 int main() { int LOVE = 0; while(1){LOVE++;} } それじゃアセンブラを見てみましょ。 まずは最適化抜き。 gcc -O0 -s hoge.c .file "hoge.c" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $16, %esp movl $0, -4(%ebp) ;LOVE=0 .L2: addl $1, -4(%ebp) ;LOVE++ jmp .L2 ;JUMP TO

    while(1){LOVE++;}を最適化 - duost
  • コンパイル時のワーニング(-Wallと-Werror)(2) : 柴田 芳樹 (Yoshiki Shibata)

    プログラミングの伝承としてif文の中で変数をある特定の値と比較する際に、その特定の値を==の左に書いて、変数を右に書くというものがあります。たとえば、C++であれば、 if (0 == ptr) { // ... }このように書く理由として、==とタイプすべきところを間違って=と書いてもコンパイラがエラーにしてくれるからだと説明されます。しかし、上記の書き方は、プログラムを読む際には、「0はptrか」と読むことになり、意味としておかしいものとなります。来なら素直にptr == 0と書いて、「ptrは0か」と読み手に読ませるべきです。※1 gcc/g++では、-Wallをコンパイルオプションで指定すれば、ptr = 0と間違って書いたとしても、次のように警告します。 warning: suggest parentheses around assignment used as truth v

    コンパイル時のワーニング(-Wallと-Werror)(2) : 柴田 芳樹 (Yoshiki Shibata)
  • 32bit/64bit 両対応な printf の書き方 - pyopyopyo - Linuxとかプログラミングの覚え書き -

    32bit/64bit両対応のコードを書いていると,よく printf() で引っかかります."%d"のような"書式"がややこしいからです. というわけで,変数の"型"と"書式"の対応を,表で整理してみました. 型 書式 注意事項 ssize_t %zd size_t %zu intmax_t %jd uintmax_t %ju ptrdiff_t %t signed char %hhd unsigned char %hhu short int %hd unsigned short int %hu int %d unsigned int %u long int %ld unsigned long int %lu long long int %lld unsigned long long int %llu int32_t %PRId32 以下,#include が必要(下記参照) uint3

    32bit/64bit 両対応な printf の書き方 - pyopyopyo - Linuxとかプログラミングの覚え書き -
  • Vim で C++ のコーディングを行うなら知っておきたい10のこと - C++でゲームプログラミング

    第二弾?わたしが普段 C++ のコーディングを行っている時の機能とか、プラグインとかのまとめです。 逆にいうと、これぐらいしか知らないので、もっと便利な機能があれば教えてください。 結構ざっくりと書いたので、分からないことがあれば、コメントか Twitter でリプもらえれば反応出来るかもしれません。 まぁ『Vim でこういう事ができるんだぜー!』的な感じで読んでもらえれば幸いです。 まえがき [使用しているプラグイン] neocomplcache SingleCompile hier Unite unite-outline clang_complete 細かい設定なんかは割愛しています。 うまく動作しなかった場合は、:help や、各プラグインのドキュメントを参照して下さい。 ☆1.複数行コメント vim-user : http://vim-users.jp/2011/03/hack20

    Vim で C++ のコーディングを行うなら知っておきたい10のこと - C++でゲームプログラミング
  • あらゆるCプログラマが未定義の動作について知るべきこと - YAMDAS現更新履歴

    LLVM Project Blog: What Every C Programmer Should Know About Undefined Behavior #1/3 LLVM Project Blog: What Every C Programmer Should Know About Undefined Behavior #2/3 LLVM Project Blog: What Every C Programmer Should Know About Undefined Behavior #3/3 コンパイラ基盤 LLVM のブログで、未定義の動作という C 言語のダークサイドについての記事が3回シリーズで公開されている。 C 言語で未定義の動作を実行したら、「鼻から悪魔が飛び出しても文句が言えない」というジョークは有名で……いや、そんなのを知ってるのは年寄りくらいか(参考:nasa

    あらゆるCプログラマが未定義の動作について知るべきこと - YAMDAS現更新履歴
  • http://blog.looseleafjs.org/entry/49/

  • コンパイラで音は変わるか?: Music TO GO!

    MacのプレーヤーソフトであるAudirvanaのプログラマDamienさんがおもしろい試みをしています。 それは異なるコンパイラで作成された3つのバージョンをユーザーがブラインドで聞き比べて投票し、次の開発に反映するというものです。 USBケーブルで音が変わるか?なんていうのはもう当たり前、ミュージックプレーヤーソフトで音が変わるか?というのもいまどきなにをという感じで、ついにコンパイラで音が変わるのかという段階に突入したわけです。 Damienさんはこれを実証するために3通りの異なるビルドを作成して、ブラインドで投票を開始しました。これが一週間くらい前です。 http://www.audirvana.com/Site_2/Compiler_test.html コンパイラというのは簡単に言うと人の書いたプログラムから機械が分かる実行コードを生成するソフトウエアのことです。OSのアップデー

  • Perlの中をgdbで覗く | BLOG - DeNA Engineering

    こんにちは。DeNAの樋口です。 Perlで書かれたアプリを動かしているときに、Perlのプロセスが今コードの何処を実行中なのか知りたいことがよくあります。そのような場合には、gdbで実行中のプロセスにアタッチし、Perlインタプリタインスタンスの内部を覗くことによって調べることができます。また同様の方法で、プロセスのコアダンプを取り、後でじっくりデバッガで調べることも可能です。 デバッグシンボル付きのPerlを用意する まず前提として、Perlの実行形式にデバッグシンボルが付いている必要があります。無い場合でも不可能ではありませんが、現実的には難しいでしょう。デバッグシンボル付きのPerlを用意する方法はOSによりますが、例えばrpmを使っているGNU/Linuxディストリビューションであればperl-debuginfoのように分離されたパッケージにデバッグシンボルが入っていることが多い

    Perlの中をgdbで覗く | BLOG - DeNA Engineering
  • C言語の魅力 : VIPPERな俺

    yokochie
    yokochie 2011/04/25
    『標準化委員会「C++全然わからんw」』 C++難しい...
  • clangでソフトウェアをビルドしC++を知る - 射撃しつつ前転 改

    clangというのはllvm向けのC/C++/Obj-Cのためのフロントエンドで、最近はGoogle ChromeとかFirefoxもコンパイルできるレベルにまで成熟してきているらしい。 いくつかのブログで紹介されているのを見ても、ふーん、ぐらいにしか思っていなかったのだが、あんな大規模なソフトウェアがコンパイルできるというのは、考えてみるとすごいことである。大事なことなので強調しておくが、すごいことである。十分に実用的なレベルに到達していることだ。ビルドも早いし生成されたコードもg++と同程度には速いというし、試してみる必要がある。 という訳で、いくつか実際にソフトウェアをビルドしてみた。試してみた限りでは、 libstdc++のtr1/unordered_mapがビルドできない C++のコーナーケースで、clangが許容しないものが多い といった問題があったが、割とどれもすんなりとコン

    clangでソフトウェアをビルドしC++を知る - 射撃しつつ前転 改
  • MySQL 5.5をわずか30秒足らずでコンパイルするためのテクニック

    べっ・・・別にソースコードなんて自分でコンパイルしないんだからねッ!!などと言わずにまず聞いていただきたい。30秒でMySQLのコンパイルが出来るというこの事実を。最近、細々とビルド時間の短縮に取り組んでいたのだが、正直ここまで爆速になるとは思わなかった。今日はビルド時間短縮のためのテクニックを紹介するので、是非皆さんも参考にして、快適ビルド生活を送って頂きたい!! 自己ベストは26.262秒マシンの状態や負荷の状況によって多少ビルドにかかる時間は前後してしまうのだが、これまでの自己ベストはなんと26.262秒。平均すると30秒ぐらい。以前は1分を切ることがなかったのだが、今ではなんとその半分でビルドが出来てしまう。これは純粋にmakeをするのにかかった時間であり、cmake(MySQL 5.5以降)やconfigure(MySQL 5.1以前)にかかる時間は除いてある。だがそれでも速い。

    MySQL 5.5をわずか30秒足らずでコンパイルするためのテクニック
    yokochie
    yokochie 2011/04/18
    確かにこれは漢(オトコ)だ
  • 彼女の友人がGCCの中の人から聞いた話 - Yet Another Ranha

    以下,エイプリルフールの記事として書いたものなので現代において読む価値はありません. ブログには地震後初めて記事を書く事になって、生存報告としては明らかに遅いですね…。でも、twitterでは元気にやっていました。今は実家にいます。 さて、つい先日東京で言語雑談会というイベントがあって、その折につくばのお家の現状を見て来ました。特別大変な事が起こっていたわけでもなく心底ホッとしました。 その翌日には、彼女と東京は新宿バルト9でサヨナラノツバサを観たのですが、その折にgcc-4.6( http://gcc.gnu.org/gcc-4.6/changes.html )の話がでました。 gccの話が出たのはCランゲッジの話をしていたからなのですが、sequence pointをどうして副作用完了点と訳したのでしょうか、とかそういう疑問が発端だった気がします。 "副作用完了点"を認識した事の無い方

    yokochie
    yokochie 2011/04/04
  • とある愚直のアロケータ - 神様なんて信じない僕らのために

    前置き。dlmallocについて書くぞ!と言っておいて書いてなかったので。orz...すみません。 あろけーたをじぶんでかいてはいけません!! なぜ、って大抵糞だからです。 例えば、こんな管理構造を持ったアロケータをよく見るんですが、 typedef struct _Allocator { unsigned char* pPool; // メモリプール int nPoolSize; // メモリプールのサイズ struct _SMemChain* pHead; // 番兵 struct _SMemChain* pTail; // 番兵 struct _SMemChain* pLast; // 最後に追加されたチェインタグ } Allocator; typedef struct _SMemChain { struct _SMemChain* pPrev; // 前のチェインタグ struct

    とある愚直のアロケータ - 神様なんて信じない僕らのために
  • clang_complete 〜高速化への道〜 - C++でゲームプログラミング

    さて、以前、vim でコード解析を行うプラグインとして、clang_complete を紹介しました。 補完の精度は優秀ですが、普通に使用すると補完に時間がかかってしまい、ストレスが溜まってしまいます。 clang_complete では、高速にコード解析を行う方法がいくつあるので、今回はそれの検証と結果をまとめたいと思います。 ★高速化する方法 1.pch(プリコンパイル済みヘッダー)ファイルを使用する その名の通り、使用するヘッダーをプリコンパイルして、clang のコード解析時に使用します。 予め、プリコンパイルしておかないとダメなので、ちょっとめんどいかも? 2.libclang libclangは、llvm に付属しているツールの1つで、コード解析を行います。 (Windows であれば、llvm のビルドを行うと libclang.dll が生成される) clang_compl

    clang_complete 〜高速化への道〜 - C++でゲームプログラミング
  • Native Client  |  Chrome for Developers

    Build with Chrome Learn how Chrome works, participate in origin trials, and build with Chrome everywhere.

  • 米Google、C/C++コードをWebブラウザ上で実行する「Native Client」最新SDKを公開 | OSDN Magazine

    Googleは2月18日、C/C++で実装されたネイティブコードをWebブラウザ上で実行できる「Native Client Software Development Kit(SDK)」の最新版を公開した。WindowsMac OS X、Linuxに対応する。 Native Clientは、x86アーキテクチャ向けのネイティブコードをWebブラウザ内でシームレスかつ安全に実行するためのオープンソース技術。C/C++を利用してWebアプリケーションを作成したり、既存のデスクトップアプリをWebプラットフォーム上にマイグレーションできるという。SDKリリースにあたって、JavaScriptのような移植性と安全性を提供する、としている。 最新のSDKはAPI、ドキュメンテーション、サンプルを含む。プラグインインターフェース「Pepper」に対応、2DグラフィックをレンダリングするNative

    米Google、C/C++コードをWebブラウザ上で実行する「Native Client」最新SDKを公開 | OSDN Magazine
  • C言語の代表的なウェブリソース10選 - YAMDAS現更新履歴

    Top 10 C Language resources that will turn you into a better programmer - C and C++ Programming Resources 今更 C 言語かと言われそうだが、Linux カーネルだって、我々が利用している LL 言語の多くだってこの言語で書かれているのである。ワタシ自身は未だどの言語よりCを愛している。 以下に C 言語に関してウェブに公開されている代表的なリソースを挙げていく。さすがに更新が長らく止まっているものが多いが、それでも有用な情報源には違いない。ネタ元は Hacker News。 C Programming Notes Programming in C - UNIX System Calls and Subroutines using C. C Lesson by Chris Sawtell

    C言語の代表的なウェブリソース10選 - YAMDAS現更新履歴
  • 開発メモ: Kyoto Cabinetのロック機構の改善

    Kyoto CabinetはIO負荷が高い場合にCPU負荷も高くなりがちだという指摘を受けて、それを解決すべくロック機構を見直したという話。 スロットロック ハッシュテーブルの操作はハッシュバケット毎に完全に独立して実行できるのが強みだ。ハッシュテーブルは計算量が有利なだけでなく、並列性にも優れるということ。実際には下層のファイルIOで実装依存の排他制御が行われることになるが、ハッシュ層だけ見れば理想的な並列性を備えている。ただし、同じバケットに連なるレコード群の操作は互いに依存関係があるので、それらは一括して排他制御してやる必要がある。となると、バケット毎にロックを用意するのが理想だが、実際にはメモリを節約するために、予め決めた数のロックを用意して、ここのロックに複数のバケットを割り当てる構成をとる。リソース空間をスロットに分けるというイメージから、これをスロットロックと呼ぼう。 スロッ