タグ

関連タグで絞り込む (199)

タグの絞り込みを解除

Cに関するtyruのブックマーク (427)

  • reallocの怪 - Qiita

    「じゃあbzeroなんて要らないんじゃないの?」という意見もまあもっともなのですが、しかしながら、memset関数の99%はゼロクリアのために使われると言っても過言ではないのではないかと思うほど、この関数の第二引数は0のことが多いと思います。しかも、memset関数の第二引数と第三引数は非常に紛らわしいため、しばしば取り違えられるバグの温床となります。 したがって、私なんぞはゼロクリア専用の関数を用意しておいてもバチは当たらないと思うのですが、そういう意見をrejectする時に必ず使われる印籠のような言葉があります。それが直交性という考え方です。つまり、標準関数としては、機能が重複しない(=直交した)ミニマルな関数セットだけを用意して、プログラマにはその組み合わせであらゆることを実現させようという考え方です。これに従えば、「既にmemset関数でできることのために、新しく関数を用意する必要

    reallocの怪 - Qiita
    tyru
    tyru 2017/07/04
  • Big Sky :: Ruby の Array#<< は Array#push よりも速いか

    巷の噂で Ruby の Array#<< が Array#push よりも速いと聞いたので調べてみた。まずはベンチマークを取ってみた。 require 'benchmark' Benchmark.bm 10 do |r| r.report "push" do 8000000.times do; [].push(1); end end r.report "<<" do 8000000.times do; [] <<1; end end end 結果は以下の通り。 user     system      total        real push         1.570000   0.000000   1.570000 (  1.579687) <<           1.280000   0.000000   1.280000 (  1.288951) 確かに Array#<< の

    Big Sky :: Ruby の Array#<< は Array#push よりも速いか
    tyru
    tyru 2017/02/12
  • プリプロセッサで足し算しましょう! - デ-mk6

    プリプロセッサは所詮文字列置換、計算なんてできやしない…そう思っている方は多いでしょう。しかしそれは違います。計算できます。 日の目的はプリプロセッサで足し算です。ADD(3, 2)と書けば5と答えてくれる関数マクロを作ってみましょう。 おっと、#define ADD(m, n) ((m) + (n)) とかではありません。これで足し算をするのは誰か、それはコンパイル・実行したときの処理系です。 今日の目的はあくまでも、プリプロセッサという処理系に閉じた足し算を定義することです。言い換えればプリプロセスが終わった時点で結果がでていないといけません。あとなんか細かいことはある感じがしますが、もうめんどいので早速始めましょう。 まずプリプロセッサにおける数を取り決めておきます。数とは、数字のみで構成されたトークンのことです。数字とは、トークンとは何かなどはめんどいので常識的に考えてください。

    プリプロセッサで足し算しましょう! - デ-mk6
    tyru
    tyru 2016/12/19
    記憶には残ってたけどブクマしてなかった…
  • <--(中略)-- 演算子 - yohhoyの日記

    プログラミング言語C++のヘンテコな演算子。💘(U+1F498) #include <iostream> int main() { int n = 100; while ( 0 <-------------------- n) { // !? std::cout << n << ' '; } } 実行結果: 90 80 70 60 50 40 30 20 10 タネ明かし 前掲C++ソースコードの振る舞いを括弧を用いて明確化する。int型の変数nに対し前置デクリメント演算子を10回適用し、その結果を値0と比較している。C++では組込み前置デクリメント演算子の戻り値は左辺値(lvalue)となるため、該当ソースコードはwell-definedとなる。 int n = 100; while ( 0 < --(--(--(--(--(--(--(--(--(--n))))))))) ) { s

    <--(中略)-- 演算子 - yohhoyの日記
    tyru
    tyru 2016/12/07
    C++ では well-defined。C では ill-formed
  • C言語、知ってるつもり? | POSTD

    「Cならわかるよ」というプログラマーは大勢います。確かにCの文法はよく知られているし、44年の歴史を誇るわけだし、あいまいな機能に悩まされることもありません。簡単ですよね! あ、「Cならわかるよ」と 言うだけなら 簡単ですよねっていう意味ですよ。学校で習った人もいるだろうしお仕事で使ったことがある人もいるでしょう。覚えることもそんなに多くないし、完璧だという人もいるかもしれません。いいでしょう。でも、Cって実は、そんなにシンプルではないのです。 嘘だと思うなら、今から挙げる問題を解いてみましょう。たった5問です。基的にはどれも同じで「戻り値は何ですか?」という問題ばかりです。四択方式で、どの問題も正解はひとつだけです。さあどうぞ。 第1問

    C言語、知ってるつもり? | POSTD
    tyru
    tyru 2016/12/04
  • 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

    tyru
    tyru 2014/10/03
  • Go言語+SWIGでC言語のライブラリを呼び出す - あんこひのにっき

    Go言語のリリース版が出たということで、今回はSWIGでC言語で書かれたライブラリのラッパーを生成してみます。 C言語だったら直で呼べるのですが、C++のライブラリを使うためにはSWIGを使うと非常に便利なので、まずはC言語で練習してみたいと思います。 環境は Ubuntu 11.10 GCC 4.6 Go1 SWIG 2.0.4 です。 参考ページは SWIG and Go http://www.swig.org/Doc2.0/Go.html です。 まずはGo言語から呼び出したいCのコードを書きます。 Hoge.h int Nibai(int num); Hoge.c #include "Hoge.h" int Nibai(int num) { return num * 2; } 次にSWIGがこのコードを解釈するための設定ファイル(.i)を書きます。 Hoge.i %module H

    Go言語+SWIGでC言語のライブラリを呼び出す - あんこひのにっき
  • Big Sky :: clib の使い勝手にマジ感動した

    C言語でアプリケーションを書くのは他の言語と比べて少し気合が必要ですよね。例えば HTTPからデータを取得する 取得したデータを json パースする 結果の一部を色付きで表示する こんな場合、C言語プログラマは 「HTTP か、じゃぁcurlかな」 「JSON か、parson かな」 「色表示か...エスケープシーケンスでもいいけどWindowsがなー...」 といった事を考え、そこから curl や parson といった資材の調達を始める事になります。途中で新しい機能を追加したくなり、それを外部ライブラリに頼る場合だとその都度資材を調達する必要があり、思考を停止しなければなりません。 この辺は rubyperl、nodejs、golang 等の様に、ちょっとした手間だけで済ませたい物です。 またC言語の場合、ヘッダファイルはシステムの include フォルダに提供元が期待す

    Big Sky :: clib の使い勝手にマジ感動した
    tyru
    tyru 2014/06/28
    C言語版bundler。依存ライブラリのセットアップが簡単便利に。
  • C言語でのポータブルなstring IOについて - wasabizの日記

    2014-01-17 C言語でのポータブルなstring IOについて Q. C言語でポータブルなstring IOを実現する手軽で簡単な方法はありますか? A. そんなものはない。 string IOないしmemoryに対するIOをFILEポインタを通して行いたいという要求は常に存在する。が、残念ながらC言語の仕様はそんなことを許してくれない。そもそもCの標準ライブラリになにかを求めるのはおおよそ間違っている。 結論として、表題のようなものをやりたければFILEポインタもどきを自作するしか無い。ほんとうに、それしかない。構造体を定義して、バッファリングを行って、stdioの関数に相当するものを自分で用意しなきゃいけない。もちろん、不完全だがより簡単な方法はいくつもある。 不完全な方法1. 環境依存のコード これが一番手軽だし、無難だ。glibcならfmemopenやopen_memstr

    tyru
    tyru 2014/01/18
  • ruby/ruby#495日本語解題

    三行で卜部って口だけ野郎でどうせたいしたもん書けないんでしょ? [1] [2]→ 見せてやんよゴラァ→ ごらんの有様教訓: 陰口は人に聞こえない所で。さすがに名指しはまずい。 どういうパッチかRubyのオブジェクトサイズを変更(大きく)する。そのことにより第一義的にはCPUキャッシュミスヒットが削減される。副次的作用として大きくなった余剰の領域にデータを詰め込めるので中間構造体を減らしてメモリアロケーションが最適化される。それらの総合的な結果として全体に高速化する。 前史とはいえこのアイディア、べつに最近涌いて出たものでもない。というか、俺がまだ大学院でNetBurstと戯れてたころの発想だから、かれこれ7~8年物だな。しかもこの間べつに秘密にしてたわけでもなくて、Rubyのオブジェクトって素数幅でいくなくね?ってのは、わりと口頭では折に触れて言ってたので、聞いたことがある人もいるはずか

    ruby/ruby#495日本語解題
    tyru
    tyru 2014/01/10
  • Why does the C preprocessor interpret the word "linux" as the constant "1"?

    Why does the C preprocessor in GCC interpret the word linux (small letters) as the constant 1? test.c: #include <stdio.h> int main(void) { int linux = 5; return 0; } Result of $ gcc -E test.c (stop after the preprocessing stage): .... int main(void) { int 1 = 5; return 0; } Which of course yields an error. (BTW: There is no #define linux in the stdio.h file.)

    Why does the C preprocessor interpret the word "linux" as the constant "1"?
    tyru
    tyru 2013/10/12
  • http://blog.monoweb.info/blog/2012/07/14/c99-array/

    tyru
    tyru 2013/09/02
    つらい
  • 革命の日々! __attribute__(alloc_size) を使わないと_FORTIFY_SOURCE を活かせないよ。という話

    _FORTIFY_SOURCEというバッファーオーバーフロー攻撃を防ぐのにとても有用なマクロがある。 知らなかった人は以下のmanでもまず見てください http://linuxjm.sourceforge.jp/html/LDP_man-pages/man7/feature_test_macros.7.html _FORTIFY_SOURCE (glibc 2.3.4 以降) このマクロを定義すると、文字列やメモリの操作を行う様々な関数を 使用する際にバッファオーバーフローを検出するための軽めのチェックが 実行されるようになる。すべてのバッファオーバーフローが検出される わけではなく、あくまでよくある例についてだけである。 現在の実装では、以下の関数にチェックが追加されている: memcpy(3), mempcpy(3), memmove(3), memset(3), stpcpy(3),

    tyru
    tyru 2013/05/05
    Vimでも_FORTIFY_SOURCE使ってた記憶あるけどちゃんと活かせてるのかな?と思って検索したら__attribute__((unused))しか使ってなかった。でもかなり多くのプラットフォームに移植されてるから使いにくいんだろうか。
  • feof関数でwhileループを回す奴はド素人 - hnwの日記

    (2013-04-07 01:30追記)補足のコードに恥ずかしい間違いがあったのを修正しました。@nonakapさん、id:s-tomoさん、ご指摘ありがとうございます。 (2013-04-07 10:00追記)「補足その2」を書き足しました。 (2017-04-23追記)論旨がわかりにくい部分があったので、整理しました stackoverflowの記事「“while( !feof( file ) )” is always wrong」をざっくり翻訳してみます。これはWilliam Pursellさんによる自作自演スレ(回答者も人)で、Cでwhile( !feof( file ) )というループを作るのが悪い理由を説明するものです。 ちなみにPHPについてもほぼ同じことが言えますので、PHPプログラマの方にも一読をお勧めします(PHPの主要なファイル操作関数はCとほぼ同じインターフェース

    feof関数でwhileループを回す奴はド素人 - hnwの日記
    tyru
    tyru 2013/04/07
    あるあるネタ
  • ファイルを画像ファイル(BMP)にしたり戻したり - Let's write β

    普通のファイルを画像にしたり、その画像からファイルに戻したりしたら面白いだろうなぁ と思っていたので、今BMPにするものを書いてみました。 #include <stdio.h> #include <stdlib.h> #include <math.h> #include "bmp.h" main(int argc, char** argv) { FILE *fp; fpos_t sz; int v, cnt; if(argc < 2) { exit(1); } if((fp = fopen(argv[1],"r")) == NULL) { exit(1); } cnt = 0; //Get File size fseek( fp, 0, SEEK_END ); fgetpos( fp, &sz ); printf("file size: %d\n",sz); fseek( fp, 0, S

  • Linux KernelのLinked Listの実装が面白い件 - 愛と勇気と缶ビール

    最近、Robert Love先生のを暇な時にダラーと読んでいたりするわけですが、それの中にLinux Kernel内部で使われているLinked Listの実装が書いてあって面白かったので共有。 まず、Linked Listの一個一個のエントリを表すstructを定義します。 struct list_head { struct list_head *next, *prev; }; いやいやいやいや。いかにC力の低い僕でも流石にこれはあきません。騙されませんよ。前後のエントリへのポインタは確かにあるけれども、これにはデータを指すためのポインタがないじゃないの。おじいちゃんまたデータ忘れてきちゃったの?いやあねえ。 おじいちゃんは言った。「それはお前の短見というものじゃ。このLinked Listは以下のコードのようにデータ構造に埋め込んで使うものなんじゃよ。」そしてそれは正しかった。 st

    Linux KernelのLinked Listの実装が面白い件 - 愛と勇気と缶ビール
    tyru
    tyru 2012/12/12
    なるほど。すげー
  • gethostbynameの落とし穴:Geekなぺーじ

    変な結果が出るサンプル 以下の例では、二つのテストを行っています。 テストの中ではwww.yahoo.co.jpとwww.google.co.jpの両方に対してgethostbynameを連続的に行っています。 当はwww.yahoo.co.jpとwww.google.co.jpの両方のIPアドレスが表示されて欲しいのですが、実際には片方しか表示されません。 #include <stdio.h> #include <winsock2.h> int main() { WSADATA wsaData; struct hostent *hostent1, *hostent2; struct in_addr inaddr1, inaddr2; WSAStartup(MAKEWORD(2,0), &wsaData); // // テスト1 hostent1 = gethostbyname("www

    tyru
    tyru 2012/11/18
    gethostbyname()の返り値は全て同じ領域を指してしまい常に最後に呼んだ結果になってしまう。getaddrinfo()は毎回動的に確保されるのでそのような心配はない。
  • Big Sky :: C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。

    前回は JSMN というのを試したけど、今度も matsuu さんのブクマから。。。 parson Lightweight json parser and reader written in C. http://kgabis.github.com/parson/ 特徴は 軽い (2ファイルだけ) 単純なAPI ドット記法による json 値のアドレッシング (C言語の構造体やOO言語のオブジェクトに似た感じ。例: "objectA.objectB.value") C89 コンパティブル テストスーツ 前回の JSMN とは違い、メモリを動的に確保するタイプ。DOM の様にルートノードから探索を始め、最終的にルートノードを指定してメモリを開放する。 今回もtwitterのタイムラインをパースしよう。 #include <assert.h> #include <string.h> #inclu

    Big Sky :: C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。
    tyru
    tyru 2012/11/04
    「C言語のJSONパーサの中では、私が知る限り一番扱いやすい」 / MEMFILEとかcurlのあたりはスニペットか既存コードから持ってきたんだろうなぁ
  • orangeduck/CPlus · GitHub

    /* ** Example C+ Program */ #include "C+.h" int main(int argc, char** argv) { /* Stack objects are created using "$" */ var int_item = $(Int, 5); var float_item = $(Real, 2.4); var string_item = $(String, "Hello"); /* Heap objects are created using "new" */ var items = new(List, 3, int_item, float_item, string_item); /* Collections can be looped over */ foreach(items, item) { /* Types are also obj

    tyru
    tyru 2012/11/01
    まるで別言語
  • Mitzyuki's Blog :: C 中級者が意外と陥りやすいワナ

    C 中級者が意外と陥りやすいワナ ある程度プログラミングにも慣れてきて 言語仕様もそこそこ理解した中級者にとって 意外と陥りやすくセキュリティホールの温床になりがちなワナ。 勿論オンラインマニュアルにも仕様として明記してあるのだが、 直感とは反する仕様のなので特に中級者にこれらのミスが多い気がする。 strncpy(3) は ``\0'' 終端してくれない場合がある strcpy(3) はバッファオーバーフローの危険性があるから strncpy(3) を利用する様によく言われるが、 ここにワナが潜んでいる。 strncpy(dst, src, len); とした時に 文字列 src の長さが len バイト未満の場合は dst は ``\0'' で終端される。 終端どころか dst の残り領域は何故か 全て ``\0'' が詰められるという 無駄とも思われる謎仕様。 ところが文字列 src

    tyru
    tyru 2012/10/05