C++相談室 part147at TECH
C++相談室 part147 - 暇つぶし2ch951:デフォルトの名無しさん
20/01/30 20:36:13.05 rpXeID84.net
変数は実は二つの値から出来ている
一つは変数の中に入っている値
もう一つは変数のアドレスの値
この二つだ
変数の二重性がC言語の理解を無駄に難しくしてる
アドレスの値が入ってるのは機械語から言えば当然だが
変数なる計算機科学の概念がそこに中途半端にドッキングすると複雑になる
ポインタで躓くヤツが多いのは機械語と高水準言語、その中間に位置するC言語の変数がもつ二重性のせいだ

952:デフォルトの名無しさん
20/01/30 21:07:45 Z7o7STkD.net
ところでコンセプトって何ですか?

953:デフォルトの名無しさん
20/01/30 21:12:58 jdq+FHbl.net
ID:Z7o7STkD
このスレはこういう精神病みたいなやつ多くない?

954:デフォルトの名無しさん
20/01/30 21:22:32 cFc5UMZy.net
>>923
イキった初心者に影響受けすぎ

955:デフォルトの名無しさん
20/01/30 21:34:14 r1oioh07.net
ハゲの悲願だろ

956:898
20/01/30 21:40:54 XvvyOq64.net
皆さん情報ありがとう
ひとまず先生のWeb版「C++入門」をやってみることにしました

957:デフォルトの名無しさん
20/01/30 21:41:00 Z7o7STkD.net
なんだと!

958:デフォルトの名無しさん
20/01/30 22:11:01 6JJixhdc.net
operatorの暗黒面を知れという実習問題
ここでみんなでやってみないか?

959:デフォルトの名無しさん
20/01/30 22:19:13 FR6/17T7.net
単純なキーワード検索できないことぐらいでしょ。暗黒面。

960:デフォルトの名無しさん
20/01/30 22:24:37 R974cSCc.net
operatorは自明な場合しか使わない
構造体代入のように見えて変数の逐次代入してあって、
後で追加された変数が処理されていなかったりして気づかないとかこわい

961:デフォルトの名無しさん
20/01/30 22:26:34 /1tMjbDQ.net
暗黙変換と絡んだ地獄を知らんのか

962:デフォルトの名無しさん
20/01/30 22:36:05 Q1Ec3Ov8.net
>>933
gotoおじさんに答えさせようぜ

963:デフォルトの名無しさん
20/01/30 22:42:34 o/4wL0K/.net
演算子の多重定義とテンプレートの組み合わせはチョー便利
gotoと同じで手放せない便利さ…!

964:デフォルトの名無しさん
20/01/30 23:30:29 HitChVTH.net
>>925
ポインタとアドレスは別物でしょ

965:デフォルトの名無しさん
20/01/31 00:09:44 3dxm9JOP.net
同じといや同じだし違うといやぁちがう
普通の脳味噌のやつには適当に「こまけぇことはいいから同じようなもんだ」と
いっとけば通じるが、このスレにウヨウヨいるような偏執狂タイプの連中に
うかつに「同じ」なんていうとポインタをアドレスと同じように整数を足すと
そのぶんアドレス値が進むと思いこむやつがでてくるからうかつに言えないだけ

966:デフォルトの名無しさん
20/01/31 00:10:58 v4E0eL1J.net
>std::to_address()
   ^^^^^^^
>それが表すのと同じ「アドレス」を「生ポインタ」で返す関数

となってるので公式で
ポインタ=アドレス

967:デフォルトの名無しさん
20/01/31 00:14:07 70BTs5bI.net
>>941
アドレスの値を生ポインタの型として返す、ということだから、
この文脈では明確に別の意味だろ

968:デフォルトの名無しさん
20/01/31 00:15:57 v4E0eL1J.net
いや、to_address() という名前の関数が生ポインタを返すから
ポインタ=アドレスで問題ない
そうじゃないんなら、to_pointer() っていう関数名にするだろ、普通
そこが to_address() となってる

969:デフォルトの名無しさん
20/01/31 00:21:59.86 88e+X9K2.net
オプションだし。
アドレスを返せないファンシーポインタもあるということでは。

