問題タブ [struct]

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.

0 投票する
5 に答える
4260 参照

c++ - C++ で構造体へのポインターを前方宣言する

次のような宣言を持つサードパーティのライブラリを使用しています。

そして、コンストラクターでHandleTypeを取るクラスを作成したいと思います。

HandleTypeを定義するヘッダーを含めずに。通常、そのような型を前方宣言するだけですが、この構文がわかりません。私は本当に次のようなことを言いたいです:

しかし、それはGCCで「*の前に識別子が必要です」と言っています。私が見ることができる唯一の解決策は、次のようにクラスを書くことです:

ただし、これはライブラリの内部の詳細に依存しています。つまり、実装の詳細である __INTERNAL_DATA という名前を使用します。

__INTERNAL_DATA (ライブラリの実装の一部) を使用せずに、HandleType (パブリック API の一部) を前方宣言できるように思われます。

編集:私が探しているものについての詳細を追加しました。

0 投票する
5 に答える
8528 参照

c# - public フィールドがプロパティよりも速いのはなぜですか?

XNA を調べていたところ、XNA 内のVector3クラスがプロパティではなくパブリック フィールドを使用していることがわかりました。簡単なベンチマークを試してみたところ、structその違いは非常に劇的であることがわかりました (2 つのベクトルを 1 億回追加すると、プロパティで 2.0 秒、フィールドで 1.4 秒かかりました)。参照型の場合、違いはそれほど大きくないように見えますが、そこにあります。

では、それはなぜでしょうか。プロパティがメソッドにコンパイルされ、メソッド呼び出しのオーバーヘッドが発生することはわかっていget_Xますset_X。しかし、これらの単純な getter/setterは常にJIT によってインライン化されませんか? JIT が決定したことを保証できないことは承知していますが、確かにこれは確率のリストでかなり高いですか? マシン レベルでパブリック フィールドをプロパティから分離するものは他にあるでしょうか?

そして、私が疑問に思っていることの 1 つは、自動実装されたプロパティ ( public int Foo { get; set; }) が public フィールドよりも「優れた」OO 設計である理由は何ですか? または、より適切に言えば、これら 2 つの違いは何ですか? リフレクションを使用するとプロパティにする方が簡単であることは知っていますが、他に何かありますか? 両方の質問に対する答えは同じだと思います。

ところで:私は.NET 3.5 SP1を使用しています.NET 3.5 SP1は、構造体を含むメソッド(または構造体のメソッド、よくわかりません)がインライン化されていない問題を修正したと信じています。少なくとも使用していると思います。確かにインストールされていますが、DX10.1を持っていないことを除いて、DX10.1が必要なSP1でVista 64ビットを使用しています..

また、ええ、私はリリースビルドを実行しています:)

編集:クイックアンサーに感謝しますが、プロパティアクセスがメソッド呼び出しであることは知っていますが、おそらくインラインメソッドが直接フィールドアクセスよりも遅い理由がわからないことを示しました

EDIT 2 :したがってstruct、明示的な GetX() メソッドを使用する別のメソッドを作成し(Javaの日々をまったく見逃さない方法)、インライン化を無効にしたかどうかに関係なく(を介して)同じように実行した[MethodImplAttribute(MethodImplOptions.NoInlining)]ため、結論:非静的メソッドは、構造体であってもインライン化されないようです。

JITが仮想メソッド呼び出しを最適化できる例外があると思いました。継承を認識していない構造体でこれが発生しないのはなぜですか。したがって、メソッド呼び出しは可能なメソッドを 1 つしか指すことができません。それとも、インターフェースを実装できるからですか?

パフォーマンスが重要な要素にプロパティを使用することについて本当に考えさせられるので、これはちょっと残念ですが、フィールドを使用すると汚く感じるので、自分が行っていることを C で記述したほうがよいでしょう。

EDIT 3 :まったく同じ件名に関するこの投稿を見つけました。彼の最終的な結論は、プロパティ呼び出しが最適化されてしまったということです。callvirtまた、IL にいるにもかかわらず、単純なゲッター/セッター プロパティがインライン化されることを何度も読んだと断言できます。それで私は気が狂うのですか?

EDIT 4 : Reed Copsey が以下のコメントに回答を投稿しました。

Re: Edit3 - 私の更新されたコメントを参照してください: これは x86 JIT と x64 JIT の問題だと思います。x64 の JIT はそれほど成熟していません。より多くの 64 ビット システムが毎日オンラインになるため、MS がこれを迅速に改善することを期待しています。– リード・コプシー

