問題タブ [static-initialization]

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 投票する
4 に答える
1237 参照

java - 大量の定数を初期化するときに Java の静的イニシャライザーのサイズ制限を回避する方法

私は大量の生成された定数を保持するクラスを持っています:

生成された定数の数が非常に多い場合、静的初期化子が Java メソッド サイズの上限 (つまり > 64kb) よりも大きくなり、コンパイラ エラーが発生します。1 つの解決策は、メソッドに適合するように、64kb 未満のバイトコードを生成することが保証されているブロックに対して、いくつかの「ブロック初期化メソッド」を作成することです。

finalこれの欠点は、静的初期化子で直接初期化されなくなったため、定数を として宣言できなくなったことです。

static final私の質問は、定数を生成できる方法でそのコンパイラ/JVM の制限を回避するにはどうすればよいですか?

0 投票する
1 に答える
817 参照

c++ - C ++クラスがクラススコープ外の静的フィールド(データメンバー)を定義する必要があるのはなぜですか?

重複の可能性:
プライベート静的メンバー
の初期化クラス内の非定数静的メンバーまたは静的配列を初期化できないのはなぜですか?

それは私には奇妙です。グローバルスコープに静的フィールドがあると仮定してみませんか?

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

c++ - __attribute__((constructor)) 呼び出し順序の混乱

ここでの答えは、 __attribute__((constructor)) が静的初期化後に呼び出されず、宣言順に呼び出されることを示しています。

では、すべてのデータが初期化されたときに呼び出されることが保証されていない場合、その目的は何ですか? Foo コンストラクターに ((constructor)) コードを含めることもできます。

私が探しているのは、共有ライブラリで、すべての静的データが初期化され、静的コンストラクターが呼び出された後に実行されるコードを持つ方法です。DllMain; の代わりとして __attribute__((constructor)) を推奨している人を見ました。一部の静的データがまだ初期化されていない可能性があるため、これは間違っていることがわかります。

もちろん、単一のファイル (コンパイル単位) では、静的を配置できます。しかし、典型的なプログラムにはたくさんのファイルがあります。共有ライブラリ内の他のすべての statics が初期化された後に、1 つのファイル内の ((constructor)) が確実に呼び出されることを保証する方法はありますか?

静的初期化 (コンストラクター、オブジェクトなど) を含むファイルを gcc コマンド ラインの末尾に配置すると、次のようになります。

このファイルの静的コンストラクターは最後に呼び出されることが保証されていますか? 実験したところ、ソースファイルの順序を変更すると、printfs の順序が変更されました。しかし、それはどこかで指定されており、コンパイルシステム/コンピューター間で同じであることが保証されていますか?

たとえば、引用:

リンク時に、gcc ドライバーはすべての再配置可能ファイルの直前に crtbegin.o を配置し、すべての再配置可能ファイルの直後に crtend.o を配置します。©

私が理解していることから、上記の引用は、リンカーに渡される .o ファイルの順序が静的初期化の順序を定義することを意味します。私は正しいですか?

もう 1 つの興味深い解決策は、静的初期化を調整する GCC プラグインを作成することです (たとえば、コードを .ctors セクションに追加するなど)。しかし、これはおそらく誰かが拡張できるアイデアにすぎません。

もう 1 つの可能な解決策をここに示します。つまり、外部のビルド後ツールを使用して、実行可能ファイル (ライブラリ) 内の .ctors エントリを並べ替えることができます。しかし、私は ELF 形式の専門家ではありません。これが可能であり、この方法で .so ファイルを微調整するのに十分簡単かどうか疑問に思います。

私が興味を持っているのは、特定の問題を解決すること、または解決できないことを証明することです (少なくとも、上記の解決策が機能しない理由)。

0 投票する
1 に答える
762 参照

c++ - テンプレート化された構造で const 静的メンバーの初期化順序を保証する方法

それぞれ const 静的メンバー変数を含む 2 つのテンプレート化された構造があります。これらのメンバー変数の 1 つの初期化は、2 番目のメンバー変数に依存します。したがって、2番目が最初の前に初期化されることを保証できるようにしたいと思います。簡単な例を次に示します。

依存関係.hpp:

