アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。毎度お世話になります。少し抽象的な質問になってしまうかもしれませんが、ご容赦ください。
 C++の特徴としてあげられるのが「ポインタ」の存在だと思いますが、勉強していていつこれを使えばよいのかいまいちピンときません。
 動作が速くなる、という利点があるのは理解していますし、STLなどでもイテレータがポインタのようなふるまいをするのも知っています。しかし、実際にnewやdeleteで自分で確保、開放をおこなうイメージがあまりなく、「ポインタ」について自分はどこまで理解できているのか不安です。
 実際のコード中でポインタを使うタイミングはどのようなときでしょうか?

A 回答 (6件)

Stringの受け渡し、リストの受け渡し、様々なフィールドを持つオブジェクトの受け渡し、動的に確保した領域の受け渡し、受け渡した後で値の変更した時に追随してほしい場合といったあたりでしょうか。


特別にこうでなければならないという決まりはありませんが以下のように分類できます。

■ポインタでの受け渡いが必須の状況
・受け渡した後で値の変更した時に追随してほしい場合

■ポインタでの受け渡しが推量される状況
・様々なフィールドを持つオブジェクトの受け渡し
→これらは値を全コピーすると大変な負荷がかかります。
 ただし、受け渡したデータを書き換えられても、呼び出し元でデータが変わっては困る場合は必要な部分だけ値渡しが推奨されます。。。

■ポインタでの受け渡しが状況によって推奨される状況
・リストの受け渡し
・動的に確保した領域の受け渡し
・Stringの受け渡し
→概ね128Bitを超える可能性がある場合はポインタでの受け渡しが推奨されます。
 一方128Bit以下であることが保証される場合は、値渡ししても問題ありません。

■ポインタの受け渡しが推奨されない状況
int、short、long、double、flostなど概ね128Bit以下のデータ型の受け渡し
→ポインタ渡しはアドレス(64Bitまたは32Bit)を受け渡し、受け取った側はメモリアクセスして取得してきたアドレスに再度アクセスしなおすというオーバヘッドが発生します。
 小さすぎるデータは値変更への追随が必須といった事情がなければポインタ渡しはすべきではありません。
    • good
    • 0
この回答へのお礼

それぞれ、場合に分けて下さり、とても分かりやすいです。
言われてみると、「値変更」などは実際に自分でも行っていたアドレスを使ったものですし、他のものも含め、無意識のうちにポインタという機能を使っていた気がします。
改めて分類していただくことで、頭の中が整理された気がします。回答、ありがとうございました。

お礼日時:2018/02/12 19:44

ポリフォー二ズムとか「関係」の実装とか、ヒープに配列確保するとか・・・



なんぼでもありますよね。

逆に無しでどうやってるのか知りたいです。
    • good
    • 0
この回答へのお礼

確かに!言われてみればたくさんありますね。
自分はまだ勉強中で、仕事で使ってるわけでもないので実践的なコードを書いたことがないもので...。
回答ありがとうございました。

お礼日時:2018/02/13 22:53

別にC++ の特徴というほどでもないとは思います。


むしろ、「C++ってば、未だにポインタに頼ってるんだってよ」くらい。

で、ポインタというものは、なにかの処理で、「確かにポインタを介さないと手も足もでない」という場面になったら、使えばいいです。
    • good
    • 0
この回答へのお礼

ポインタってそういうものだったのですか!?
てっきり、メモリに直接アクセスできるから動作が速い便利なもの、だと思っていました。少し考え方とかも見直したほうがいいのかも...。
回答ありがとうございました。

お礼日時:2018/02/13 22:55

「ポインタ」というものをどう解釈するかって問題はあって, 例えば C++ や Java の参照も「ポインタの亜種」といえなくはない. そしてそう考えると, (「ポインタ」というよりもその値である「アドレス」だけど)


オブジェクトのアイデンティティ
ともいえるのではないかな.
    • good
    • 0
この回答へのお礼

勉強になります。確かに参照も受け私の際は値自体を変えるものだし、亜種といえないこともないですね...。
回答、ありがとうございました。

お礼日時:2018/02/14 18:18

ちょっと別の観点から言えば、多くの場合、(データ)メモリへのアクセスは、変数名を経由して行います。


だから、プログラミングの際に必要な変数がすべて宣言できれば、ポインタはなくてすませることができます。
(少し嘘が混じってますが)

逆に、「どのくらいの変数が必要か実行してみないとわからない」という場合があります。
単純にデータ量がわからないとか、入力されたデータを見ながら、データ構造を組み立てなければならないとか。

そういう場合、あらかじめ宣言した変数だけではアクセスできなくなるので、「動的に宣言した変数」という性格を持つ、ポインタの出番になります。
    • good
    • 0
この回答へのお礼

ユーザー定義型などがこれに当てはまり、ここでnewの出番!ということか...。
回答、分かりやすかったです。ありがとうございました。

お礼日時:2018/02/14 17:56

抽象的な意味でのポインタ(オブジェクトへの参照)はオブジェクト指向言語にとって必須のものです。

ただガーベージコレクタのないポインタは本質的に安全でないのですけどね。
C/C++のポインタは非常に原始的で、ガーベージコレクタどころか参照数管理もしてなく、メモリ管理を利用者任せにするオブジェクト指向言語としてはあまりうれしくないものです。一方で、例えばオブジェクト指向言語のメモリ管理を実装するといった低水準の実装にはこういう原始的な機能がないと困るのですけど。
ということで、ポインタを使うのはメモリ管理自体を作成したいときですね。
それ以外は基本スマートポインタを使いましょう。というか高水準アプリケーションならメモリ管理してくれない言語じゃなく、メモリ管理が言語仕様に含まれる言語を使う方が楽です。
    • good
    • 0
この回答へのお礼

メモリ管理自体を作成することはなかなかないものでしょうし...。基本はスマートポインタを使って(あるいは他の言語を使って)プログラミングすべし!ということですね。
回答、ありがとうございました。

お礼日時:2018/02/14 18:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!