Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode
typedef enum memory_order { memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst } memory_order; enum class memory_order : /* unspecified */ { relaxed, consume, acquire, release, acq_rel, seq_cst }; inline constexpr memory_order memory_order_relaxed = memory_order::relaxed; inline constexpr memory_order memory_order_cons
c++のstringクラスと文字列ポインタの関係について調べていたわけですよ. #include <iostream> using namespace std; class Color { string color; public: Color(string a) { cout<<"Color"<<endl; color = a; } void echo() { cout<<color<<endl; } ~Color() { } }; int main(int argc, char *argv[]){ Color c(string(argv[1])); c.echo(); return(0); }こんなプログラムで,引数で与えた文字列が表示されるのを期待しました.ところが $ c++ test.cc test.cc: In function 'int main(int, char**)':
C++11 には、複数の Lockable なオブジェクトをロックしてくれる std::lock 関数があります。 template<class L1, class L2, class... L3> void lock(L1& m1, L2& m2, L3&... m3); この関数の最大の特徴は、決してデッドロックしないことです。 そして、このデッドロックしないという要件を満たすために使われるアルゴリズムが、try-and-back-off アルゴリズムと呼ばれるものです。 今回はこの try-and-back-off アルゴリズムについて説明します。 (この記事には独自解釈が含まれているので、間違ってる部分とかあれば指摘して頂けると嬉しいです) デッドロックの条件 デッドロックは、正確ではないですが、大まかに言って以下の条件を満たすと発生します。 ロックを取得するために待機を行なう あ
上記の様に、トークンは各識別毎に作られます。オブジェクトのキーおよび値もそれぞれのトークンとして格納されます。 jsmn_parse はトークンの量が不足している場合、エラー JSMN_ERROR_NOMEM を返します。例えば、どれだけの量のトークンが JSON 文字列として与えられるか分からない場合、トークンのサイズを広げる必要があります。この場合、jsmn ではパーサを再初期化する事なしに、トークンを広げて再度 jsmn_parse を実行する事でパースを続行出来る様になっています。 ただしどれだけの量が不足していたかは分からないので、適度な増減を考慮する必要があります。 今日は試しに twitter のパブリックタイムラインをパースしてみました。 #include <assert.h> #include <string.h> #include <memory.h> #include
Code Style No.7 トップページページ一覧メンバー編集 Lemon Parser Generator - Practice 最終更新: csn7 2011年03月07日(月) 18:28:35履歴 Tweet Lemon Parser Generatorが生成したCコードをヘッダオンリーのパーサとして提供するにはどうしたら良いかのまとめ。Lemon自体とテンプレートには手を加えない縛り。なお、例題は四則演算で、Boost.Variantを生成する(スキャナはなし)。 関連記事は下記。 Boost.Variant - recursive (4) Header Only Lemon (1) Header Only Lemon (2) Lemon - malloc and realloc まずは文法ファイル。 %token_prefix MORLA_EXAMPLE_PARSER_ %
caperとは modernでクリーンなC++コードを出力するLALR(1)パーサジェネレータです。 おまけでJavaScript/C#/D用のパーサも出力できます。 ニュース・履歴はダウンロードのページで。 コンセプト caperで出力したパーサのコードを他のプロジェクトと混ぜて「手書きのパーサですがなにか?」 と強弁できるのが理想。 格闘ゲームのコマンド解析に使えるくらい使いやすく! たとえば? こんな感じの入力ファイルが %token Number<int> Add Sub Mul Div; %namespace calc; %dont_use_stl; Expr<int> : [Identity] Term(0) | [MakeAdd] Expr(0) Add Term(1) | [MakeSub] Expr(0) Sub Term(1) ; Term<int> : [Identi
形態素の頻度をカウントするというシンプルなタスクで std::tr1::unordered_map の性能について実験してみました.std::string より const char * の方がメモリを節約できるというような軽い内容です. 実験概要 実験環境は以下のとおりです. 実験環境 CPU:Core 2 Duo U9600 1.60GHz コンパイラ:gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) 入力として使用したのは,ウェブコーパスから抽出した形態素を改行区切りで保存したファイルです. 入力 サイズ:815,793,701 bytes 形態素数:133,940,786 異なり数:516,612 形態素の入力については,std::ios::sync_with_stdio(false) を呼び出した後で std::getline() を使うようにし
方式cの改良です。まず、「初期化順」の問題を避けるためには、コンストラクタを呼び出すことなく初期化が済んでいるオブジェクトでなければなりません。そのためには、mutexオブジェクトを // 方法c' (仮) void Foo::need_to_sync(void) { static StaticMutex mutex = { PTHREAD_MUTEX_RECURSIVE_INITIALIZER_NP, ........ };のように初期化できなければなりません。一般的なC++のクラスはこういう形の初期化は許されません。このような初期化を実現するためには、上記StaticMutexクラスはPOD型でなければなりません。POD型というのは、規格によると コンストラクタがあってはダメ デストラクタがあってはダメ コピーコンストラクタ、代入演算子はコンパイラが生成しないとダメ private,
mutexはスレッド間の排他処理をするための機構だが,一般的なthreadライブラリのデフォルトのmutexには大きな問題がある.あるmutexを既にlockしているthreadが再度同じmutexをlockしようとするとブロックしてしまうのだ.たとえば,thread bufferの例で,emptyを判定する部分を別メソッドにして,こちらもlockをかけるように書き直してみる. class buffer { list<int> queue; boost::condition_variable cond; boost::mutex mut; public: bool empty() { boost::lock_guard<boost::recursive_mutex> lock(mut); return queue.empty(); } ... int pop() throw(out_of_
C++ でlexer/parserをかくなら re2c+lemon がオススメな件 yacc や lex をつかっていても「なんかよくわからんけどうごく」という状態になりがちだったり、グローバル変数にまみれたりしがちだが、re2c + lemon だとそのへんがすっきりする。 レキサを以下のようにかく。yyfill を自前でかかなければいけないのがちょっと面倒だが、このようなクラスを手軽にかけるのはやはり便利である。flex ではこうはいかないのだ。 #ifndef CALC_SCANNER_H_ #define CALC_SCANNER_H_ #include <stdio.h> #include <string.h> #include <string> #include <sstream> #include <vector> #include <iostream> #include <
This is an example of simple usage. // include cmdline.h #include "cmdline.h" int main(int argc, char *argv[]) { // create a parser cmdline::parser a; // add specified type of variable. // 1st argument is long name // 2nd argument is short name (no short name if '\0' specified) // 3rd argument is description // 4th argument is mandatory (optional. default is false) // 5th argument is default value
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く