970:デフォルトの名無しさん
20/01/31 00:23:11.07 v4E0eL1J.net
俺は古いタイプの人間だから俺の感覚で言うと
to_address() って言えば、生のアドレス値が整数型で帰ってくるという低レベルなイメージ
それが生ポインタが帰ってくるというなら to_pointer() としたいところ
ところが生ポインタが帰ってくるのに to_address() となってるわけだから
ああなるほど、時代は変わったなぁ、と
その辺 C++ の人たちはうるさいと思っていたんだがねぇ
もう公式で ポインタ = アドレス なのね

971:デフォルトの名無しさん
20/01/31 00:24:13.53 MjAWY572.net
pointer指すもの
address指す先
じゃね

972:デフォルトの名無しさん
20/01/31 00:25:21.16 88e+X9K2.net
addressofで返ってくるのもポインタだし。

973:デフォルトの名無しさん
20/01/31 00:27:00.86 88e+X9K2.net
ファンシーポインタからポインタをとるときに使うもののような気がする。
それが不可能なこともあるからオプションなのでは。

974:デフォルトの名無しさん
20/01/31 00:35:50.96 88e+X9K2.net
ポインタ→ポインタあるいはファンシーポインタ・・・pointer_to。
ポインタあるいはファンシーポインタ→ポインタ・・・to_address。
ってことで、ポインタの意味は変わっていないんじゃないのかな。

975:デフォルトの名無しさん
20/01/31 00:42:12.84 v4E0eL1J.net
簡単に考えれば、生ポインタとスマートポインタetcを区別するために
生ポインタの事をアドレスと言ってるわけだよ
スマートポインタetc -> ポインタ
生ポインタ -> アドレス
っていう格上か格下げか知らんが、一つずらした呼び名になってるんだ
俺みたいな古い人間には受け入れがたいものもあるが
「生ポインタなんか使わねーよスマポこそがポインタであり生ポなんかアドレスとでも呼べばよい」
という今の時代に合わせた考え方なんだろう
スマポetc(ポインタ)から生ポ(アドレス)に変換するから to_address()
ちょうど Java のオブジェクトを指す変数は C++ 的には参照だが
Java の人たちはオブジェクトと言うし、そう考えてる、ってのに似てる

976:デフォルトの名無しさん
20/01/31 00:44:40.52 MjAWY572.net
javaの変数はポインタだろ
代入したら指す先が変わるし
null持てるし
まあ演算できない劣化版だが

977:デフォルトの名無しさん
20/01/31 00:46:15.67 S0Mdice7.net
常識なんかどんどん変るからな、とくにC/C++みたいな歴史が長い世界は
ピュアCの時代にはそもそもポインタといえばたしかにその値がアドレス(位置情報)
として機能する値と一致していたがファンシーポインタがある現代では
"ポインタ"の実体とそれが保持したい情報(アドレス情報)は一致すると思わない事が常識になる
"ポインタ"は情報としては何かの位置を差す値を保持はしているがそのオブジェクト
自体は保持しているアドレス情報とはまったく無関係のメモリ空間にある何かである
現代の感覚でいうともし std::to_pointer というネーミングにすると
"は?ポインタをポインタに変換するってどういう意味だよ????"とむしろ混乱の元になるってわけだ

978:デフォルトの名無しさん
20/01/31 00:46:56.64 v4E0eL1J.net
なんか長々書いたが
今の時代、スマポこそがポインタであって、もはや生ポインタはアドレスなんだよ!
人間も父が爺になって子が父に繰り上がっていくものだから
時代と共に名実ともに出世していくのは普通の事なのかもしれない

979:デフォルトの名無しさん
20/01/31 00:47:48.87 88e+X9K2.net
ちょっと江添呼んできて。
電車代出すから。

980:デフォルトの名無しさん
20/01/31 00:51:32 v4E0eL1J.net
ただどうしても言いたいのは
生ポインタは address じゃなくても
別に raw_pointer とか native_pointer で良くね?
address って言ったら、ただの数値のイメージがあるわ

981:デフォルトの名無しさん
20/01/31 00:54:08 88e+X9K2.net
アドレスに無料で型情報をつけるアイデアをひらめいたときは、俺って天才かも?って思ったんだろな。

