質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

603閲覧

オブジェクトが生成されない

fana

総合スコア11658

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/08/31 02:36

編集2022/08/31 02:52

以下のコードを書きました.私は X 型のオブジェクトを4回作っているつもりです.

C++

1class X 2{ 3public: 4 int v = -99; 5 static int nctorCalled; 6 static int ndtorCalled; 7 8 ~X(){ ++ndtorCalled; } 9 10 X( int v=0 ) : v{v} { ++nctorCalled; std::cout << "int" << std::endl; } 11 X( const X &ref ){ ++nctorCalled; v=ref.v+10; std::cout << "const &" << std::endl; } 12 X( X &&ref ){ ++nctorCalled; v=ref.v+100; std::cout << "&&" << std::endl; } 13}; 14int X::nctorCalled = 0; 15int X::ndtorCalled = 0; 16 17inline void ShowV( const X &x ){ std::cout << " " << x.v << "\n" << std::endl; } 18 19// 20int main( /*int argc, const char *argv[]*/ ) 21{ 22 { 23 X x1{1}; 24 ShowV(x1); 25 26 X x2{ x1 }; 27 ShowV(x2); 28 29 X x3{ X{4} }; 30 ShowV(x3); 31 } 32 33 std::cout << X::nctorCalled << std::endl; 34 std::cout << X::ndtorCalled << std::endl; 35 36 return 0; 37}

しかしながら,出力は以下となりました.
X x3{ x{4} }; のところの X{4}4 に置き換えられてしまっている(そして,そのためにオブジェクトの生成回数が3回になってしまっている)ように見えます.

何故ですか?

text

1int 2 1 3 4const & 5 11 6 7int 8 4 9 103 113

[補足]
Visual Studio 2017 で実行しました.
何らかの最適化の結果なのか?と思ったのですが,プロジェクトのプロパティで最適化の設定は「無効(/Od)」となっています.

※本件のタイトルは「オブジェクトが生成されない?」として「?」を付けたかったのですが,それだと何故か投稿できなかったので,現状の(断定気味な感じの)タイトル文言になっています.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コンパイラの最適化ではなくて、言語仕様としてコピーが省略されることがあるそうです。

コピー省略

以下の状況において、コンパイラは、たとえコピー/ムーブコンストラクタおよびデストラクタが観察可能な副作用を持っていたとしても、クラスオブジェクトのコピーおよびムーブ構築を省略することが要求されます。

投稿2022/08/31 03:00

int32_t

総合スコア20884

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/08/31 04:28

そんなことが…! ということは, > 私は X 型のオブジェクトを4回作っているつもり っていうのがそもそも間違い,ということですね.
SaitoAtsushi

2022/08/31 09:20

・コピー省略が許容される (省略しなくてもよい) 場合がある ・コピー省略が許容されていた場合の一部は C++17 以降は省略が必須になった (必須ではない場合も残っている) 質問の事例では C++14 まではオブジェクトの生成が 3 の場合も 4 の場合もあり得ますが、 C++17 以降では確実に 3 になります。
fana

2022/08/31 10:33

試しにプロジェクトプロパティで C++14 を指定してみましたが 3 の側でした. こういうのを書かない(:「省略されようがされまいが,どうでもいいし」って言えるような実装を行う)ように注意しないと危険そうですね.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問