タグ

Cに関するono_matopeのブックマーク (26)

  • memcpy と memmove - a.out

    事の始まり 研究でプログラムを書いていたときの話。 ローカル(Mac OS)では問題なく動作していたプログラムが、サーバ(Linux)に移した途端なぜか Segmentation Fault でクラッシュするということがあった。 セグフォは許可されていないメモリ領域にアクセスした時に起こるエラーで、経験上 配列へのアクセスでミスをしているパターンが多い。 どうせ今回もそのパターンだろうと思ったけど、何度確認してもおかしいところは見つからない。 特にそのプログラムではきちんとテストを書いていたので、配列へのアクセスミス程度であればすぐに気づくはずだった。 埒が明かなかったので、今度は標準ライブラリの関数の使い方にミスがないかをチェックしていくことにした。 (そのプログラムでは memcpy を多用していたので、もしかすると memcpy の第1引数と第2引数の順番を間違えたのかも…と思っての

    memcpy と memmove - a.out
    ono_matope
    ono_matope 2015/01/13
  • 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

  • Facebook、独自開発のC++ライブラリ「Folly」をオープンソース化

    Facebookのエンジニアチームは6月2日(米国時間)、Facebookで使用しているC++ライブラリをオープンソースソフトウェアとして公開した。公開されたC++ライブラリのことをFacebookでは「Folly」(Facebook Open-source Library)と呼んでいる。 Facebookではこれまでに、PHPコンパイラの「HipHop」、RPC開発フレームワークの「Thrift」(現在はApache Thrift)、NoSQLデータベースの「Cassandra」(現在はApache Cassandra)、ログデータ収集ツール「scribe」、など多くのソフトウェアをオープンソースにして公開してきた。 エンジニアチームによると、Facebookでは内部で多くのオープンソースソフトウェアを利用しているが、非公開のライブラリコードがこれらソフトウェアの公開の妨げになっており、

    ono_matope
    ono_matope 2012/07/05
    ほう
  • Makefile は簡潔に書きましょう - pyopyopyo - Linuxとかプログラミングの覚え書き -

    仕組みが判ってしまえば Makefile は簡潔に書けます.$(CC) とか $@ とか $< なんて変数は使ったら負けです. 基(その1) ソースコード hoge.c から 実行形式のバイナリ hoge を生成するMakefileは,以下のように書きましょう all: hogeこれだけです.これで $ make all とすると hoge が生成されます 重要な点は,間違っても all: hoge hoge: hoge.c $(CC) hoge.c -o hogeのようなMakefileを書かないことです.このようなMakefileでは #!/bin/sh CC=gcc $CC hoge.c -o hoge というようなシェルスクリプトと同程度の使い勝手しかありません. 基(その2) ここで例えば-O3 を付けてコンパイルしたい場合や,-lm を付けてリンクしたい場合は以下のようにし

    Makefile は簡潔に書きましょう - pyopyopyo - Linuxとかプログラミングの覚え書き -
  • GCCのコンパイルオプションで関数トレーサ - torutkのブログ

    このの「#77 関数へのenter/exitをフックする」で、GCCのコンパイルオプション-finstrument-functionsを使い、関数が呼び出された時、関数から復帰するときにフックを入れる方法が紹介されています。フック関数のシグニチャは以下です。 void __cyg_profile_func_enter(void* func_addr, void* call_site); void __cyg_profile_func_exit(void* func_addr, void* call_site); このフック処理に渡されるアドレスから関数名を出して、関数の実行を追う簡易な関数トレーサを作成します。アドレスから関数に変換する方法で一番簡単そうなのは、同じの「#62 dlopenで実行時に動的リンクする」でglibcのGNU拡張として紹介されているdladdr関数です。 #i

    ono_matope
    ono_matope 2011/10/31
  • backtrace - 兼雑記

    で、そういう理由でこう、何度目かの backtrace 実装とかしてたんですが、 glibc の backtrace って DWARF2 使う実装とかあるんだなーと気付いた。 GCC ならこれ使うのが一番楽だし、 -fomit-frame-pointer ついてても大丈夫とか偉い。 // They are in libgcc (see glibc-2.7/sysdeps/ia64/backtrace.c) extern(C) int _Unwind_Backtrace(void* fn, void* a); extern(C) void* _Unwind_GetIP(void* ctx); struct Arg { void** buffer; int size; int cnt; } int backtrace_helper(void* ctx, void* data) { Arg* a

    backtrace - 兼雑記
    ono_matope
    ono_matope 2011/10/29
  • 訃報: C 言語の開発者、デニス・リッチー氏が死去 | スラド デベロッパー

    Google+ で Rob Pike 氏が語ったところによると、C 言語の開発者、K&R の R であるところの Dennis Ritchie 博士が亡くなられた。70 歳 (Rob Pike 氏による Google+ への投稿) 。 長らく闘病中だったとのことで、先週末に自宅で息を引き取ったそうだ。

    ono_matope
    ono_matope 2011/10/13
  • サービス終了のお知らせ

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

  • itoa with GCC | C/C++

    Introduction Credits Development Latest Versions Performance Comparison How do I use itoa() with GCC? Arrgghh C/C++! It would appear that itoa() isn't ANSI C standard and doesn't work with GCC on Linux (at least the version I'm using). Things like this are frustrating especially if you want your code to work on different platforms (Windows/Linux/Solaris/whatever). Many people say that you should j

    ono_matope
    ono_matope 2011/03/25
    itoa実装
  • Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング - 簡潔なQ

    今年の文化祭で書いた記事です。 - C言語といえば、いやなイメージ、過去の遺産といった感じがあるかもしれません。 C言語のネガティブな側面というと、やはりポインタやメモリ管理などが難しい、ということが思いつくかもしれません。 しかし、C言語のポインタは表記に騙されやすいだけで、仕組み自体は全く難しくありません。 文法も、どこぞのPerlC++と比べたら屁でもない単純さです。 実のところ、仕様が煩雑で難しいのは、Cプリプロセッサなのであります。 普段からあまり複雑な使いかたをしないから気づかないかもしれませんが、Cプリプロセッサの置換処理は、欺瞞と裏切りに満ちた世界なのです。 これが進化するとテンプレートなどといったもっと面白いものになるのですが、今回はCプリプロセッサで計算をしちゃったりするところまで試しにやってみましょう。 (なお、GCCにより実験的に調べた記事なので、他のCコンパイラ

    Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング - 簡潔なQ
    ono_matope
    ono_matope 2011/03/18
    「トークンの結合」「ここらへんから気味が悪くなってきますね。」
  • コンピューター:C言語講座:共有ライブラリについて

    コンピューター:C言語講座:共有ライブラリについて 概要 今回はC言語講座の読者の方からの提案で、共有ライブラリを取り上げます。 共有ライブラリは、静的なライブラリが実行形式に合体されるかたちでリンクされるのと違い、実行時に動的にリンクされるものという定義で、しかも他のプロセスと共有するかたちで実行時にリンクされて使われるものです。UNIXでは、プロセス間でファイルを共有するというと、mmap()を思い浮かべますが、まさにこれを使用し、共有ライブラリをマップして動作するものです。 一般のライブラリは、arコマンドによりアーカイブされて、要するにオブジェクトファイルを固めてつくるようなもので、普通は拡張子として「.a」を使用します。共有ライブラリはarコマンドは使用せず、ccコマンドから実行されるldコマンドが作成します。一般的に拡張子として「.so」を使用します。 ccあるいはldコマンド

    ono_matope
    ono_matope 2009/03/12
  • Linus「C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが 簡単に生産されるようになってる」

    /15 [4] (21:54) 原文: http://lwn.net/Articles/249460/ From: xxx To: xxx Subject: Re: [RFC] builin-mailinfo.c をマシな文字列ライブラリを使うようにすること Date: Thu, 6 Sep 2007 18:50:28 +0100 (BST) Message-ID: <alpine.LFD.0.999.0709061839510.5626@evo.linux-foundation.org> On Wed, 5 Sep 2007, Dmitry Kakurin wrote: > > Git のソースコードを最初に見たとき、ヘンだと思ったこと: > 1. C++ じゃなくてただの C を使ってる。理由は謎。移植性がどうとか言わないで、 > そんなのウソに決まってるから。 *あんた* のほうこそ

  • mysqlに独自関数を組み込む(UDF) - download_takeshi’s diary

    mysqlには独自のユーザ定義関数を組み込むことができる「UDF」(User Defined Function)って機能があります。 例えばsennaのsnippetなどもUDFとして書かれてるみたいです。 mysqlに詳しい方々の間では結構メジャーなもののようですが、実際に使ってみたことがなかったので、ちょっと試してみました。 作ってみる関数 mysqlには現在時刻をミリ秒まで表示してくれる機能がないようなので、それを作ります。 ということで現在時刻をミリ秒まで表示する関数をUDF(User Defined Function)として組み込んでみます。 関数名は「ミリ秒」をあらわす直感的なフレーズで「msec」としました。 ゴールイメージ select msec(); とすると現在時刻をミリ秒まで表示。 select msec("epoch"); とするとunix timeをミリ秒まで表示

    mysqlに独自関数を組み込む(UDF) - download_takeshi’s diary
    ono_matope
    ono_matope 2008/11/10
    MySQLのSQL関数を独自定義する方法
  • ウェブ開発に有用そうなC/C++ ライブラリについてのまとめ - TokuLog 改めB日記

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

  • Webサーバ書くのって流行りなの? - グニャラくんのグニャグニャ備忘録@はてな

    Memcachedの添え物として扱われている(ような気がする) libeventちゃんカワイソウ。 libevent というわけで、libeventとsennaを使って COOKIEによるセッション維持機能がついたWebサーバを書いてみた例。 (Sennaは単なるハッシュライブラリとして使っています。) mainを書き下すと、 Senna初期化 libevent初期化 httpd機能開始 URIごとにハンドラ関数を設定 イベントをガンガン処理 といった感じ。 Cでこれくらいの長さだったら、 妥当だと思います。 バグがありそうだし、セッション変数の種も適当だけど、 気にするなってことで。 実用にはならないけど、サンプルの1つとしてどうぞ。 LLな言語のインタプリタなんかを抱え込むと面白いのかもね。 #ifdef WIN32 #include <winsock2.h> #include <wi

    Webサーバ書くのって流行りなの? - グニャラくんのグニャグニャ備忘録@はてな
  • libev

    A full-featured and high-performance (see benchmark) event loop that is loosely modelled after libevent, but without its limitations and bugs. It is used in GNU Virtual Private Ethernet, rxvt-unicode, auditd, the Deliantra MORPG Server and Client, and many other programs. Blurb Features include child/pid watchers, periodic timers based on wallclock (absolute) time (in addition to timers using rela

    ono_matope
    ono_matope 2008/09/30
    libeventより速いイベントループライブラリ…らしい。
  • Chat server

  • ソケットの使用法

    ソケットの概要 ソケットとはアプリケーションをインターネットに接続するための機構です。 インターネット通信をサポートするサーバーやクライアントには必ずソケットが必要になります。 以下では、ソケットの実際的な使い方を、 サーバーを作成する場合とクライアントを作成する場合とに分けて解説します。 なお、ここで説明する内容は、開発環境がWindowsであることを想定しています。 Unixでソケットを使いたい場合は別の文献を参照してください。 また、ソケットを使う際に注意するべきことがあるので、「注意!」にまとめました。 プログラミングの際には必ず一読してください。 サーバーの作成法(TCP) ここではTCP通信をベースとしたサーバーの構成法について解説します。 図1にサーバー作成での基的な操作の流れを示しました。 この章では初期設定に必要なsocket, bind, li

  • コンピューター:C言語講座:共有メモリについて

    コンピューター:C言語講座:共有メモリについて 概要 共有メモリは複数のプロセスで共有できるメモリで、プロセス間通信で最もシンプルで高速なものではないかと思います。使い道としては複数のプロセスでデータを共有したり、メッセージやフラグとして使用するのにも良いと思います。 UNIXでは共有メモリを含むプロセス間通信機能をまとめてIPC(Inter Process communication)として管理しており、メッセージキュー・共有メモリ・セマフォがそのなかに含まれます。ipcsコマンドを使用するとそれらの使用状況をみることが出来ます。 使用方法 共有メモリの使用方法は非常に簡単で、shmget()システムコールで共有メモリ・セグメント識別子を獲得し、shmat()システムコールで自プロセスのデータセグメントにマップ(アタッチとも呼ぶ)します。他のプロセスも識別子さえ指定してshmat()を行

    ono_matope
    ono_matope 2008/09/02
  • プログラミング言語 C の新機能

    プログラミング言語 C は 1990 年に ISO で規格化された言語です。その後、何度かの誤りの訂正や wchar_t 型の追加といった追補がなされた後、さらに使いやすくするための新しい機能が検討されてきました。そして、1999 年、ついに新しいプログラミング言語 C の仕様「ISO/IEC 9899:1999 - Programming Language C」(略称 C99) が 1999/12/01 付けで規格として出版されました。ここでは、その新機能を説明します。