問題タブ [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 投票する
12 に答える
247149 参照

c++ - 構造体のsizeofが各メンバーのsizeofの合計と等しくないのはなぜですか?

なぜsizeof演算子は、構造体のメンバーの合計サイズよりも大きいサイズを構造体に返すのですか?

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

c# - 不変のジェネリック Pair 構造体に IEqualityComparer を実装するにはどうすればよいですか?

現在、私はこれを持っています(アドバイスを読んだ後に編集しました):

問題は、 First と Second が参照型ではない可能性があることです (VS は実際にこれについて警告します) が、コードはまだコンパイルされます。それらを比較する前に、それら (First と Second) をオブジェクトにキャストする必要がありますか、またはこれを行うより良い方法はありますか?

編集:この構造体が値と参照型をサポートするようにしたいことに注意してください(つまり、クラスによる制約は有効な解決策ではありません)

編集2:私が達成しようとしていることに関しては、これを辞書で機能させたいと思っています。第二に、SRP はこの問題の本質ではないので、今のところ私にとって重要ではありません。後でいつでもリファクタリングできます。第 3 に、default(T) との比較は、null との比較の代わりに機能しません。試してみてください。

0 投票する
9 に答える
1858 参照

c++ - C コールバックによって呼び出される C++ メンバー関数を取得するための最良の方法は?

典型的なクラスを考えると:

pthread_create() やシグナル ハンドラなどの C void* ベースのコールバックによって呼び出されるメンバー関数を取得する最良の方法は何ですか?

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

c - Cで構造体の等価性をどのように比較しますか?

標準 C で構造体の 2 つのインスタンスが等しいかどうかを比較するにはどうすればよいですか?

0 投票する
8 に答える
115133 参照

c - 構造体のサイズを見つけるにはどうすればよいですか?

sizeof(a)とは何ですか?

0 投票する
10 に答える
13937 参照

c - ANSI Cは符号付き/符号なしビットフィールドをサポートしていますか?

ビットフィールドを符号付き/符号なしとして修飾することは意味がありますか?

0 投票する
9 に答える
2882 参照

c++ - ウィンドウサイズを変更して異なるヘッダーサイズを取得する

TCP ヘッダーを構造体として表す C++ プログラムがあります。

このプログラムを実行すると、このヘッダーのサイズが 24 バイトになり、期待していたサイズではありません。フィールド "wWindow" の型を unsigned short と同じビット数を持つ "unsigned int wWindow:16" に変更すると、プログラムは構造体のサイズが 20 バイトになり、正しいサイズであると通知します。どうしてこれなの?

32 ビット x86 マシンで Microsoft Visual Studio 2005 SP1 を使用しています。

0 投票する
10 に答える
91230 参照

c - ポインターを渡すのではなく、C で構造体を値で渡すことの欠点はありますか?

ポインターを渡すのではなく、C で構造体を値で渡すことの欠点はありますか?

構造体が大きい場合、大量のデータをコピーするというパフォーマンス上の側面があることは明らかですが、構造体が小さい場合は、関数にいくつかの値を渡すのと基本的に同じにする必要があります。

戻り値として使用すると、さらに興味深いものになるかもしれません。C では、関数からの戻り値は 1 つしかありませんが、多くの場合、複数の値が必要になります。したがって、簡単な解決策は、それらを構造体に入れて返すことです。

これに賛成または反対の理由はありますか?

ここで私が話していることは誰にも明らかではないかもしれないので、簡単な例を挙げます。

C でプログラミングしている場合、遅かれ早かれ次のような関数を書き始めるでしょう。

これは問題ではありません。唯一の問題は、すべての関数で同じ規則を使用するために、パラメーターの順序について同僚と同意する必要があることです。

しかし、同じ種類の情報を返したい場合はどうなるでしょうか? 通常、次のようなものが得られます。

これは問題なく機能しますが、はるかに問題があります。戻り値は戻り値ですが、この実装ではそうではありません。上記から、関数 get_data が len が指すものを見ることが許可されていないことを伝える方法はありません。また、値が実際にそのポインターを介して返されることをコンパイラーにチェックさせるものは何もありません。そのため、来月、他の誰かがコードを正しく理解せずに (ドキュメントを読んでいなかったために) コードを変更すると、気付かないうちにコードが壊れたり、ランダムにクラッシュしたりします。

だから、私が提案する解決策は単純な構造体です

例は次のように書き直すことができます。

なんらかの理由で、ほとんどの人は本能的に inspect_data に構造体 blob へのポインターを持たせると思いますが、その理由はわかりません。ポインターと整数は引き続き取得されますが、それらが一緒になることははるかに明確です。get_data の場合、長さの入力値がなく、長さが返される必要があるため、前に説明した方法で混乱することはありません。

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

.net - .NET に RAII がないのはなぜですか?

主に C++ の開発者である私は、Java と .NET にRAII (Resource Acquisition Is Initialization)がないことにいつも悩まされてきました。クリーンアップの責任がクラスの作成者から消費者に移されたという事実 (try finallyまたは .NET のusingコンストラクトによって) は、著しく劣っているように思われます。

すべてのオブジェクトがヒープ上にあり、ガベージ コレクターが本質的に決定論的破壊をサポートしていないため、Java で RAII がサポートされていない理由がわかりましたが、値型 ( struct) の導入により .NET では (一見) RAIIの完璧な候補。スタック上に作成された値型には明確に定義されたスコープがあり、C++ デストラクター セマンティクスを使用できます。ただし、CLR では、値型がデストラクタを持つことは許可されていません。

私のランダムな検索では、値の型がボックス化されている場合、ガベージ コレクターの管轄下にあるため、その破棄が非決定的になるという 1 つの引数が見つかりました。この議論は十分に強力ではないと感じています。RAII の利点は、デストラクタを持つ値型をボックス化 (またはクラス メンバーとして使用) できないと言うのに十分大きいです。

簡単に言うと、私の質問は次のとおりです。RAII を .NET に導入するために値型を使用できない理由は他にありますか? (または、RAII の明らかな利点についての私の議論には誤りがあると思いますか?)

編集:最初の4つの回答が要点を逃したため、質問を明確に表現していなかったに違いありません。私はその非決定論的特性について知っており、構造について知っており、これら2つのオプションは RAII よりも劣っていると感じています。は、クラスの消費者が覚えておかなければならないもう 1 つのことです (ブロックに aを入れるのを忘れた人は何人いますか?)。私の質問は、言語設計に関する哲学的なものです。なぜそうなのか、改善できるのでしょうか?FinalizeusingusingStreamReaderusing

たとえば、一般的な決定論的に破壊可能な値型を使用すると、usingandlockキーワードを冗長にすることができます (ライブラリ クラスによって達成可能)。


私は、かつて見たが、現在その出所を見つけることができない適切な引用で終わらせざるを得ません。

私の冷たい死んだ手が範囲外になると、私の決定論的破壊を受け取ることができます. --アノン

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

c - 非常に大きな構造体を初期化する正しい方法は何ですか?

私たちのコードでは、次のようなものを使用していました。

これは以前はうまく機能していましたが、GCC のバージョンをアップグレードしたところ、突然スタック オーバーフローが発生し始めました。アセンブリを見ると、古い GCC コード (2.x) は基本的にこれを行っていました。

新しい GCC (3.4.x) はこれを行っていました

C99 の仕様を確認したところ、その理由がわかりました。C99 では、基本的に匿名構造体がスタック上に存在する必要があります。これは良いコンセプトですが、この構造体は 4 メガバイトの大きさであり、ヒープ上にのみ存在することを意図していました!

メンバーを明示的に設定する独自の「初期化」関数を作成することにしましたが、これは見苦しく、メンテナンスの頭痛の種です。私は memset を適切な解決策とは考えていません。なぜなら、0 のビット値が型の適切なゼロ値であることを知ることができないからです (ニトピッキング、私は知っていますが、そこにいます;私はそれを気にしませんコンパイラは知っているので、それを行います)

このような大きな構造を初期化する「正しい」、または少なくとも最善の方法は何ですか?

memset が解決策ではないと思う理由をさらに明確にするために、明示的に初期化されていないメンバーの初期化の規則は、静的初期化と同じであり、次のとおりです。 - ポインター型の場合は、null ポインターに初期化されます。- 算術型の場合、(正または符号なし) ゼロに初期化されます。...

「memset」はメモリをビット パターン ゼロに設定しますが、これは必ずしも同じではありません。IEEE 浮動小数点数を使用しないシステムを想像してみてください。珍しいですが、C でサポートされています。0.0 の表現は、「全ビット 0」を意味する必要はなく、プロセッサにとって都合のよいものであれば何でもかまいません。