982:デフォルトの名無しさん
20/01/31 00:54:15 S0Mdice7.net
>>951
我々の感覚からすると実際その通りなんだが、Java脳の人々にとってはそうではない
彼等はスタックという感覚も非常にうすい
なぜならオブジェクトはスタックにはとれず、常に new (ヒープ)しかないから
我々はクラスのインスタンスがスタックにあるのかヒープにあるのかは無意識に常に
判断する事に慣れているが、これをjava脳の人に説明するのはしばしば困難なときがある

983:はちみつ餃子 ◆8X2XSCHEME
20/01/31 00:54:31 T8rV4kLc.net
>>929
宣言をヘッダファイルに分割する方式は C++ の意味不明さの根源のひとつじゃない?
それで宣言と定義を分ける運用がキッチリできるのならそれはそれでよかったけど、
テンプレートとインラインの活用でヘッダファイルに書く分量がだいぶん多くなってヘッダファイルってなんだっけって気持ちになる。
このあたりの仕組みは再編すべきでしょ。 モジュールは要るって。

コンセプトもなぁ、型に制約を付けるって普通にやりたいことじゃん?
ちょっとした制約を付けるためにまわりくどいメタプログラミングなんてやりたくないよ。
現代的な静的型付け言語ならあって然るべき機能が順当に入るってだけのこと……
と思ってたら延び延びになっちゃったから待たされてる感じが強い。

984:デフォルトの名無しさん
20/01/31 00:55:51 MjAWY572.net
javaはヌルポ出すくせにポインタじゃないのか
ポはなんの略なんだろう

985:デフォルトの名無しさん
20/01/31 01:06:28 /0JfR++J.net
>>941
公式は "A value of a pointer type ... represents the address of the first byte ..."
「ポインタ型の値はアドレスを表す」となってる。
URLリンク(timsong-cpp.github.io)
アドレスに加えて他の情報を持つ可能性は否定されないので、いろんな人が言ってるように
厳密にはイコールではないね。

986:デフォルトの名無しさん
20/01/31 01:08:43 U1PsHN2Y.net
>>958
要らんなどと一言も言ってないぞ
言い回しがそれっぽいってだけ

だいたいモジュールはまだ20では標準ライブラリには使われないし
「コンセプトはよ来い」とか上級者ぶりたい初心者がよく言うけど、その中に「自分で実際にコンセプトを定義する奴」などほぼ居ないだろ

個人的にはこれまでSFINAEでどうにかしてたメタプログラミング用の要件チェックのコードを
全部コンセプトに直すのクソだるい(便利になるだろうけどエラーメッセージ以外で実感するのはまだまだ先)
だいたい来るのはわかってんだからもう一喜一憂するような話でもない

987:デフォルトの名無しさん
20/01/31 01:08:59 70BTs5bI.net
今も昔もアドレスとポインタの意味は変わってないんでないの?
「アドレス」=メモリ上のオブジェクトの位置を表す番地(具体的には整数値)
「ポインタ」=
(1)何らかのアドレスを格納したT*型の変数(オブジェクト)。生ポインタ。
(2)「アドレス」と同じ意味で用いる

昔からポインタ(2)の用法でアドレスとポインタを同一視して使われるだけで、ポインタ(1)の用法で「アドレス」とは言わんでしょ。
to_addressの件も、引数として受けとるオブジェクトに対する「アドレス」の値を返すのだからto addressと言う命名で適切だろう。ここでto pointerとしたら直感的に「ポインタ」(1)の意味で解釈されかねず、下手な命名だと思う。

988:デフォルトの名無しさん
20/01/31 01:50:15 kN8V6wKW.net
言葉遊びというか言葉の意味の違いでかみあってないだけじゃろ

こうした文脈でのアドレスという言葉を
アドレス=機械語コードで使うのと同じ表現で指定されてるメモリアドレス
の意味に無自覚に限定してるのか
アドレス=なんらかの形で指定されてるメモリアドレス
のゆるい意味で使っているかの話じゃ

ポインタはアドレスではない、は前者の意味のアドレスに対する話で
今回の話も含めたC/C++の規格レベルでのアドレスは一貫して後者の意味じゃて

989:デフォルトの名無しさん
20/01/31 02:10:23.02 X6LytJOH.net
>>913
管理者がアレだから��‍♀

990:デフォルトの名無しさん
20/01/31 07:12:22 CZDp2h8t.net
アドレスはオブジェクトの番地
ポインタはアドレスを格納する変数