testStruct.hpp:

test.cpp:

メインの出力は

つまり、TestStruct<T>が既に type に対してインスタンス化されているstaticVar場合、 は正しく初期化されますが、それ以外の場合はまだ初期化されていないため、0 のままです。[1] と [2] のコメントを外すと、タイプとの問題が解決します(つまり、[3] がコメントされていても、すべてが 1.5 を出力します)。それらを使用しないコードの型。T の型を指定しなくても、 (または) に何かを入れて、その型に対してインスタンス化されていることを保証できるようにしたいと考えています。DependencyTDependency<T>::staticVarfloatdoubleTestStruct<T>testStruct.hppDependency

C++ の静的メンバーの初期化 (内部のテンプレートの楽しみ)静的メンバーを強制的に初期化する方法を見てきました。. 最初のものは状況をよく説明していますが、私のような問題の解決策を提案していません。2番目には2つの解決策がありますが、どちらもGCC 4.2.1では機能しないようです(または、間違って適用しました...)。

私が試すべき他のトリックや回避策はありますか、それとも明示的なインスタンス化にこだわっていますか?

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

c++ - C ++静的メンバーの初期化は、コンパイラーのリンクと混同します。の解き方?

これらの静的メンバーによるc++クラスの初期化に問題があります。詳細については、私のコードを参照してください。

ソース

header.h

staff.cpp

boss.cpp

main.cpp

そして、ここに異なる結果を持つ多くのコンパイルコードがあります:

プリコンパイル:

コンパイル、実行、結果:

コンパイル時に巨大なオブジェクトの順序と混同するのではなく、ライブラリアーカイブを使用したいと思います。それらを解決するのを手伝ってください。

ありがとうございました。

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

c++ - ローカル静的関数オブジェクトの初期化はスレッドセーフですか?

次の 2 つの関数は異なるアセンブリを生成します。これは、それらが異なることを示しています。誰かが私に彼らがどのように違うのか教えてもらえますか? また、func2 の関数ローカル静的変数の初期化はスレッドセーフですか? 答えがコンパイラに依存する場合、最も一般的なコンパイラが func2 でどのように動作するかを知りたいです。

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

c++ - c++static-init-fiascoの例

BruceEckelによる「ThinkinginC++」の助けを借りて、C ++を学習し、演習32、第10章で立ち往生しています。問題は、オブジェクトm5に対して呼び出されたMirror :: test()がfalseを返すリンク順序を変更する方法です。これが私のコードです。

mirror.h:

タスク

one.cpp

two.cpp

three.cpp

等々。ついに、

five.cpp

m5.test()はtrueを返します。タスクは、リンクの順序を変更する必要があることを示しています。m5.test()はfalseを返します。私は使用しようとしました:

init_priority(priority)

標準C++では、名前空間スコープで定義されたオブジェクトは、特定の変換単位での定義と厳密に一致する順序で初期化されることが保証されています。翻訳ユニット間の初期化は保証されません。ただし、GNU C ++を使用すると、ユーザーは、相対優先度(現在、101から65535までの範囲にある定数積分式)を指定することにより、init_priority属性を使用して名前空間スコープで定義されたオブジェクトの初期化の順序を制御できます。数値が小さいほど、優先度が高くなります。

しかし、運はありません。

完全な演習テキスト:

ヘッダーファイルで、2つのデータメンバー(Mirrorオブジェクトへのポインターとbool)を含むクラスMirrorを作成します。2つのコンストラクターを指定します。デフォルトのコンストラクターはboolをtrueに初期化し、Mirrorポインターをゼロに初期化します。2番目のコンストラクターは、引数としてMirrorオブジェクトへのポインターを取り、それをオブジェクトの内部ポインターに割り当てます。boolをfalseに設定します。メンバー関数test()を追加します。オブジェクトのポインターがゼロ以外の場合、ポインターを介して呼び出されたtest()の値を返します。ポインタがゼロの場合、ブール値を返します。次に、5つのcppファイルを作成します。各ファイルには、ミラーヘッダーが含まれています。最初のcppファイルは、デフォルトのコンストラクターを使用してグローバルミラーオブジェクトを定義します。2番目のファイルは、最初のファイルのオブジェクトをexternとして宣言し、2番目のコンストラクターを使用してグローバルミラーオブジェクトを定義します。最初のオブジェクトへのポインタを使用します。グローバルオブジェクト定義も含まれる最後のファイルに到達するまで、これを繰り返します。そのファイルで、main()はtest()関数を呼び出し、結果を報告する必要があります。結果がtrueの場合は、リンカーのリンク順序を変更して、結果がfalseになるまで変更する方法を確認してください。