そして彼の答えに対する私の答え:

ありがとう、これが答えです!x86 ビルドを強制しようとしましたが、すべてのメソッドが同等に高速で、x64 よりもはるかに高速です。これは実際には非常に衝撃的です.64ビットOSで石器時代に住んでいたとは思いもしませんでした..あなたのコメントを回答に含めて、より目立つようにします. – ジュリアンR

みんな、ありがとう!

0 投票する
6 に答える
5390 参照

.net - ソケットを介して送信するバイト配列への構造体

構造体からバイト配列を取得してTCPソケットを介して送信するための最良の方法は何ですか?.Net(VBまたはC#)を使用しています。

0 投票する
11 に答える
3258 参照

c - Cの構造体で配列とその長さ変数をラップするのはベストプラクティスですか?

オペレーティング システムのコースですぐに C の使用を開始する予定です。C の使用に関するベスト プラクティスを読んで、後で頭痛が軽減されるようにしています。

これは、アレイが台無しになりやすいため、常にアレイに関する最初の質問の 1 つでした。

配列とその長さを構造体に含む関連変数をバンドルするのは一般的な方法ですか?

私は本でそれを見たことがなく、通常、それらは常に2つを別々に保持するか、 sizeof(array[]/array[1]) のようなものを使用します。

しかし、この 2 つを構造体にラップすると、値と参照の両方で構造体を渡すことができます。これは、ポインターを使用しない限り、配列では実際に行うことができません。その場合、配列の長さを再度追跡する必要があります。 .

私はCを使い始めているので、上記はひどく間違っている可能性があります.私はまだ学生です.

乾杯、カイ。

0 投票する
7 に答える
525 参照

c# - 構造体に関する質問

MSDN によると、16 バイト以下のクラスは struct [citation]として処理する方が適切です。
何故ですか?
構造体が 16 バイトを超える場合、クラスよりも効率が悪いということですか、それとも同じですか?
クラスが 16 バイト未満かどうかをどのように判断しますか?
構造体がクラスのように振る舞うのを制限するものは何ですか? (パラメーターなしのコンストラクターを許可しないことに加えて)

0 投票する
4 に答える
7920 参照

c# - リフレクションを使用して、構造体の配列の一部である構造体のフィールドの値を設定します

現時点では、私のコードは、ルートオブジェクトからフィールド/プロパティへのパスを指定して、リフレクションを使用してオブジェクトのフィールド/プロパティ/配列の値を正常に設定しています。

例えば

上記の例では、「MyObject」オブジェクトの「MyProperty」プロパティを「newvalue」に設定します。

構造体は値型(配列内)であるため、リフレクションを使用して構造体の配列の一部である構造体のフィールドの値を設定することはできません。

ここにいくつかのテストクラス/構造体があります...

以下は、リスト内の通常のプロパティ/フィールドと小道具/フィールドの値を正常に設定する方法です...

その後、myObject.myStructArray [0] .myField ='' mynewvalue"およびmyObject.myOtherStructArray[1].myOtherField ='' mynewvalue"が必要です。

必要なのは、「FieldInf.SetValue(foundObject、newValue);」の代わりです。ライン

前もって感謝します

0 投票する
2 に答える
12710 参照

c# - C# からの C++ dll 関数の呼び出し: 構造体、文字列、および wchar_t 配列の

これは私が解決する必要がある簡単な問題ですが、すべての試行で同じエラーが返されるため、髪が白くなっているように感じます。

「保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。」

dll を呼び出す C++ で記述されたサンプル アプリがあります。関連するコードは次のとおりです。

C++ コードをデバッグすると、Unicode データがデータ構造体に書き込まれます。

これがC#で同じことをしようとする私の試みです

私の推測では、convertHKID_Name 関数によって書き込まれるのはこの構造体であるため、RECO_DATA 構造体を適切にマーシャリングしていないと思います。しかし、どうすれば修正できますか?

0 投票する
2 に答える
4473 参照

.net - 式は値であるため、代入のターゲットにすることはできません

今日、構造体を使用して不意を突かれた問題に遭遇しました。誰かが私のためにそれを明らかにしてくれることを望んでいました。

次のように定義された構造体があります。

この情報を含むクラスがあります

このような基本的なプロパティを設定したいプレゼンテーションモデルがあります

奇妙なのは、次のように Payment プロパティを public フィールドに変更すると、これを機能させることができるということです。

これを引き起こしている構造体について私が理解していないことが明らかにあります。これは悪い考えですか?より良い方法はありますか?私は何を間違っていますか?