991:デフォルトの名無しさん
20/01/31 08:39:51.12 v4E0eL1J.net
しかしアドレスを返すと言いながら
ポインタで返し、型情報が付いてきているわけだが

992:デフォルトの名無しさん
20/01/31 08:42:38.23 v4E0eL1J.net
緩い意味でのどこかを指し示す意味でのアドレスと言っているなら
スマポもアドレスになるから、to_addressの意味がさらにもう何が何だか

993:デフォルトの名無しさん
20/01/31 08:50:06 1ZJZZZs9.net
ポインタというよりvoid*だね
void以外のポインタは実体の型により訳が変わる点が
単なるアドレスと違うところで

994:デフォルトの名無しさん
20/01/31 10:02:33 v4E0eL1J.net
いやでも、to_address() の戻り値の型は
void* ではなくて、ちゃんとした型情報を持った普通のポインタ型だよ
void* にはならないよ

995:デフォルトの名無しさん
20/01/31 10:06:23 yrj+fbAX.net
またつまんない話で盛り上がってんのな

996:デフォルトの名無しさん
20/01/31 10:42:46 70BTs5bI.net
>>966
返されるのはあくまでアドレス(番地)の値だろう。型情報としてT*型を持つが、それはC/C++ではすべての式や値が型を持つから当たり前の話であって、型を持つからアドレスとは呼ばないというのはおかしな話だと思う。

997:デフォルトの名無しさん
20/01/31 11:36:09.10 v4E0eL1J.net
>型を持つからアドレスとは呼ばないというのはおかしな話だと思う。
つまりは ポインタ=アドレス って事ね

998:デフォルトの名無しさん
20/01/31 11:45:36 GGrzMUVS.net
ポインタってのは変数のことでその中身はアドレスって第3版の時点ではっきり書かれてるぞ
型を持ってるのもあくまで変数の方だ

999:デフォルトの名無しさん
20/01/31 12:34:07 AatGgooz.net
ヌルポ

1000:デフォルトの名無しさん
20/01/31 12:35:25 v4E0eL1J.net
それは当たり前
そういう話ではなく
う~ん、どういえばいいか
例えば、年齢を得る関数 int get_age() ってのがあったとして
俺は別にこれに疑問を持たんし、何とも思わない
to_address
それは int に対して age の方が高度で抽象的な概念になってるから
ところが pointer to_address() の場合はこれが逆になってて
pointer の方が address より高度で抽象的な概念になってる
だからこう、本質的に気持ち悪いというか
先の例で言えば
まぁ適切な例かは分からないが
age_t get_int()
ってなってたらキモイだろう

1001:デフォルトの名無しさん
20/01/31 12:37:15 v4E0eL1J.net
なんか途中で送信してしまった

それは当たり前
そういう話ではなく
う~ん、どういえばいいか
例えば、年齢を得る関数 int get_age() ってのがあったとして
俺は別にこれに疑問を持たんし、何とも思わない
to_address() と何が違うか

それは int に対して age の方が高度で抽象的な概念になってるから
ところが pointer to_address() の場合はこれが逆になってて
pointer の方が address より高度で抽象的な概念になってる
だからこう、本質的に気持ち悪いというか
先の例で言えば、まぁ適切な例かは分からないが
age_t get_int()
ってなってたらキモイだろう

1002:デフォルトの名無しさん
20/01/31 12:45:36 GGrzMUVS.net
なんか勝手に幻想抱いてるけどポインタに入れるものは常にアドレスだから
何もおかしくない

1003:デフォルトの名無しさん
20/01/31 12:46:08 YmbKsQW3.net
VLTのto_addressは欲しい

1004:デフォルトの名無しさん
20/01/31 12:46:37 v4E0eL1J.net
でさ、
age_t get_int() ってのを見たとき
「age_t の中身は int だし
 int を get してそれが age_t に入っているのだから
 解釈としては問題ない」
って感じのことを言ってるレスが結構あったけど
俺はなんか違うような気がするって言ってるわけ

1005:tォルトの名無しさん
20/01/31 12:48:59 v4E0eL1J.net
具体的には >>977 とかね
age_t の中身は常に int だから~的な
だとしても age_t get_int() とは書かんだろう、というのが俺の主張だから

