--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2009/05/30

DataInput/DataOutput インタフェース

Java の DataInput/DataOutput に相当するインタフェースが、C++ (STL) やら C# (.NET) ライブラリにはなかったりする。もちろんそれらのライブラリで用意されている仕組みを使えば、同じものを実現することもできる。

データ IO するときに結構重宝してたもんで、用意されてるのが普通と思ってた。

2009/05/21

std::vector にポインタを突っ込む

最近の仕事はもっぱら不慣れな C++ を使っていて、ようやくコツを掴みはじめた感じ。値とポインタだけの C ならまだ分かりやすかったのだけど、これに参照が混ざった途端にやたらと混乱した。

値として受け渡しのできないクラスのインスタンスを STLコンテナに突っ込みたいときには boost の shared_ptr みたいなスマートポインタでラップするのが安全でいいよって話はよく見かける。じゃあ生のポインタを突っ込んだらどうなるのというお話。結果は予想通りだったのだけど、まぁやってみたという記録だけ。

ちなみにその予想とは、コンテナを値で受け渡しても、それに内包されているポインタたちは値コピーされるだけ。ポインタが指してるオブジェクトの実体は、何も変わらない。shared_ptr ならコンテナが値渡しされるタイミングで、自身もコピーコンストラクタに渡される。この時(参照カウント方式で shared_ptr が実装されていれば)参照カウントが +1 され、渡した先のブロックが終了したタイミングで参照カウントが元に戻る。で、自分のブロックが終わったタイミングでカウントが 0 になり、オブジェクトの実体も破棄される(という仕組みだと思ってる)。

以下実験のコード。

#include <vector>
#include <iostream>

using std::vector;
using std::cout;
using std::endl;

class X {
public:
    X() { cout << "Default Constructor" << endl; }
    X(const X& x) { cout << "Copy Constructor" << endl; }
    X& operator=(const X& x) { cout << "op=" << endl; return *this; }
    ~X() { cout << "Destructor" << endl; }
};

void withValue(vector<X*> x) { cout << "withValue" << endl; }
void withRef(vector<X*>& x) { cout << "withRef" << endl; }
void withPtr(vector<X*>* x) { cout << "withPtr" << endl; }

void withValue(vector<X> x) { cout << "withValue" << endl; }
void withRef(vector<X>& x) { cout << "withRef" << endl; }
void withPtr(vector<X>* x) { cout << "withPtr" << endl; }

int main() {
    cout << "vecotr<X*>" << endl;
    vector<X*> xps;
    xps.push_back(new X());

    withValue(xps);
    withRef(xps);
    withPtr(&xps);

    vector<X*>::iterator i;
    for (i = xps.begin(); i != xps.end(); ++i) {
        delete *i;
    }

    cout << endl << endl;

    cout << "vecotr<X>" << endl;
    vector<X> xs;
    xs.push_back(X());

    withValue(xs);
    withRef(xs);
    withPtr(&xs);

    return 0;
}

結果。

$ ./a.out
vector<X*>
Default Constructor
withValue
withRef
withPtr
Destructor


vector<X>
Default Constructor
Copy Constructor
Destructor
Copy Constructor
withValue
Destructor
withRef
withPtr
Destructor

原則、生のポインタを STL コンテナに突っ込むようなことはしないほうがいいのだろうけど。shared_ptr が使えないとか、shared_ptr を自前で実装するのが面倒なときなんかは気をつけて使ったりするといいんじゃなかろーか。いやよくはないか。

2009/05/15

ubuntu で省電力化 - powernowd

powernowd てのをインストール (apt-get install) すると、負荷に応じて CPU のクロック数を上げ下げしてくれる。CPU の温度がひどいことになっていたのだけど、だいぶ改善した。

Linux/BSD で違ったり、Linux の中でもディストリごとに違ったりするのだけど、大体このようなことをしてくれるアプリケーションは用意されているみたい。

2009/05/13

行単位処理

シェルスクリプトで、あるコマンドから出力されたテキストを一行単位で変数に格納し、処理するというもの。いつも忘れるのでメモ。

COMMAND | # 処理したい出力を伴うコマンド
while read l
do
    # l に一行分のテキストが束縛されてる
    PROCESS "$l"
done

もっとも、この方法は色々と試行錯誤している内に見つけたものなので、もっと一般的な方法があるのかもしれない。

2009/05/10

Unicoded-spam.png

NetBSD wiki の Unicode に関するページに載せられてる画像で、いちいち笑ってしまう。なんでこんなの使ってんだよと。

2009/05/10

manpages-dev

最近ちょこちょこ不慣れな C/C++ でプログラムを、仕事 (C++) とプライベート (C) で書いている。これらを書くときは大体 *BSD。関数の戻り値の仕様やらなんやらを調べたいときには、man page で片付くことが多い。

で、ふと自宅 PC (Ubuntu) で C プログラムを書いてて同じノリで man page を引こうとすると、ページがないと言われた。こんなのもないのかよちくしょーと諦めていたのだけど、どうやら独立したパッケージ (manpages-dev) になっていたらしい。これをインストールしたら解決。man 2 open とかできた。

ubuntu はデフォルトでは、ところん開発環境がないのだなぁということを改めて実感。まぁ普通はいらないのだろうな。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。