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

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

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

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

Q&A

2回答

1201閲覧

emplace_backでpush_backを代替できるのでしょうか

insecticide

総合スコア315

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

0グッド

0クリップ

投稿2022/06/24 04:48

編集2022/06/24 06:06

C++

1std::vector<std::unique_ptr<std::thread>> thread_list; 2thread_list.push_back(std::make_unique<std::thread>(hoge, i*10, i));

上記文の中の「make_unique」メソッドはobjectの生成に優れる特徴があると評判されています。
けれども、この場合、emplace_back()を利用するについてメリットがあると良く紹介されています。
それでは 

C++

1thread_list.emplace_back(std::thread(hoge, i*10, i)); 2を用いて 3thread_list.push_back(std::make_unique<std::thread>(hoge, i*10, i));

を置き換える事ができるのでしょうか=要は効果的に、パファオーパンス的に同じでしょうか。

よろしくお願い致します。

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

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

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

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

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

insecticide

2022/06/25 00:47

情報ありがとうございます! まあ、DELETE自動化の視点から必要な考え方も多いでしょう。更にNEWも同時に無くす可能性もあるらしいです。 昔、8086のような強力で実行能率が良く、普及もかなりされているアセンブラ言語がある以上、C言語なんかを使いたくない方も少なくなかっったようですね。
guest

回答2

0

以前の質問std::vector<std::unique_ptr<std::thread>> と例にしましたが、よく調べてみると std::thread はムーブ可能なので、std::vector<std::thread> でいいですね。

ムーブ可能クラスの場合、push_back()emplace_back() のパフォーマンスはほぼ変わらないと思います。

ムーブ非対応でコピー可能クラスの場合、emplace_back() ではコピーを一回省けるので速くなる可能性があります。

一般的には、push_back() のほうが好まれます

投稿2022/06/24 06:10

int32_t

総合スコア20856

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

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

insecticide

2022/06/24 14:48 編集

詳しくご説明本当にありがとうございます! 《ムーブ可能クラスの場合》。。。 《ムーブ非対応でコピー可能クラスの場合》。。。 ただ、 《一般的には、push_back() のほうが好まれます。》に関しては、単にpush_back()の歴史が emplace_back()より長い原因ではないでしょうか。
int32_t

2022/06/26 21:42

> 単にpush_back()の歴史が emplace_back()より長い原因ではないでしょうか。 いいえ。リンク先に書いてあるとおり、ミスのしやすさやコード可読性の観点から emplace_back() が避けられてます。
guest

0

vector<unique_ptr<T>>だとemplace_backにT*を渡すわけで、emplace_back(new T())とか書くならpush_back(make_unique<T>())した方がマシでは。
vector< thread >にするなら、emplace_backを使うのが書きやすいとは思う。

投稿2022/06/24 05:25

編集2022/06/24 05:26
matukeso

総合スコア1590

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

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

insecticide

2022/06/24 06:10

貴重なコメントありがとうございます。 > emplace_back(new T())とか書くならpush_back(make_unique<T>())した方がマシでは。 それなら、  thread_list.emplace_back(std::make_unique<std::thread>(hoge, i*10, i)); を用いて thread_list.push_back(std::make_unique<std::thread>(hoge, i*10, i)); を代替すれば、ベストになります?
matukeso

2022/06/24 06:45

どうせmake_uniqueのコストで隠れる程度の、unique_ptrのdefault constructのコストを省きたいというなら、そうなる。
insecticide

2022/06/24 14:44

》どうせmake_uniqueのコストで隠れる程度の、unique_ptrのdefault constructのコストを省きたいというなら、そうなる。 問題の本質でしょうね。 とても啓蒙的! 本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問