2006-05-31-01-リンカエラーと C++ 仮想関数
>> Site top >> weblog >> 月別アーカイブ >> 2006年05月のlog >> 2006-05-31-01-リンカエラーと C++ 仮想関数
最終更新日付:2006/05/31 01:00:00
リンカエラーと C++ 仮想関数
2006 年 05 月 31 日
古い記事から引っ張ってきてイジった情報。PPL の開発情報に載せようと思うのだ...こんな情報が役に立つ人も少ないとは思うが...
CodeWarrior でコンパイル&ビルドを行った際に、「○×から□△への参照が16ビット参照の範囲外です。」というリンカエラーが出ることがあります。これは、Palm OS アプリケーションが 16 ビットアドレス指定方式を使っているために、ジャンプできる範囲が+/- 32KB に制限されるからです。関数の数が多くなりすぎると、ファイルをどのように構成してもセグメント内に上手く収まらない、といった状況も発生しかねません。
しかし、C++ における仮想関数はこの制約を受けないようです。これは、仮想関数が内部的には関数ポインタのテーブルを使用した間接呼び出しによって動的に解決されるからではないかと思われるのですが、この仮想関数テーブルはさまざまな場所から利用されるため、オフセット指定のジャンプではなく、即値アドレス指定となっているものと思われます。そのため、ポリモーフィックな型として利用されるクラスを丸ごと別セグメントに移すことができます。
コンパイラの実装やアセンブラレベルの効率には詳しくないので分かりませんが、おそらく Palm OS アプリケーションでは、一般的に言われる「間接呼び出しであるがゆえのC++ 仮想関数のパフォーマンスの悪さ」に加えて、即値アドレス指定であることの非効率(?)もあるかもしれません。逆に言えばセグメントの内外を問わず、同じ効率(の悪さ?)で呼び出すことになるのではないかと。あくまで想像で書いていますので、どなたか詳しい方のコメントを期待します。
...中途半端だ...PPL にこんな中途半端な情報載せていいのかな?
コメント
このページのタグ
Page tag : Palm
Copyright(C) 2005-2019 project-enigma.
Generated by CL-PREFAB.