問題タブ [storage-duration]
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++ - 参照タイプと保存期間
まず、保存期間の定義を引用します (秒 3.7.1/1 N3797):
ストレージ期間は、オブジェクトを含むストレージの潜在的な最小寿命を定義するオブジェクトのプロパティです。
しかし、3.7.1/3 は次のように述べています。
保存期間のカテゴリは参照にも適用されます。
好奇心旺盛です。参照はメモリ内にまったく表現されていないと思いました。また、オブジェクトとオブジェクトのみがメモリ内で表現されると考えました(秒。1.8/1):
オブジェクトはストレージの領域です。
保存期間の概念を参照に導入するポイントは何ですか?
c++ - 静的保存期間を持つ変数の削除
次のルールに出くわしました (3.7.1/2 N3797):
静的ストレージ期間を持つ変数に初期化または副作用のあるデストラクタがある場合、未使用のように見えても削除してはなりません。ただし、クラス オブジェクトまたはそのコピー/移動は、12.8 で指定されているように削除できます。
副作用のあるコンストラクタまたはデストラクタを持つ静的ストレージ期間を持つ変数を宣言すると、その変数が使用されていない場合でも、メモリがその変数に割り当てられるというのは本当ですか?
特に、次のコードを試してみます。
この例で data_member オブジェクトが構築されないのはなぜですか?
c++ - スレッド ローカル グローバル スコープ変数
次のコードを検討してください。
はスレッドの保存期間であるためa
、少なくとも 3 つの異なるオブジェクトがあり、 a で示されfirst
、second
とmain
スレッドで使用されます。a
内部では使用しませんthird
。a
3番目に使用できるゼロ初期化はありますか? 標準でこれについて何も見つからないため、この質問をします。
スレッド保存期間を持つ非ローカル変数は、スレッド実行の結果として初期化されます。
実装定義ですか?
c++ - ユーザー定義の文字列リテラルを使用した基になる文字データの保存期間
クイック セットアップ: プログラム内で文字列をポインターとサイズとして渡したい。String クラスと、リテラル文字列を構築するためのユーザー定義リテラルがあります。
標準では、ユーザー定義のリテラル演算子に渡される引数が静的な期間を持つことを指定していますか? つまり、上記のコードは実際には次のように書くのと同じです:
または、ユーザー定義のリテラルを使用するときに、コンパイラ/リンカーがダングリング ポインターを残すことを許可していますか?
(N4527 のセクション 2.13.8 は、ユーザー定義の文字列リテラル演算子に対する引数のストレージ クラスの主題について何も述べていないようです。標準の適切なセクションへのポインターは高く評価されます。)
c++ - C++ での構造体の保存期間とメンバーの初期化
C++14 標準 (ISO/IEC 14882:2014) セクション 8.5、パラグラフ 12:
オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルトで初期化されます。自動または動的ストレージ期間を持つオブジェクトのストレージが取得されると、オブジェクトの値は不定になり、オブジェクトの初期化が実行されない場合、そのオブジェクトはその値が置き換えられるまで不定値を保持します (5.17)。[ 注: 静的またはスレッド ストレージ期間を持つオブジェクトはゼロで初期化されます。3.6.2 を参照してください。- 終了注記】
a1
静的ストレージ期間がa2
あり、自動ストレージ期間がありますか? の定義は宣言Struct A
と同様にグローバル名前空間にありますが、宣言はブロック スコープ (関数内) にあります。a1
a2
main()
また、セクション 3.6.2 は次のように述べています。
段落1:
静的記憶域期間を持つ非ローカル変数は、プログラムの開始の結果として初期化されます。
パラグラフ 2:
静的保存期間 (3.7.1) またはスレッド保存期間 (3.7.2) を持つ変数は、他の初期化が行われる前にゼロで初期化されます (8.5)。
その上、gcc 5.4.0 では警告 ( warning: 'a2.A::x' is used uninitialized in this function [-Wuninitialized]
) とランダムな値が表示されますが、clang 3.8.0 では常に出力されますa2.x = 0
(ゼロは不確定な値になることもあります)。struct
また、ネストされたとデフォルトの初期化を に配置して、他のより複雑な実験も行いました// Some Other Code
。ランダムな値を取得することもあれば、ゼロを取得することもあります (無視できる数ではありません)。
Struct の保存期間は
A
? そして、オブジェクトa1
とa2
?そして、変数a1.x
とa2.x
?ゼロ
a1.x
でa2.x
初期化する必要がありますか? それとも不定値ですか?と に同じ規則が適用され
class
ますunion
か?のコードに違いはあります
// Some Other Code
か?たとえば、クラス T が「デフォルトの初期化子を持つ非静的メンバを持つ」( のようにstruct A { int b = 1; int x; };
) 場合、デフォルトのコンストラクタは自明ではありません (つまり、アクションを実行できません)。その重要なコンストラクターも初期化しx
ますか? 自明なデフォルト コンストラクタ
興味深いリンク:
C++ 構造体のメンバーはデフォルトで 0 に初期化されていますか?