0 投票する
3 に答える
1193 参照

java - 静的初期化ブロックを使用してパフォーマンスを向上させる

セッターを使用して別のPOJOクラスBのNフィールドにデータを入力し、POJOを呼び出し元に返すメソッドを含むクラスAを含む本番環境で使用されている既存のコードベースがあり、クラスBのすべてのインスタンスが2つのフィールド、つまりN-2フィールドは、クラスBのすべてのインスタンスで同じになります。クラスAにクラスBへの静的参照があり、静的で変更されないクラスBのフィールドを初期化すると、パフォーマンスが向上します。初期化ブロック?このように、各呼び出しでクラスBのN個のフィールドにデータを入力していたクラスAのメソッドは、異なる2つのフィールドのみにデータを入力する必要があります。これにより、クラスAのメソッドを呼び出すたびにタイプBの新しいオブジェクトを作成する必要もなくなります。マルチスレッドアプリケーションでのこのアプローチの意味は何ですか。

あるいは、静的として変更されないクラスBのすべてのフィールドを宣言して、クラスAのメソッドが呼び出しごとに変更されるフィールドのみを設定するようにすることもできます。いずれにせよ、パフォーマンスの向上はそれだけの価値がありますか、それともこの変更は時期尚早の最適化と見なされますか?

例 :

0 投票する
1 に答える
1558 参照

c++ - C++ 静的テンプレート メンバーの初期化の問題

gcc 4.5.1、SuSE Linux i686

次のコードがあるとします。

この場合、stdout には何も出力されません。コンパイラは、クラス A の float および double 特殊化を初期化するコードを生成しません。

しかし..次のように初期化を変更すると:

コンパイラはそのようなコードを生成し、出力には二重の「B()」が含まれます。

誰かがそのような行動を理解するのを手伝ってくれますか?

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

visual-studio-2008 - C ++の静的初期化の大失敗はクラス階層に適用されますか?

静的初期化でクラッシュ(デバッグアサーションの失敗:VC ++ 2008の無効なCRTヒープポインター)が発生しますが、その理由がわかりません。

C ++ FAQ静的初期化の大失敗についてすべて読んだのですが、それを理解したと思いました。なぜこれが起こっているのか、なぜ大失敗の場合なのかわかりません。

これが状況です(簡潔にするために、ほとんどの非静的メンバーは省略されています)。Ahで定義されたクラスAが1つあります。

次に、AのサブクラスであるネストされたクラスBを持つクラスCがあります。Cには、タイプBのプライベート静的メンバーも含まれています。

最後に、my_personal_Bのストレージユニットを含むCの実装ファイルC.cppがあります。

このパターンは多くのクラスで繰り返され、それぞれにAから継承するネストされたクラスがあります。これはすべて、いくつかのコードリビジョンを通じて問題なく動作していますが、最近、アプリケーションが次の特定のエラーメッセージでクラッシュします。

デバッグアサーションに失敗しました!

プログラム:
[編集済み] .exe
ファイル:f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ dbgheap.c
行:1511

式:_CrtIsValidHeapPointer(pUserData)

クリックしてデバッグすると、静的メンバーが定義されているC.cppの行が表示されます。

これは静的な大失敗のようには見えません。静的なものはmy_personal_Bを参照せず、AもBもデフォルトのコンストラクターしか持たないため、まだ初期化されていない他の静的オブジェクトを参照できない可能性があります。私が大失敗を理解した方法は、ある静的オブジェクトがまだ初期化されていない別の静的オブジェクトを参照したときに発生したということです。

それでも、静的メンバーを初回使用時の初期化メソッドに変更すると、クラッシュは解消されたように見えます。

だから問題は、なぜこれがクラッシュするのかということです。