雑記

g++ のこれまたどうでもええ知識

C++のオブジェクトは実空間でどうのように配置されているのだろうか?とういことを調べてみた。(必要にかられて)

すくなくともCでは構造体の変数は宣言された順番に並びます。これは言語の規定。ではC++ではどうなるのか?タブンC++も宣言順に並ぶで正しいと思う。

しかし、問題はVirtual関数。こればっかりはインスタンス舞に呼ばれるものが違うのでメモリに配置しておかなければならないわけで・・・この部分に関してはさすがに実装依存のような気がします。

が、とりあえずg++でどうなってるかわかればいいので、とりあえず、次のようなプログラムを書いてみました。

class A{
public:
  int a;
  int b;
  A();
  virtual ~A();
  virtual void hoge();
};
A::A()
{
 a = 0x11111111;
 b = 0x22222222;
}
A::~A()
{
 printf("A\n");
}
void
A::hoge()
{
 printf("Ahoge\n");
}
これをアセンブラに変換します。 g++ -S t.cc でt.sを見てみると・・・コンストラクタらしきところ(g++では __1Aという名前になるようで)
__1A:
        pushl %ebp
        movl %esp,%ebp
        movl 8(%ebp),%edx
        movl $_vt$1A,8(%edx)
        movl $286331153,(%edx)
        movl $572662306,4(%edx)
とういことで、どうもメモリ上には int a int b $_vt$1A と順番に配置されるようです。ちなみに$_vt$1Aがバーチャル関数が格納されているテーブルで、sizeofを取ると12になります。 つまり基底クラスにおいては、Cと互換性があり、最初の構造体のメンバのデータは同じということになります。 では、このクラスから派生したクラスはどうなのでしょうか?ためしに次のようなクラスを作ってみました。
class B: public A{
public:
  int c;
  B();
  virtual ~B();
  virtual void hoge();
};
で同じようにアセンブラソースを出力し比較してみると int a int b $_vt$1A int c と並んでいる模様。sizeofは16ということになりました。なお、Virtual関数がないクラスはテーブルは何処にも入りません。普通のCの構造体となります。

Posted by issei

Category : 雑記

pipe

いまどきこういうレベルのプログラムをしてる人がどれくらいいるのかわからんですが、pipeの挙動で二日悩みました。

どうにもうまくpipeに書き込んでくれない。

おかしいのう・・・

とおもたらワケなかった。ようするにwriteしたものが全てかかれるわけじゃないという至極簡単なオチ。

あーそういえば、write(fd, buf, len); のlenを凄く大きくしてたんだった。
Posted by issei

Category : 雑記

メモリ不良その2

ということで再度交換に向かい(ちなみにソフマップ)動作確認してもらうと、ちゃんと動きやがりました。

差しが甘いんじゃないかといわれ、持ち帰りましたが、やはり動きません。

別なメモリを差せば動くので、どう考えてもメモリ不良としか思えないのですが、一度動作確認をとられているので、さてどうしたものかと考え、PCも同時購入だったので、PCがごと持ってきました。

で、動作確認してもらうと、やはり動かない。ということで今度はPCが交換の対象になり結果的に新しいPCになりました。これで解決でしょう。

で、新しいPCを持ち帰りさてと起動すると、あれ・・・起動しない・・・

さっきまで起動したのにはて?

結局交換前と全く同じ状況です。

おかしいと、メモリを抜き差ししてるとあるとき動きやがりました。どうも微妙な接触で動いているようです。ということで、再度ソフマップへ。

結局メモリを3回変えてもらて、動きました。
大山鳴動してやっぱりメモリ。つか最初からメモリ交換してくれりゃ、PC一台無駄にせず済んだはずなんですよねぇ・・・しかし2回も交換することになるとは。

長かった・・・
Posted by issei

Category : 雑記

極々内輪の話

我々ダメ仲間の一人に通称極堕先生という御方がいるのですが、この極堕氏のダメっぷりがあまりに突出しており、敬意をあらわすため

ご苦労チャン→極労ちゃん

などと忘れないよう隠語的に常にその言葉を日常的に使用しております。最近では極ちゃんとか、極とか59とか略されて、もう何がなんだか分けが分からん始末。

で、本日、たまたま大きな数というのを調べいたところ

極 = 10^48

らしいことが判明しました。

さすが極堕先生。その単位の数も半端じゃない。
Posted by issei

Category : 雑記

わけあってメモリ不良

つかまされた・・・orz

で交換してもらって、また、さしてみたらまたうごかないという。

二重苦。
Posted by issei

Category : 雑記

わけあってその2

fputcの互換品を作ることに。

めんどくせぇ。

が冷静に考えたら、とりあえず文字さえ表示できればいいので、

write(2,&c,1);

ラクチンである。
Posted by issei

Category : 雑記

わけあって

printf関数の互換品が必要に。

作り方は man va_startで一発なんだが、

これが%指定とか一通り実現しようとすると、意外とめんどくさい。
Posted by issei

Category : 雑記

またSPAMコメントがうざくなってきたので

以前のように日本語が最低1文字入ってないとエラーとなるように戻した。

これで少しは減るだろう。
Posted by issei

Category : 雑記

最近の仕事

C++書いたソースからnewを削除してくれないか?という要望が。
大人の事情らしいが、いったいなんのためのC++なのか・・・ぶつぶつぶつ。
幸いmallocはしてもいいらしいので、placement newしまくり。おかげで見にくいソースに。

libpcapでパケットをキャプチャすることができないかとご相談。
やってみたが100Mくらいだと結構取り落とす。さてどう解決したものか。
Posted by issei

Category : 雑記

Honolulu Walking のルート

折角なので明日歩いてみようと思ったり。健康のためでもあります。ちょっと暑いのが気になりますが。

で、肝心のコースですが、公式サイトではストリート名まで詳しく書いていないので、細かいコースがわからりません。そこであちこちのサイト(主に海外サイト)を参考にルートマップを調べてみました。

Ala Moana Park -> Ala Moana Blvd. -> Nuuanu Ave. -> S.King St. -> Kapiolani Blvd. -> Piikoi St. -> Ala Mona Blvd. -> Kalakaua Ave. -> Kapiolani Park

多分これであってるはず。
Posted by issei

Category : 雑記