問題タブ [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 - Copying part of a struct using memcpy and offsetof
I'd like to copy part of a struct starting from a certain element forward by combining the offsetof
macro and memcpy
, as shown below:
I expected this to output 4 2 3
but it actually outputs 4 5 6
as if no copying had taken place. What did I get wrong?
c++ - C++: メンバー変数のポインタが別の場所に渡された場合に、コンパイラがメモリ アクセスを最適化する方法
[編集: ここに動機があります: 変数のポインターを外部関数に渡すと、外部関数によって元のポインターから計算された隣接変数へのポインターを取得する可能性があるため、「隣接する」変数の最適化が誤って壊れる可能性があります。volatile
以下は、現在のコンパイラ ユニットにアクセスできない外部関数 (仮想関数呼び出し、クローズド ソース ライブラリ関数など) をシミュレートする元の投稿です。]
return t.a;
次のコードの が に最適化されるかどうか疑問に思いましたreturn 0;
。
そうではありません。関数内のコードは、変更へのポインタを取得するためにf
使用される可能性があるため、十分に公平です。したがって、アウェイの負荷を最適化するのは安全ではありません。offsetof
t
t.a
t.a
[編集: よく考えてみると、offsetof
ここでは十分ではありません。container_of
標準 C++ で実装する方法がないように思われる が必要です。]
ただしoffsetof
、非標準レイアウト タイプでは使用できません。そこで、次のコードを試しました。
残念ながら、まだ機能していません。
私の質問は次のとおりです。
- 上記の場合にアウェイの負荷を最適化しても安全かどうか
t.a
(リビジョン 2) - そうでない場合、それを可能にするための取り決め/提案はありますか? (たとえば
T
、より特殊な型を作成したり、メンバーの属性指定子を作成したりb
しますT
)
PS 次のコードは 用に最適化されreturn t.a;
ていますが、ループ用に生成されたコードは少し非効率的です。それでも、一時変数のジャグリングは面倒です。
arrays - Cのメンバー値から構造体の配列で構造体を見つける
構造体の配列を調べて、特定のメンバーの値が入力と一致するものを返すことができる関数を作成しようとしています。男がよく知っている問題を抱えている別のスレッドを見つけましたが、私にはうまくいかないようです。他のスレッドはここにあります: Get a struct based on member values
私は構造体を持っています:
これらの配列を作成しました:
私はこの機能を使用します:
メンバー値が関数入力と一致する配列 VN100_registers 内の構造体を指すことになっています。
変数を初期化します。
そして関数を呼び出します:
配列の 3 番目の構造体を指す必要がありますが、デバッグすると次のようになります。
c++ - コンテナー内の異なるオブジェクトのメンバー間のポインター差分は同じですか?
C++ マクロoffsetof
は、標準のレイアウト タイプで使用する場合の動作を定義しただけです。私が理解したように、これはコンパイラが実行するコードのコンテキストに応じてデータのメモリ レイアウトを変更できるためです。(たとえば、変数がまったく使用されない場合)
しかし、私が疑問に思ったのは、範囲に格納されたすべての要素が同じレイアウトを共有するかどうかということです。または、言い換えれば、次のコードが適切に定義されている場合:
c++ - 構造体メンバーのブール式エバリュエーター
バックグラウンド
私は構造体を持っています:
ブール式 (文字列に格納):
イベント オブジェクト (数千) のベクトルがありstd::vector<event>
、それらがブール式を満たすかどうかを確認したいと考えています。
これまでに実践したこと
- トークナイザーと再帰降下パーサーを実装して、ブール式を AST に変換しました。
- 端子を として格納し
std::pair<std::string, std::string>
ます。最初の値は構造体フィールド名で、2 番目の値は値です。例えば、std::pair<"name", "acbd">
- ツリーをたどると、ターミナル ツリー ノードが表示されるたびに、次のようになります。
質問
構造体には 10 個のメンバーが含まれています。無駄な比較は避けたい。最悪の場合、AST ターミナル ノード (たとえば、pair<"type", "5000">
) では 10 回の比較が行われる可能性があります。
私はこのルックアップマップを構築しようとしました:
このマップを使用すると、次のように簡略化できますmatch()
。
を使用して、オフセットで構造体メンバーにアクセスできます
(eventObj + offset)
。比較が機能するように正しいデータ型に変換するにはどうすればよいですか?今のところ、AST ターミナル ノードのすべてのフィールド値は
std::string
. トークナイザーまたは解析ステップ中に正しいタイプに変換するにはどうすればよいですか? AST ノードを として保存できますstd::pair<std::string, std::any>
が、 のタイプ情報が必要ですstd::any_cast
。
これらは両方とも、フィールド マップに何らかの形で型情報を格納できれば解決できます。方法がわかりません。