タグ

cに関するgologo13のブックマーク (23)

  • sprintf を最大10倍以上高速化するプリプロセッサ「qrintf」を作った

    最近H2OというHTTPサーバを書いているのですが、プロファイルを取ってみるとsprintfが結構な時間をっていて不満に感じていました。実際、sprintfは数値や文字列をフォーマットするのに十徳ナイフ的に便利なので、HTTPサーバに限らず良く使われる(そしてCPU時間を消費しがちな)関数です。 では、sprintfを最適化すれば、様々なプログラムが より高速に動作するようになるのではないでしょうか。ということで作ったのが、qrintfです。 qrintfは、Cプリプロセッサのラッパーとしてソースコードに含まれるsprintfの呼出フォーマットを解析し、フォーマットにあわせたコードに書き換えることで、sprintfを高速化します。 たとえば、以下のようなIPv4アドレスを文字列化するコード片を sprintf( buf, "%d.%d.%d.%d", (addr >> 24) & 0xf

  • Cのエラーハンドリングと例外設計、例外処理のメモ - 百日半狂乱

    二十五日半狂乱、6日目(の分...orz)の記事 Cのエラーハンドリングを毎回やるのは面倒だ! 前回も言ったが、Cではエラーハンドリングに戻り値とerrnoを用いる. それはそうと例外設計において"無視"は大罪である. だから、関数を呼び出したら戻り値は漏らさずチェックすべきだ. ということで、例えば以下のように逐一戻り値をチェックする. if(send(sockfd, buf, len, 0) < 0){ ERROR("send"); exit(1); } あぁ、面倒だ. 一体コードのどの部分が正常系の処理なのか? ほとんどエラーハンドリング*1で埋め尽くされるじゃないか. そもそもエラーハンドリング部分に書くのは毎回同じコードだし、コードの繰り返しは防ぎたい. エラー処理部分をラッピングして楽をする unpv12eの中でラッパーを被せることによってこの面倒を回避する方法を知った. in

    Cのエラーハンドリングと例外設計、例外処理のメモ - 百日半狂乱
  • データ型のアラインメントとは何か,なぜ必要なのか?

    以前このサイトとブログに,何度かアラインメントに関する記事を書きました (サイト内関連ページ参照). そのせいか「アラインメント」で検索して来てくれる人が多いので, 過去の記事に加筆修正してこのページを新たに作成しました. 加筆した点は次のとおりです. アラインメントとメモリアクセス回数の関係をわかりやすくするため, (ほんの少し) 図を導入しました. 「データがアラインされていないとメモリアクセス回数が増える」 と言葉で説明しているサイトは多いのですが, 図で示しているところはまだ見たことありません. アラインされていないアドレスにデータを書き込む場合, 読み出しの場合以上にメモリアクセス回数がかかる可能性があることを追記しました. 以前は「複合データ型 (配列,構造体,共用体) のアラインメント」はほとんど自明のことだと思っていたので軽く流していましたが, 意外なことにこれを解説してい

    gologo13
    gologo13 2013/12/29
    勉強になった。SIGBUS とかこういう意味だったんだ。
  • Now or Never » About Static Variable in C Language

    C 言語における static 変数について。 static 変数とは、 static int a = 0; のように、static で宣言された変数は同じ領域がその変数のために存在することが保証されている、という変数である。 私が static 変数に関して、今日学んだのは以下の2点。 初期化は初回のみ行われる。 2回目以降の初期化は効果がない。 例えば、上のプログラムは二分探索木を入力として受け取って、木の構造を考慮しながら、表示する関数である。 木に input の値を順に追加した時の printtree の結果が output である。この printtree は再帰関数(recursive function)になっている。 そのため、 static int depth = 0; が printtree が再帰的に呼び出されるたびに、実行されて depth の値が 0 となるはず

  • ポインタの裏話

    ポインタの裏話 岡﨑 直観 okazaki at ecei.tohoku.ac.jp http://www.chokkan.org/ @chokkanorg ポインタの裏話 プログラミング演習A 1 このような説明を 覚えていますか? 知らなくても全く問題ありません ポインタの裏話 プログラミング演習A 2 int x = 0; &xは変数xの「アドレス」 「番地」「住所」を返す 変数x 0 &x メモリ空間, 記憶空間 変数xのアド レス(住所) ポインタの裏話 プログラミング演習A 3 ____ / \ 何言ってたんだこいつ? / ⌒ ⌒\ 番地 アドレス ぬるぽ / (●) (●) \ \ / | 、“ ゙)(__人__)" ) __________ \ 。` ⌒゚:j´ ,/ j゙~~| | | | __/ \ |__| | | | || / , \n||

  • サービス終了のお知らせ

    サービス終了のお知らせ いつもYahoo! JAPANのサービスをご利用いただき誠にありがとうございます。 お客様がアクセスされたサービスは日までにサービスを終了いたしました。 今後ともYahoo! JAPANのサービスをご愛顧くださいますよう、よろしくお願いいたします。

    gologo13
    gologo13 2011/04/28
    知らんかった。→変数strはローカル変数ですから、getstring関数が終了した時点で、メモリ上から消えてなくなってしまいます。
  • Page not found - ファイヤープロジェクト

    The page you are trying to reach does not exist, or has been moved. Please use the menus or the search box to find what you are looking for.

    gologo13
    gologo13 2011/03/21
    gdb でスタックフレームまで見れるのか。すごい
  • GTK+ でプログラミング:基本形 - えがわたにっき

    とりあえず、GTK+ で何かを作るときに基形となるものをば。これを拡張していけば大抵のものは作れるかと。w ちなみに、GTK+ の関数仕様については、DevHelp というマニュアルを使って調べるのが便利。メニュー Application → Programming の中に入っていると思う。入ってなかったらアプリケーション追加でインストールしておく。 まずプログラム全体はこんな感じ。 1 #include <gtk/gtk.h> 2 3 static void destroy(GtkWidget *window, gpointer data) 4 { 5 /* メインループを終了 */ 6 gtk_main_quit(); 7 } 8 9 int main(int argc, char *argv[]) 10 { 11 GtkWidget *window, *label; 12 13 /

    GTK+ でプログラミング:基本形 - えがわたにっき
    gologo13
    gologo13 2011/03/21
  • 『オブジェクト指向講座 スタック領域とヒープ領域』

    令和からの働き方について -TownSoft- 元「傲慢SE日記」で、しばらく放置していました。 2020年からはこれからの働き方などについて書いて行こうかと思います。 カテゴリーは手続き型言語になれている人がどうやったらオブジェクト指向を理解できるのかを考えて書いている記事です。 多少の言語知識があることを前提に進めます。 C#やJava等の言語では肝となる部分です。 この概念が分からないとガベージコレクションの概念が分かりません。 そして、この概念を持っているとオブジェクト指向の理解が早まります。 さて、スタック領域は皆さん知っているはずです。 特にC言語を使っている方はお手の物のはずです。 なぜなら、 普段使っている領域 ですから。 まぁ、順を追って一つずつ解決していきましょう。 まず。ポインタの概念からゆっくりと解決していきましょう。 int i = 0; この書式はint型のi

    『オブジェクト指向講座 スタック領域とヒープ領域』
    gologo13
    gologo13 2011/03/21
    コレは分かりやすい。
  • popenとpclose - ファイヤープロジェクト

    popenとpcloseは指定したsystem関数にパイプ機能を加えた感じで使用できる.実際shell経由で引数のコマンドを渡すので,オーバーヘッドは大きいがワイルドカードなどを使用できる.で,パイプを使用すると,あるコマンドの出力を別のコマンドの入力に使用できる.例えば dmesg | head では,dmesgの出力がheadの入力となりそしてそのheadの出力が端末に出力される. 読み込むpopenはファイルストリームを開く.pcloseは閉じる.popenではファイルストリームが読み込み用か書き込み用かどちらかを選択する.読むか書くかと聞かれたら,なんとなくまずは読んでみたい気がするのは私だけだろうか.読み込み用で開く場合,popenしたプロセスはコマンドラインでは|の右側ということになる.以下,popenで読み込み用パイプストリームを開いた場合のサンプル. #include <s

  • BohYoh.com-C/C++ FAQ mallocに対するcallocのメリットは何ですか。

    calloc関数を使えば、構造体や共用体の内部に作られる“詰め物”のビットもすべて0になります。この“気持ちよさ”を得るためには、malloc関数でなく、calloc関数を使わなければなりません(笑)。 ― すべてのビットが0になっても、浮動小数点数やポインタの値は0になるとは限らないですよね。それだったらmalloc関数で確保した後に0を代入すればいいのではないですか。 まあ、そうもいえるでしょう。ここで、第1章に示した図を再びFig.7-5に示します。 これは、int型が記憶域上に32ビットを占有していても、実際には28ビットしか使わない処理系もあり得る、ということを示すものでした。この整数に0を代入すると、確かに有効なビットの全ビットが0がとなります。 しかし、未使用ビットにまで0が代入されるという保証がないことに注意しましょう。 整数型オブジェクトの全ビットが0であれば、値も0であ

    gologo13
    gologo13 2010/09/29
    malloc calloc
  • strtok

    文字列を区切り文字で分解する 【書式】 #include <string.h> char *strtok(char *s1, const char *s2); 【説明】 分解対象文字列 s1 を、文字群 s2 中の文字を区切りに字句(トークン)に分解します。 次のような手順で strtok() を用いて文字列をトークンに分解することが出来ます。 最初の呼び出しでは s1 には分解対象の文字列を指定します。トークンがあれば、strtok() はトークンへのポインタを返却します。 2回目以降の呼び出しでは s1 に NULL を指定します。分解できるトークンがあるうちは、strtok() はトークンへのポインタを返却します。 トークンがなくなると strtok() は NULL を返却します。 strtok() はトークンへのポインタを返却しながら、分解対象文字列 s1 中の区切り文字に空文字

    gologo13
    gologo13 2010/09/25
    regexpは使えない split の代わりにはなる感じ.
  • 日本語表示 KanjiSample

    当初ここでSDL_Kanjiを使った日語表示を紹介する予定でした しかし、今回は取りやめて日語表示そのものの処理を紹介します SDL_Kanjiを取りやめた理由はbdfフォントを使っていることです このサイトはWindowsユーザで初心者の人が対象なので、 そういった人たちにbdfフォントの入手の説明を別途やる必要があります 実は簡単に入手できるんですが、bdfフォントの入手の解説を行うくらいなら、 日語表示そのものの解説をやったほうがいいのかなと思い、変更しました とはいえSDL_Kanjiの方が機能が充実していますので、今回のやり方で満足できない人は 是非SDL_Kanjiを使ってみてください SDL_Kanjiにはサンプルソースがついているので使い方はわりとすぐ理解できると思います SDL_KanjiのサンプルでVCの注意点としては、付属のサンプルのプロジェ

    gologo13
    gologo13 2010/09/20
    c言語で日本語の文字の表示など
  • コンパイル時の典型的エラー集

    コンパイル時に、たとえば $ gcc -o prog1 prog1.c prog1.c: In function `main': prog1.c:9: error: syntax error before ';' token prog1.c:9: error: syntax error before ')' token prog1.c: At top level: prog1.c:14: error: syntax error before "return" のようにエラーがでます。 このエラーは得体の知れない英語ではなく、比較的わかりやすい、意味のある英語です。 「In function `main'」=「main()のなかのどっかで」 「9: syntax error before ';'」=「9行目の;の前に文法エラー」 などです。 間違いをつぶしていくこつは、 とりあえず、一番最初

    gologo13
    gologo13 2010/09/19
  • http://d.hatena.ne.jp/hyu_mu/20100731/1280535832

  • c-eldoc.el で C 言語プログラミング革命 - mooz deceives you

    emacs は人生 先日, また Life Changing なものに出会ってしまいました. 最近, 毎週のようにこの言葉を使っていて僕はどれだけ人生を変えれば気が済むのかという話なのですが, 出会ってしまったのです. c-eldoc.el に. eldoc.el 皆さん, eldoc.el をご存知でしょうか. Emacs Lisp を少しでも書かれるという方なら絶対に使っておきたいパッケージの一つが, この eldoc.el です. カーソル付近の関数に対する引数のリストをエコーエリアへ表示してくれたり, カーソルの位置から対応する引数を割り出しハイライトしてくれたり, もうこれなしで elisp を書く気などおきません. さらには eldoc-extension というパッケージを入れることにより関数や変数のドキュメントを表示してくれる機能まで追加され, もう至れり尽くせりです. 詳

    c-eldoc.el で C 言語プログラミング革命 - mooz deceives you
  • K&R malloc/free作ってみた - narihiro.info(動画)

    K&Rにのってたmalloc/freeを作ってみました。(約60分) 正気の沙汰とは思えないほど長いですね。反省。 まろっくはむずかしい #include <stdio.h> #include <stddef.h> #include <stdlib.h> /* K&R malloc Heap +--------------------------------------------------------------------- | alloc |header next ...........| allocated |header next.... | +--------------------------------------------------------------------- ^ +-----------------------------^ +-------------

    gologo13
    gologo13 2010/05/03
  • 何故駄目なのか?: 御手洗特急途中下車

    C言語で配列に配列を代入するのは何故駄目なのか C言語で配列に配列を代入すると、コンパイルエラーが発生します。例えば以下のコードをgccでコンパイルしようとすると、"incompatible types in assignment"というエラーが発生します。 1 /* header files */ 2 #include <stdlib.h> 3 #include <stdio.h> 4 5 /* main */ 6 int main (int argc, char *argv[]) { 7 char c1[] = "afa"; 8 char c2[4]; 9 10 c2 = c1; 11 12 return EXIT_SUCCESS; 13 } |10| error: incompatible types in assignment "incompatible types in assi

    gologo13
    gologo13 2010/04/06
    左辺が全体,右辺が最初のポインタか.
  • プログラムはどう動くのか? 〜 ELFの黒魔術をかいまみる

  • CとC++での例外処理、第1部

    このブラウザーはサポートされなくなりました。 Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。 Robert Schmidt 1999 年 5 月 10 日 Robert Schmidt は初めてのコラムで、C++ で例外を処理する方法を解説します。 はじめに ご機嫌いかがでしょうか。今度新たに MSDN Online Voice に加わった Robert(Bobby)Schmidt です。C と C++ を使うプログラマを対象とした私の連載コラム Deep C++ へようこそ。このコラムの前置きとして、まずは自己紹介と、このコラムが MSDN の中で占める位置について説明させていただきます。 収入を得ることがプロの証なら、私のプログラマとしてのキャリアは 18 年前に故郷のオハイオ州デイトンで始まりま

    CとC++での例外処理、第1部