1

次のルールに出くわしました (3.7.1/2 N3797):

静的ストレージ期間を持つ変数に初期化または副作用のあるデストラクタがある場合、未使用のように見えても削除してはなりません。ただし、クラス オブジェクトまたはそのコピー/移動は、12.8 で指定されているように削除できます。

副作用のあるコンストラクタまたはデストラクタを持つ静的ストレージ期間を持つ変数を宣言すると、その変数が使用されていない場合でも、メモリがその変数に割り当てられるというのは本当ですか?

特に、次のコードを試してみます。

#include <csignal>
#include <iostream>
#include <cstdlib>

using std::cout;

struct data_member
{
    data_member(){ cout << "data_member\n"; }
    ~data_member(){ cout << "~data_member\n"; }
};

struct Y
{
    static data_member m;
    Y(){ cout << "Y\n"; }
    ~Y(){ cout << "~Y\n"; }
};

Y y;


int main()
{
}

イデワン

この例で data_member オブジェクトが構築されないのはなぜですか?

4

1 に答える 1

1

まあ、それは標準が言っていることなので...はい。

いつものように、as-if ルールがあり、最終的な効果が同じである限り、コンパイラーは事実上何でも行うことができます。クラスがデータに関して巨大であるが、コンストラクターとデストラクタ (および他の誰も) がそのデータにアクセスしない場合、コンパイラは、未使用のデータ用のスペースを残さずに、コンストラクターとデストラクタを適切な順序で呼び出すことができると想像できます。 .


あなたの例については、宣言していますが、 定義Y::mしていません。だから存在しません。アクセスしようとすると、リンカー エラーが発生します。

于 2014-07-10T14:08:57.677 に答える