問題タブ [offsetof]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 非 POD タイプの offsetof() に似たものを探す
非 POD の性質を持つ C++ クラスのデータ メンバーのオフセットを取得する方法を探しています。
理由は次のとおりです。
HDF5形式でデータを保存したいのですが、これは私の種類の資料 (数値シミュレーション出力) に最も適していると思われますが、おそらく C 指向のライブラリです。私はC++インターフェイスを介してそれを使用したいので、ストレージタイプを次のように宣言する必要があります( hereとhereのドキュメントに従ってください(セクション4.3.2.1.1)):
ここで、HOFFSET は、offsetof を使用する HDF 固有のマクロです。
問題はもちろん、example-class がもう少し機能的になるとすぐに、もはや POD タイプではなくなるため、offsetof を使用すると未定義の結果が生じることです。
私が考えることができる唯一の回避策は、最初に保存したいデータをより単純な構造体にエクスポートしてから、それを HDF に渡すことです。ただし、これにはデータのコピーが含まれます。これはまさに HDF が回避しようとしているものです (そして、ライブラリがオブジェクトに到達してデータをファイルに保存できるようにするこの CompType がある理由)。
だから、もっといいアイデアがあればいいなと思っていました。理想的には、この問題の移植可能な回避策を探していますが、それが不足している場合でも、GCC を使用して x86 および x86_64 で動作するアイデアを教えていただければ幸いです。
----- 後で追加: -----
Greg Hewgill は、データを単純な構造体に格納し、それを継承して実際のクラスを構築することを以下に提案しました。特に HDF の場合、実際には機能しない可能性があると思います。上記よりも複雑な使用シナリオ:
さて、クラス that_uses_derived_non_pod のインスタンスを格納するとき、あたかも base_pod を member_c として持っているかのように、そのメモリ レイアウトを記述することはできません。派生した_non_podがファンキーなものを追加するため、これはオフセットを間違って取得します(仮想関数テーブルのようなものだと思いますか?)。
c - この offsetof() の実装が機能するのはなぜですか?
ANSI C では、offsetof は次のように定義されています。
NULL ポインターを逆参照しているのに、なぜセグメンテーション違反がスローされないのでしょうか? それとも、オフセットのアドレスのみが取り出されていることがわかり、実際に逆参照せずにアドレスを静的に計算する、ある種のコンパイラハックですか? また、このコードは移植可能ですか?
c++ - C++ の非 POD 構造体で offsetof を使用できないのはなぜですか?
C++ でメンバーのメモリ オフセットをクラスに取得する方法を調査していたところ、ウィキペディアで次のような情報を見つけました。
C++ コードでは、offsetof を使用して、プレーン オールド データ構造体ではない構造体またはクラスのメンバーにアクセスすることはできません。
私はそれを試してみましたが、うまくいくようです。
いくつかの警告が表示されましたが、コンパイルして実行すると妥当な出力が得られました。
POD データ構造とは何かを誤解しているか、パズルの他のピースが欠けていると思います。問題が何であるかわかりません。
c - コンパイル時のオフセット
コンパイル時に構造体のメンバーのオフセットを見つける方法はありますか? 構造体メンバーのオフセットを含む定数を作成したいと考えています。次のコードでは、offsetof()
マクロは最初のprintf
ステートメントで機能します。ただし、10 行目で宣言するために使用するとofs
、エラーが発生します。
「'->' 演算子を定数式として解決できません」.
それを行う他の方法はありますか?
c - offsetof()でnullポインタを減算するのはなぜですか?
Linuxのstddef.hは次のように定義しoffsetof()
ています。
一方、ウィキペディアの記事offsetof()
(http://en.wikipedia.org/wiki/Offsetof)では、次のように定義されています。
(char *)0
なぜウィキペディアバージョンで減算するのですか?それが実際に違いを生むケースはありますか?
c - c struct-embedded union のメンバー配置
Cコードを少し変更しています。大まかに次のようになります。
明らかに、ユニオンの CharData メンバーを使用する場合、コードは構造体内の対象バイト数を把握しようとします。私の問題は、コンパイラが名前のない共用体について警告することです。だから私はそれを
しかし、もちろん、最後の行も変更する必要があります。以下は常にオリジナルとまったく同じ結果をもたらすでしょうか?
または、CharData (または ShortData または LongData) がユニオンの先頭に配置されない可能性はありますか?
-- 編集: ご回答ありがとうございます。この質問に対する答えは、実際に私が必要としていた答えを提供してくれました:適切に変換されたユニオン オブジェクトへのポインターは、そのメンバーのそれぞれを指します (または、メンバーがビットフィールドの場合は、それが存在するユニットを指します)。逆に。.
とにかく、この質問に対する回答の1つを受け入れられた回答として選択する必要がありますか?
c - Cでの明らかなNULLポインター逆参照は、実際にはポインター演算ですか?
私はこのコードを持っています。ここではnullポインターを逆参照しているように見えますが、結果をビット単位でAND演算しunsigned int
ます。私は本当に全体を理解していません。それは何をするつもりですか?これはポインタ演算の形式ですか?
私が得る出力は44です。しかし、それはどのように機能しますか?
c++ - 独自のオフセットを認識している C++ クラス メンバー変数
それ自体へのポインターからそれ自体を含むオブジェクトへのポインターを計算できるメンバー変数を持つことは可能ですか?
次のように API でラップされた外部呼び出しインターフェイスを用意しましょう。
0 から N までの他の数の引数についても同様です。外部側の各クラスでは、1 つの C++ クラスがいくつかのトレイトで宣言され、このテンプレートはそれらのトレイト (および引数の型のその他のトレイト) を使用して、外部メソッドを見つけて呼び出します。これは次のように使用できます。
今私がやりたいのはFoo
、次のように呼び出すことができるような方法で定義することです:
署名を何度も繰り返さずに。(明らかに、静的メンバーを作成し、呼び出しをメソッドにラップするのは簡単です)。実際、それはまだ簡単です。
ただし、それは、オブジェクトがそれ自体へのポインタの多くのコピーを含むことになることを意味します。this
したがって、これらのインスタンスが所有者ポインターといくつかの追加のテンプレート引数を計算できるようにする方法を探しています。
の方針に沿って考えていた
しかし、これは Foo がその時点で不完全な型であると不平を言っています。
はい、offsetof
「POD」タイプでのみ機能するはずですが、実際には非仮想メンバーで機能します。同様に、その引数に (ダミーの基本クラスを使用して) メンバーへのポインターを渡そうとしましたが、それも機能しません。
これが機能する場合は、含まれているクラスのメソッドに委譲する C# のようなプロパティを実装するためにも使用できることに注意してください。
上記のラッパー メソッドを boost.preprocessor で実行する方法は知っていますが、引数リストは奇妙な形式で指定する必要があります。テンプレートを介して一般的なラッパーを生成するマクロを作成する方法は知っていますが、それでは診断が不十分になる可能性があります。呼び出しが次のように見える場合も簡単ですfoo.bar()(5)
。しかし、いくつかの巧妙なトリックが可能かどうかを知りたいです (さらに、そのような巧妙なトリックのみがプロパティにも使用できる可能性があります)。
注: オフセットを割り当てる前に型を認識しておく必要があるため、メンバー型は、それへのメンバー ポインターまたはそのオフセットのいずれかで実際に特殊化することはできません。これは、型が必要なアラインメントに影響を与える可能性があるためです (明示的/部分的な特殊化を検討してください)。
templates - g++ でテンプレート パラメーターを offsetof に渡すことができません
g++ を使用しているときに、テンプレート パラメーターをメンバー変数として offsetof に渡すと、次の警告が表示されます。
私の使い方は次のとおりです。
__builtin_offsetof を使用しても同じエラーが発生します。何か案は?
ありがとう
c++ - 'offsetof'マクロは未定義動作を呼び出しますか?
MSVCの実装の例:
ご覧のとおり、これはnullポインターを逆参照し、通常は未定義の動作を呼び出します。これはルールの例外ですか、それとも何が起こっているのですか?