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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

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

Q&A

4回答

2886閲覧

関数の引数(コピー渡し)の望ましいサイズとは?

Taffy

総合スコア33

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

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

0グッド

2クリップ

投稿2020/01/30 16:08

#わからないこと
同じ処理を使う場面が多かったので、関数にまとめました。
引数として std::string を使用したのですが、
サイズが不定で、使い方によっては巨大なサイズのデータをコピーすることになる可能性を指摘され、参照渡しに修正しました。

修正前のコード

C++

1int XXXX (std::string YYY) 2{ 3 ... 4}

そこで質問なのですが、一般的に関数の引数(値渡し、コピー渡し)として
望ましい型、何バイト程度などのサイズなどはあるのでしょうか?

変数のサイズが決まりきっているもの・・・コピー渡し
変数のサイズが不定、大きいもの・・・参照渡し といったイメージで
各自決めて実装されているのでしょうか?

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

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

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

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

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

guest

回答4

0

サイズが不定で、使い方によっては巨大なサイズのデータをコピーすることになる可能性を指摘され、参照渡しに修正しました。

本題ではありませんが、「コピーの手間を省く」ために参照渡しとする場合、const参照としておきましょう。

constでない参照を渡した場合、うっかりオブジェクトを書き換えると呼び出し側にも影響することになります。

投稿2020/01/30 22:24

maisumakun

総合スコア145183

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

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

0

こんにちは。

参照やポインタで渡す場合、一般にアドレス長(64bitsモデルなら8バイト)の領域を使います。
ですので、例えば1バイトの変数をポインタで渡すと1バイトで済むはずが8バイト使うケースがあります。
そのようなことを考慮し、私はポインタのバイト数より小さい引数はコピー渡しすることが多いです。

でもレジスタ渡しになるとあまり意味ない工夫ですし、あまりギチギチにすると可読性が悲惨なことになります。実引数を修正したい時はポインタか参照で渡す必要がありますので、ケースバイケースですが。

投稿2020/01/30 17:36

Chironian

総合スコア23272

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

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

0

関数の引数、及びAUTO変数ははスタック上に確保される、というのはおわかりでしょうか。
スタック、というエリアはいわば一時使用メモリ、という役割を持ちますが、それを関数呼び出しごとに、引数、変数エリアとして消費し、関数が終われば開放されるという動作となります

さて、問題は、このスタックという領域は一つのプログラム全体で数Mバイト程度とサイズははっきり決まっていて、消費時にこの領域をオーバーしてしまうと、プログラムが暴走してしまう(運が良ければエラー停止)というところにあります

ということで、最適なサイズ、などを考えてる場合じゃなく、引数及びAUTO変数のサイズが見積もれないという事態には絶対にならないようにするべき、ということになります

投稿2020/01/30 21:44

y_waiwai

総合スコア87774

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

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

yudedako67

2020/01/31 08:48

一つ補足しておくと、クラス内部でヒープ領域を利用できるので、std::arrayのようにサイズが大きくなるとスタック上のサイズも変化するものがある一方、std::vectorやstd::stringではデータが大きくなってもスタック領域は圧迫されません。 そういう意味で質問の中で「変数のサイズ」と呼ばれているものと回答の中での「変数のサイズ」とは別のもので、必ずしも一致するものではありません。
guest

0

各自決めて実装されているのでしょうか?

厳密なルールがあるわけではないでしょうから,最終的にはそうなると思います.

個人的には「組み込み型かそれ以外か」がわかりやすい線引きかと思います.
それだと,struct S{ char c; };みたいな「小さい」やつも参照で渡すのか?とかいう話にもなりますが,私はそうしています.

投稿2020/01/31 01:26

fana

総合スコア11656

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問