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

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

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

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

Q&A

解決済

2回答

1445閲覧

C++ 20 ヒープとスタックを区別するには

bjnes

総合スコア113

C++

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

0グッド

0クリップ

投稿2020/10/13 02:25

前提・実現したいこと

引数に指定された文字or文字列がヒープにあるのかスタックにあるのか受け取り側で静的な振る舞いで変える方法ってあるんでしょうか?

該当のソースコード

つまりこんなことがしたい

C++20

1template<class T> 2class StringStrage; 3 4 5template<HeapStringConcept T> 6class StringStrage<T> 7{ 8 T &obj; 9 StringStrage(T obj):Value(move(obj)){}; 10} 11 12template<StackStringConcept T> 13class StringStrage<T> 14{ 15 T &obj; 16 StringStrage(T obj):Value(copy(obj)){}; 17} 18 19int main() 20{ 21 StringStrage heap = StringStrage( new char[5]); 22 char stack_arg[5] = {'h','o','g','e','\0'}; 23 StringStrage stack = StringStrage(stack_arg); 24}

もしかしたら、テンプレート引数が間違ってるかもしれません。

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

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

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

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

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

maisumakun

2020/10/13 02:31

なぜそれを行いたいのでしょうか?
bjnes

2020/10/13 02:47

まず、前提として、引数で渡されたオブジェクトがスタックに積まれているオブジェクトの場合、 それを指し示すポインタをずっと持ち続けるのは、良くないですよね。引数オブジェクトの寿命と生成するオブジェクトの寿命が異なる場合がありますから。 なので、スタックで渡されてきたものはヒープにコピーを取る必要があると思います。 一方で、ヒープにあるものは、所有権だけ譲渡してもらえれば、上記の無駄なコピーをやらなくて済むので 処理効率が上がるかなぁーと考えました。 私、なにかおかしいこと考えてますかね(汗
guest

回答2

0

ベストアンサー

なので、スタックで渡されてきたものはヒープにコピーを取る必要があると思います。

前提が間違っています。一時オブジェクトへのポインタを渡して正しく動作しなくなってしまうのは、渡す側の責任です。呼ばれた側で対処すべきものではありません。

投稿2020/10/13 02:48

編集2020/10/13 02:56
maisumakun

総合スコア145208

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

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

maisumakun

2020/10/13 02:51

スマートポインタでラップすれば、そもそも「プログラマーがポインタの指し先を考える」ということからも解放されますが、それは取れない手段なのでしょうか?
maisumakun

2020/10/13 02:57

文字列なら素直にstd::stringを使えばいいかと思います(中身は動的に確保されますので、「スタックに置かれる」ような事自体が起こりえません)。
bjnes

2020/10/13 03:22

渡す側の責任と言ってしまえば、そこまでですが、最低限エラーですよー的な優しいナニカを してあげたいなと考えてます。 スマートポインタやstd:stringの実装は引数を判別して、中身を動的に正しく確保してくれるのでしょうか? だとしたら、それが知りたい答えのような気もします。
maisumakun

2020/10/13 03:31 編集

> スマートポインタやstd:stringの実装は引数を判別して、中身を動的に正しく確保してくれるのでしょうか? 初期化時は基本的にコピー、かと思います(特に、std::stringは領域管理も自前で行いますので、コピー以外の選択肢がありません)。 スマートポインタの方はムーブセマンティクスやコピー省略など、コンパイラで保証される範囲内でコピーを削減するテクニックがいくつかありますが、それらも使える条件がありますので、うまくいかないときはコピーになります。
bjnes

2020/10/13 03:31

なるほど。 いろいろと教えていただいてありがとうございました。 割と考えがまとまりました。
guest

0

MoreEffectiveC++ 第27項

を使うと、スタックオブジェクトとヒープオブジェクトを判別できる。
スタック→ヒープへ最低限一回はコピーされるのかもね。

投稿2020/10/13 03:49

bjnes

総合スコア113

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問