1006:デフォルトの名無しさん
20/01/31 13:07:50 AatGgooz.net
アドレスとポインタってのは
ageとage_tの関係

1007:デフォルトの名無しさん
20/01/31 13:13:53 GGrzMUVS.net
じゃあint *p = &a;の&もアドレスを取る演算子じゃなくて
ポインタを取る演算子に名前変えてもらうようにお願いしたら?

1008:デフォルトの名無しさん
20/01/31 17:37:24 aVH6lH01.net
アドレスはデコーダに入力するビット列 (ハードウエアの概念)
ポインタはアドレスを扱うことを目的とするデータ型 (プログラム言語の概念)

IEEE754とdoubleのような関係だ

1009:デフォルトの名無しさん
20/01/31 17:44:13 MQmpFGUT.net
通常はポインタが数値であることなんてのは意識せんわな。
リングバッファなんかを取り扱うなら嫌でも意識することになるが。

1010:デフォルトの名無しさん
20/01/31 18:16:27.29 HzrC4w9c.net
ポインタが数値がどうか意識しないと
リングバッファも作れないようなのが
C++を使うのか

1011:デフォルトの名無しさん
20/01/31 18:34:36 Dscz4LHl.net
分岐無くす高速化でもしているんじゃね

1012:デフォルトの名無しさん
20/01/31 18:37:20 CZDp2h8t.net
>>976
その例は逆
アドレスとポインタは本質(イデア)とその表現の関係にある
(イデア <-> 表現)
年齢 <-> 整数
色 <-> RGB値
アドレス <-> ポインタ

この関係に照らせば、年齢を取得する場合は
int get_age();
だし、色を取得する場合は
RGB get_color();
だし、アドレスを取得する場合は
T* get_address();
になる

1013:デフォルトの名無しさん
20/01/31 18:53:37 Nt0XFA2s.net
その哲学続けるの

1014:デフォルトの名無しさん
20/01/31 19:10:20 xOuBGXY8.net
>>986
分岐?
それも普通は不要

アドレスを意識するのはDMAなど
ハードウェアでリングバッファを使う時くらい

1015:デフォルトの名無しさん
20/01/31 19:13:50 MjAWY572.net
ハードウェアとのDMAならポインタにいれるアドレス自体は気にしないだろ
特定の物理メモリを適当な仮想アドレスにマップして使うのだし

1016:デフォルトの名無しさん
20/01/31 19:35:40 xOuBGXY8.net
DMAが扱うのは物理アドレス

1017:デフォルトの名無しさん
20/01/31 19:42:13 xOuBGXY8.net
じゃないのもあったりするのか?
チープなマイコンのDMAしか直接扱ったことがなくて

1018:デフォルトの名無しさん
20/01/31 19:51:22 aVH6lH01.net
仮想アドレスってことはページフォールトがあるってことだろ
OSによってページインされるまで待つことになるが
そこまでペリフェラルで面倒見る必要あるか考えてみそ

1019:◆QZaw55cn4c
20/01/31 19:51:32 tTpxWp9S.net
>>933
どれくらいブラックでしょうか?
スレリンク(tech板:21番)
URLリンク(ideone.com)

1020:デフォルトの名無しさん
20/01/31 19:53:30.58 aVH6lH01.net
未練

1021:デフォルトの名無しさん
20/01/31 19:54:58.34 xOuBGXY8.net
>>993
フォルトならエラーで止めときゃいいんでない?
そこまでハードで面倒見る必要は無い

1022:デフォルトの名無しさん
20/01/31 19:55:32.42 yrj+fbAX.net
最近はIOMMUが一般的

1023:デフォルトの名無しさん
20/01/31 20:02:09.40 yrj+fbAX.net
>>993
おいおいそんなわけないだろ
デバイスがさわるメモリはページアウトしない
でも物理アドレスを使わない理由は何でしょう?
あスレ違いだな

1024:デフォルトの名無しさん
20/01/31 20:34:35 aVH6lH01.net
>>996
ペリフェラルって何だと思う?

>>998
循環論法だな

1025:デフォルトの名無しさん
20/01/31 20:54:47.19 Nt0XFA2s.net
C++相談室 part148
スレリンク(tech板)

1026:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 44日 2時間 57分 54秒

1027:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch