[過去ログ]
C++相談室 part156 (1002レス)
C++相談室 part156 http://mevius.5ch.net/test/read.cgi/tech/1621389313/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
554: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/06/28(月) 00:31:47 ID:nxXyAxnK >>553 言語に関係あるという話はしてないよ。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/554
555: デフォルトの名無しさん [] 2021/06/28(月) 00:34:04 ID:AdoNh79c Javaはメモリモデルも明確に決まってたんじゃないかな http://mevius.5ch.net/test/read.cgi/tech/1621389313/555
556: デフォルトの名無しさん [sage] 2021/06/28(月) 02:47:25 ID:DsF+RsPk 多言語間でポータブルにしたくば XMLとかyamlとかjsonにしたら良いんじゃーあ! http://mevius.5ch.net/test/read.cgi/tech/1621389313/556
557: デフォルトの名無しさん [sage] 2021/06/28(月) 03:12:57 ID:DsF+RsPk どうしてもバイナリファイルが良いという向きは、 パディングとかもfwrite()とfread()で取り扱い得る といっても単に適当なサイズのバイトの配列として読み書きして メモリ上でご使用のアーキテクチャーに合わせることになるが fwrite()とfread()を使わなければもっとマシになるという類の話ではない http://mevius.5ch.net/test/read.cgi/tech/1621389313/557
558: デフォルトの名無しさん [sage] 2021/06/28(月) 03:44:20 ID:QdlxBFRk 別にバイナリ吐き出すときは必ずポータブルにする必要ないだろうに なんで勝手に条件追加して批判してんだか http://mevius.5ch.net/test/read.cgi/tech/1621389313/558
559: ◆QZaw55cn4c [sage] 2021/06/28(月) 07:17:27 ID:oYDZ1nWa >>556 お手軽な XML/yaml/json 読み書きライブラリを紹介してください、よろしくお願いいたします http://mevius.5ch.net/test/read.cgi/tech/1621389313/559
560: デフォルトの名無しさん [sage] 2021/06/28(月) 07:48:39 ID:cZa6zFVz >>554 PerlでもPythonでもC++と変わりなくバイナリの読み書きはできるという話をしてるんだが。 エンディアンがわからなければC++でも読めないというのは当たり前。 フォーマットを知らないバイナリファイルってことだからな。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/560
561: デフォルトの名無しさん [] 2021/06/28(月) 08:30:45 ID:RYml5aTx これ以上、バイナリ読み書きの話をする前にとりあえず>>538に目を通せ 車輪の再発明をしたいのか、既存の車輪を利用したいのかをはっきりさせてから話を進めたほうがいい http://mevius.5ch.net/test/read.cgi/tech/1621389313/561
562: デフォルトの名無しさん [sage] 2021/06/28(月) 09:09:23 ID:XSoi24Ug 僕はノンバイナリーだから読みたくないです http://mevius.5ch.net/test/read.cgi/tech/1621389313/562
563: デフォルトの名無しさん [sage] 2021/06/28(月) 09:56:34 ID:SQEqm/bz こんどはバイナリに噛み付いてるキチガイがいるな http://mevius.5ch.net/test/read.cgi/tech/1621389313/563
564: デフォルトの名無しさん [sage] 2021/06/28(月) 11:09:48 ID:bLKGwGq9 標準ライブラリのみであれば車輪の再発明しか手段がない? http://mevius.5ch.net/test/read.cgi/tech/1621389313/564
565: デフォルトの名無しさん [] 2021/06/28(月) 12:52:58 ID:bIZ7S0Sd MsgPack は json と同じで無駄が多い http://mevius.5ch.net/test/read.cgi/tech/1621389313/565
566: デフォルトの名無しさん [] 2021/06/28(月) 12:59:22 ID:bIZ7S0Sd >>558 温暖化詐欺SDG詐欺と手口が一緒だな http://mevius.5ch.net/test/read.cgi/tech/1621389313/566
567: デフォルトの名無しさん [sage] 2021/06/28(月) 13:35:34 ID:quG4wdoj >>559 WSL2, Ubuntu 18.04 では、 apt list --installed libxml2 libxml2/bionic-updates,bionic-security,bionic-updates,bionic-security, now 2.9.4+dfsg1-6.1ubuntu1.4 amd64 [インストール済み、自動] http://mevius.5ch.net/test/read.cgi/tech/1621389313/567
568: デフォルトの名無しさん [] 2021/06/28(月) 13:52:30 ID:5OdlGlMi Comparisonて何て読むの? コンパリソン? http://mevius.5ch.net/test/read.cgi/tech/1621389313/568
569: デフォルトの名無しさん [sage] 2021/06/28(月) 14:55:11 ID:qFu4iqR6 msgpackはクソやね バイナリの扱いに慣れないスクリプト坊がバイナリを扱わざるを得なくなった場合を除いては全く価値のないフォーマット http://mevius.5ch.net/test/read.cgi/tech/1621389313/569
570: デフォルトの名無しさん [sage] 2021/06/28(月) 14:56:29 ID:R7ScYjSP >>568 こんpぇぁりzん https://www.google.com/search?q=comparison http://mevius.5ch.net/test/read.cgi/tech/1621389313/570
571: デフォルトの名無しさん [] 2021/06/28(月) 15:26:12 ID:JcAv6JCW >バイナリの扱いに慣れないスクリプト坊がバイナリを扱わざるを得なくなった場合 この表現すき💛 http://mevius.5ch.net/test/read.cgi/tech/1621389313/571
572: デフォルトの名無しさん [] 2021/06/28(月) 15:26:13 ID:JcAv6JCW >バイナリの扱いに慣れないスクリプト坊がバイナリを扱わざるを得なくなった場合 この表現すき💛 http://mevius.5ch.net/test/read.cgi/tech/1621389313/572
573: デフォルトの名無しさん [sage] 2021/06/28(月) 16:13:11 ID:dKXkMhte >>569のお勧めは何? 理由もセットで教えて頂戴。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/573
574: デフォルトの名無しさん [sage] 2021/06/28(月) 16:32:50 ID:uBCftstC 「モジュール」はC++で作られたパッケージを配布しやすくしますか? http://mevius.5ch.net/test/read.cgi/tech/1621389313/574
575: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/06/29(火) 00:03:30 ID:OP5z1lEO >>560 そうだよ。 その当たり前の話をしてるんだよ……。 互換性の問題というのは内部的なものなら問題が起きたときに修正すればいいが、 外部に出ているデータはそれに皆が合わせなければならない仕様と化すので 特定の C++ 処理系 (実行環境) でなら処理できるけど 出力されたデータフォーマットの詳細はわからんし処理系のバージョンがちょっと変わったら変わるかもしれん というのでは困るやんというごく普通の話。 (もちろん普通の処理系はちょっとバージョンが更新されたくらいでは バイナリ互換性をあまり壊さないように配慮するのが普通ではあるけど。) http://mevius.5ch.net/test/read.cgi/tech/1621389313/575
576: デフォルトの名無しさん [sage] 2021/06/29(火) 00:15:58 ID:MxyOwUyS >>575 いつのまにか話ずらしてんな。 >>535 >読み書きに支障はないが、言語上の型とバイナリの対応付けについて明確な保証がないと困る。 言語上の型とバイナリの対応付けはPerlでもPythonでも保証されてるんだよ。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/576
577: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/06/29(火) 00:20:30 ID:OP5z1lEO >>576 されないよ。 ファイルのバイナリが BE か LE かわかっていない状況の話なんだから。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/577
578: デフォルトの名無しさん [sage] 2021/06/29(火) 08:12:22 ID:MxyOwUyS >BE か LE かわかっていない状況 これの意味だが ・全く何の情報もない状況 →どんな言語を使おうが正しく読める保証がないし論ずるだけ無駄。 ・>>552の「C++ で書いてメモリをそのまま書き出したらそれのエンディアンは保証されてない。」状況 →「自環境のエンディアン」で読めるのはC++でもPerlでもPythonでも同じ。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/578
579: デフォルトの名無しさん [sage] 2021/06/29(火) 08:29:00 ID:qbDSHPwG >>573 方法はともかく、普通にビット列かバイト列のレベルで仕様を決めてその通りに読み書きすりゃいいんじゃない C++プログラマなら生データの扱いは得意でしょ とはいえ手間がかかるしミスを生じやすいのも事実なので、めんどくせえ今すぐ読み書きしたいってだけならprotobufとかavroとか他にも色々あるよ msgpackとの大きな違いはスキーマの有無で、スクリプト言語じゃなきゃスキーマはあったほうが便利だし、一般に実装が高速になりやすくデータサイズも小さくできる http://mevius.5ch.net/test/read.cgi/tech/1621389313/579
580: デフォルトの名無しさん [sage] 2021/06/29(火) 08:38:20 ID:zFDqDEto >>579 「他人含めた仕様の強要」という観点が抜けてない? それに、何回車輪の再開発させるつもりだよ。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/580
581: デフォルトの名無しさん [sage] 2021/06/29(火) 08:57:28 ID:bpKPj1F0 >>580 強要したいならちゃんと仕様書書いて押し付けるだけの話 実装が面倒ってんならそれこそprotobufのようなスキーマのある汎用フォーマットならスキーマさえ書いとけば大抵の言語でserde用の型の自動生成までやってくれるよ その点で言えばmsgpackは所詮mapなんで、仕様を強要したいなら別途仕様書が必要になるよ http://mevius.5ch.net/test/read.cgi/tech/1621389313/581
582: デフォルトの名無しさん [sage] 2021/06/29(火) 10:54:24 ID:c9Dh6S0q 実の無い話はすぐ切り上げるのが大事だぞ お互いの時間を無駄にしあってはいけない http://mevius.5ch.net/test/read.cgi/tech/1621389313/582
583: デフォルトの名無しさん [sage] 2021/06/29(火) 12:00:43 ID:gO51uzZW 他人に構ってもらわなければ生きて行けないかまってちゃん人種は救いようがない http://mevius.5ch.net/test/read.cgi/tech/1621389313/583
584: デフォルトの名無しさん [sage] 2021/06/29(火) 13:20:29 ID:IWxlvq96 >>560 Perlでバイナリを扱うのは物凄く大変だった。 さまざまな自動変換がかかってしまうので、結局どうなるのかが分からない事が 多かったから。 例えば、数値なのか、文字なのかの区別が曖昧な感じで、たままた数値が入った 文字が、勝手に数値になって、'0' + 1 が、0x30 + 1 のつもりが、0 + 1に なってしまったり、物凄く難しかった。 ASCIIコードの数値番号を取得したいと思っても、結果が数値の入った文字列に なったりとか、よく分からない事が多かった。 何を何に変換しているのか、めちゃくちゃ難しかった。 それがRubyになって、素直な感じになった。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/584
585: デフォルトの名無しさん [sage] 2021/06/29(火) 13:23:14 ID:IWxlvq96 >>584 16進数も複雑だった。 単に表示したいために16進数の文字列に直したら、どこかで勝手に数値として 解釈されていつの間にか思いもよらぬ「もの」に変化したりとか。 それで、バイナリや文字を細かく扱い際には、如何にCが楽であるかを思い知った。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/585
586: デフォルトの名無しさん [sage] 2021/06/29(火) 14:44:15 ID:UyxOx+sC Cというか、それは最早動的型付けか静的型付けかとかの話では http://mevius.5ch.net/test/read.cgi/tech/1621389313/586
587: デフォルトの名無しさん [sage] 2021/06/29(火) 15:11:46 ID:IWxlvq96 >>586 JSやRubyは、動的型付けだけど、Perlのように文字と数値の相互変換が勝手に 起きたりはしない。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/587
588: デフォルトの名無しさん [sage] 2021/06/29(火) 15:25:41 ID:MxyOwUyS pack/unpack使えばそんな変なことにはならんぞ。 perlでバイナリ扱うなら常識。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/588
589: デフォルトの名無しさん [sage] 2021/06/29(火) 15:37:31 ID:IWxlvq96 >>588 それ自体はそうでも、その後いろいろなことが起きてややこしかったな。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/589
590: デフォルトの名無しさん [sage] 2021/06/29(火) 18:21:23 ID:7i3kfcoq 強気なこと書き込む人はだいたい経験浅い http://mevius.5ch.net/test/read.cgi/tech/1621389313/590
591: デフォルトの名無しさん [sage] 2021/06/29(火) 18:35:19 ID:tM55IFN7 ボカァもうOOPは捨てた!w http://mevius.5ch.net/test/read.cgi/tech/1621389313/591
592: ◆QZaw55cn4c [sage] 2021/06/29(火) 18:54:36 ID:qfvhyFdx >>578 あなたはちょっと残念な人ですね 実際には C/C++ ならば、処理系が LE/BE どちらに依存かにもかかわらず処理系に独立して LE なら LE用, BE なら BE用に書きわけることができる‥‥? ?の証拠は >>548 ことほど左様に、処理系に独立して LE/BE を書き分けることができるのなら「〜するべき」とかいう「べき論」は無意味でしょう 多分、はちみつ氏は?を失念していたのでしょう、べき論なんて振り回しても無駄なのに、あいかわらずべき論に拘泥するところなどは「ダメリカ様が守ってくださる!」的な馬鹿左翼並の振る舞いですから、そろそろあきらめるべきでしょうね http://mevius.5ch.net/test/read.cgi/tech/1621389313/592
593: デフォルトの名無しさん [sage] 2021/06/29(火) 21:05:01 ID:MxyOwUyS >>592 ? なにか別の話とごっちゃにしてないか?べき論って??? >実際には C/C++ ならば、処理系が LE/BE どちらに依存かにもかかわらず処理系に独立して LE なら LE用, BE なら BE用に書きわけることができる‥‥? C/C++じゃなくてもPerlやPythonだってLE/BE書き分けられる手段は用意されているって話をしていただけなんだがな。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/593
594: デフォルトの名無しさん [sage] 2021/06/29(火) 21:08:28 ID:MxyOwUyS >>589 pack/unpackの後の話ならバイナリファイルとか関係なくて、ようは「Perlがややこしかった」というだけだろ。 >例えば、数値なのか、文字なのかの区別が曖昧な感じで、たままた数値が入った >文字が、勝手に数値になって、'0' + 1 が、0x30 + 1 のつもりが、0 + 1に >なってしまったり、物凄く難しかった。 これなんかまさにそうだな。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/594
595: デフォルトの名無しさん [sage] 2021/06/29(火) 23:39:33 ID:uMLxaJ5z この話のゴールどこ? http://mevius.5ch.net/test/read.cgi/tech/1621389313/595
596: デフォルトの名無しさん [sage] 2021/06/29(火) 23:59:54 ID:yAVMK7JX pack/unpack使え http://mevius.5ch.net/test/read.cgi/tech/1621389313/596
597: デフォルトの名無しさん [sage] 2021/06/30(水) 00:03:10 ID:6riO4yVW use strict use warnings;; use Carp; use utf8; #use Encode; # ウィンドーズのパスを使う場合必須 our $os_enc = 'cp932'; binmode STDIN, ":encoding($os_enc)"; binmode STDOUT, "encoding(%os_enc)"; でエラーかどうかは (エラー出ない条件) or croak "*** ERR ***"; # 改行は付けない にしてpack/unpackを使ったら何も起きない http://mevius.5ch.net/test/read.cgi/tech/1621389313/597
598: デフォルトの名無しさん [sage] 2021/06/30(水) 00:07:43 ID:d2kdzRUr Encodeは日本語入りのパスとか$ARGV[]とかをutf8にしたり戻したりするのに使う コマンドプロンプトの文字をutf8にしたら実はEncode要らんかもしれんがそこまでは知らん http://mevius.5ch.net/test/read.cgi/tech/1621389313/598
599: デフォルトの名無しさん [sage] 2021/06/30(水) 00:40:50 ID:uW/S3RKL Perlの特定の某なんか出されても知らんがな…… http://mevius.5ch.net/test/read.cgi/tech/1621389313/599
600: デフォルトの名無しさん [sage] 2021/06/30(水) 03:10:15 ID:vkj6zKzF Perl Python PHP Java C# EcmaScript TypeScript Javaくらいは流石に教養だろうさ。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/600
601: デフォルトの名無しさん [sage] 2021/06/30(水) 07:38:15 ID:F9CAzHJ+ func の返り値を変数 hoge に受けるときって auto hoge = func(); auto& hoge = func(); auto&& hoge = func(); のいずれにおいてもオブジェクトの再構築 (コピー) は行われないって思って良いんですよね? http://mevius.5ch.net/test/read.cgi/tech/1621389313/601
602: デフォルトの名無しさん [] 2021/06/30(水) 10:58:31 ID:x9tVpfG6 no http://mevius.5ch.net/test/read.cgi/tech/1621389313/602
603: デフォルトの名無しさん [sage] 2021/06/30(水) 11:13:43 ID:EDSlPJC8 >>601 c++17:値のコピー省略を保証、て奴かね。 戻り値が右辺値かどうかで変わるんじゃない? http://mevius.5ch.net/test/read.cgi/tech/1621389313/603
604: デフォルトの名無しさん [sage] 2021/06/30(水) 12:11:32 ID:2LaR0NZ5 関数の戻り値は必ず右辺値のはずだが。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/604
605: デフォルトの名無しさん [sage] 2021/06/30(水) 12:19:35 ID:8KWEqHlz んなこたーない http://mevius.5ch.net/test/read.cgi/tech/1621389313/605
606: デフォルトの名無しさん [sage] 2021/06/30(水) 12:29:48 ID:sL9lkuh+ 参照返し……と思ったけど、 参照て右辺値だっけ?左辺値だっけ? http://mevius.5ch.net/test/read.cgi/tech/1621389313/606
607: デフォルトの名無しさん [sage] 2021/06/30(水) 13:29:54 ID:2LaR0NZ5 関数の戻り値は、戻り値の型が左辺値参照で有る場合だけは左辺値で、 それ以外は右辺値らしい。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/607
608: デフォルトの名無しさん [sage] 2021/06/30(水) 13:34:03 ID:2LaR0NZ5 >>606 戻り値の型が右辺値参照の場合、関数呼び出しの結果は、xvalueだが、分類上は、右辺値でもあり、glvalueでもある。 戻り値の型が左辺値参照の場合、関数呼び出しの結果は、左辺値。 戻り値の型が参照型でない場合、関数呼び出しの結果は、prvalueで、右辺値。 prvalue = 純粋右辺値。 glvalue = 一般化左辺値。 xvalue = 消えかかっている値。謎の値とも言われる。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/608
609: デフォルトの名無しさん [sage] 2021/06/30(水) 13:39:20 ID:2LaR0NZ5 >>601 一番上の書き方だと、少なくとも move になる。 下の二つは、moveもcopyも行われないで、アドレスだけが参照型変数に 入るのだと思う。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/609
610: デフォルトの名無しさん [sage] 2021/06/30(水) 14:18:47 ID:DhAhW4Ik >>609 funcの戻り値型が左辺値参照の場合moveにはならんのでは? http://mevius.5ch.net/test/read.cgi/tech/1621389313/610
611: デフォルトの名無しさん [sage] 2021/06/30(水) 14:56:49 ID:2LaR0NZ5 >>610 その通りで、コピーコンストラクタが呼び出される気がする。 「少なくとも」と書いたのは、効率面で最低でも move が生じる という意味で書いたつもりだった。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/611
612: デフォルトの名無しさん [] 2021/07/03(土) 19:40:59 ID:Ju/axMXt くっそ素朴な疑問だけど 「operator>>」 って声に出して読むときどうしてる? 独学/個人開発なので他の人から聞く機会がない http://mevius.5ch.net/test/read.cgi/tech/1621389313/612
613: デフォルトの名無しさん [sage] 2021/07/03(土) 19:42:38 ID:dunp4iC4 右シフト記号? http://mevius.5ch.net/test/read.cgi/tech/1621389313/613
614: デフォルトの名無しさん [sage] 2021/07/03(土) 20:04:04 ID:ApVtA7Dx 入力オーバーライドとか? うーん・・・ダブルGT! http://mevius.5ch.net/test/read.cgi/tech/1621389313/614
615: デフォルトの名無しさん [sage] 2021/07/03(土) 20:04:56 ID:Y97o1UBK 個人的には「おぺれーたーだいなりだいなり」だな 他人には言ったことないけど http://mevius.5ch.net/test/read.cgi/tech/1621389313/615
616: デフォルトの名無しさん [] 2021/07/03(土) 20:18:12 ID:Ju/axMXt 自分のレス読んで気づいたけど他の人に声出し読むう機会も無いからどうでもいいな http://mevius.5ch.net/test/read.cgi/tech/1621389313/616
617: デフォルトの名無しさん [sage] 2021/07/03(土) 20:23:06 ID:A2f3M294 おぺれーたーぐれぐれ http://mevius.5ch.net/test/read.cgi/tech/1621389313/617
618: デフォルトの名無しさん [] 2021/07/03(土) 21:03:34 ID:WO4lFPcp オペレータ・イン <<は当然オペレータ・アウト http://mevius.5ch.net/test/read.cgi/tech/1621389313/618
619: デフォルトの名無しさん [] 2021/07/03(土) 21:05:23 ID:WO4lFPcp 朗読問題は根深くて、古くは漢文の読み下しからあり、 座右の書たるC言語を256倍使うための本にもちゃんと発音方法が載ってる http://mevius.5ch.net/test/read.cgi/tech/1621389313/619
620: デフォルトの名無しさん [sage] 2021/07/03(土) 21:29:09 ID:iUoBj2xP >> みぎみぎ << ひだりひだり http://mevius.5ch.net/test/read.cgi/tech/1621389313/620
621: デフォルトの名無しさん [sage] 2021/07/03(土) 21:41:24 ID:iArH0hMS >>603-611 ありがとうございます func の返り値が左辺値参照である場合を除けば、コピーは起こらないでFAですね で、func の返り値は左辺値参照でない限りは右辺値だとすると、auto& じゃ受けれないから auto&& で受けるべきということですね http://mevius.5ch.net/test/read.cgi/tech/1621389313/621
622: デフォルトの名無しさん [sage] 2021/07/03(土) 22:59:31 ID:5pcVeoYl オペレーター、クィっ、クィっ http://mevius.5ch.net/test/read.cgi/tech/1621389313/622
623: デフォルトの名無しさん [sage] 2021/07/04(日) 03:21:06 ID:WJcubPcO auto hoge = func() は場合によってはコピーが起きる という印象、 なぜなら戻り値をスタックのどこに積むかをfunc()の側で指定できないから hogeの実体ドンピシャにfunc()内で構築できる保証が無い コピーが省略され得るのは auto hoge = func(); bar(hoge); みたいな呼び出し元がhogeの用の一時的領域を次の関数呼び出しの引数としてやりくりできる場合だけなんじゃないの http://mevius.5ch.net/test/read.cgi/tech/1621389313/623
624: デフォルトの名無しさん [sage] 2021/07/04(日) 07:20:46 ID:kv3QS/1l ISO/IEC 14882に準じて おぺれーたーらいとしふと http://mevius.5ch.net/test/read.cgi/tech/1621389313/624
625: デフォルトの名無しさん [sage] 2021/07/04(日) 08:34:51 ID:mLloSLib >>623 ??? 最適化されて bar(func()) になるときだけオブジェクトの構築が省略されるって言いたいの? アホか全然レイヤの違う話だよ 右辺値左辺値の概念全く理解しとらんのか (何十年前のプログラマだ) 「印象」でものを語るな http://mevius.5ch.net/test/read.cgi/tech/1621389313/625
626: デフォルトの名無しさん [sage] 2021/07/04(日) 10:01:09 ID:mLloSLib それはそうと、こんなスレでも右辺値と左辺値よくわかってない (概念としてはわかっててもある場合のある値がどっちか判然としない) 人が多いのは、C++のムーブセマンティクスが洗練されてる証拠かもな つまり、プログラマの預かり知らぬところで自動でコピーとムーブが仕分けされているという http://mevius.5ch.net/test/read.cgi/tech/1621389313/626
627: デフォルトの名無しさん [sage] 2021/07/04(日) 10:11:22 ID:dMFRzHLQ >>623 https://wandbox.org/permlink/FOkFiS1EumCHBr0F そんなことないよな? と思いつつやってみた まあ、そんなことないよな ただ実験してて一個だけ気になったのが take_S(S()); ってやった場合、default→moveじゃなくて単にmoveとしか表示されなかった C++11/14でも-fno-elide-constructorsを付けない限りmoveだけ これってなんで? http://mevius.5ch.net/test/read.cgi/tech/1621389313/627
628: デフォルトの名無しさん [] 2021/07/04(日) 10:44:02 ID:pili1Lz/ >>619 万葉集は読み下しですらないからな http://mevius.5ch.net/test/read.cgi/tech/1621389313/628
629: デフォルトの名無しさん [sage] 2021/07/04(日) 11:45:10 ID:WJcubPcO >>627 解説キボティーヌ "copy"と表示されているわけだが http://mevius.5ch.net/test/read.cgi/tech/1621389313/629
630: デフォルトの名無しさん [sage] 2021/07/04(日) 11:56:43 ID:WJcubPcO つかそれを除けば>>623の通りなんじゃないの >take_S(S()); >ってやった場合、default→moveじゃなくて単にmoveとしか表示されなかった これは呼び出し元がS()の戻り値の実体をtake_S()の引数の実体と合一(スタック上の同一アドレス)にできた例 defaultコンが呼ばれなかったのはstruct Sがメンバを持たないから最適化でデフォルトコンストラが削除された例 通常の関数呼び出しでcoutする処理が削除されたらそればバグだが、 コンストラクタの呼び出し削減の最適化はコンストラクタ内で副作用のある処理を行っている可能性を 無視して行われることが規格のどっかで認められているはず…… http://mevius.5ch.net/test/read.cgi/tech/1621389313/630
631: デフォルトの名無しさん [sage] 2021/07/04(日) 12:12:47 ID:WJcubPcO >最適化されて bar(func()) になるときだけオブジェクトの構築が省略されるって言いたいの? 微妙にちげう func()がオブジェクトをコピー返しする関数である以上、その場合だけムーブにする余地があると言ってゐる 実際は auto hoge = func() bar(hoge) (この後hogeを使う人は居ない) と分けて書いたら"move"になりそうなケースなのに"copy"になったらしいが(>>627のリンク先 >アホか全然レイヤの違う話だよ ムーブにできるのは参照の付け替えとみなせるケースなので上の話(コピーをムーブと読み替え得る条件)が別レイヤの話とは認められない http://mevius.5ch.net/test/read.cgi/tech/1621389313/631
632: デフォルトの名無しさん [sage] 2021/07/04(日) 12:32:59 ID:dMFRzHLQ >>629 表示されたってことは省略されてないよね? http://mevius.5ch.net/test/read.cgi/tech/1621389313/632
633: デフォルトの名無しさん [sage] 2021/07/04(日) 12:34:44 ID:dMFRzHLQ 実験の部分を同時に話題にするべきではなかったな http://mevius.5ch.net/test/read.cgi/tech/1621389313/633
634: デフォルトの名無しさん [sage] 2021/07/04(日) 12:54:00 ID:WJcubPcO >>632 "move"にならずに"copy"になったのは謎だと>>631に書いてある とわいえ、>>623の主張を整理すると、 (1) func()が定義上オブジェクトをコピー返しする関数である場合、auto hoge = func() がムーブになるとは限らず、場合によってはコピーが起きる (2) ただし、bar(func()) というケースでは、func()の戻り値をbar()に渡す際に、コピーではなくムーブが選択される余地がある というものであって、bar(func())に類似のケース(>>627のリンク先)でムーブにならずコピーになったからといって>>623が否定されたことにはならない (∵ムーブが選択される「余地がある」と言っただけであってムーブにする義務があると言ったわけではない http://mevius.5ch.net/test/read.cgi/tech/1621389313/634
635: デフォルトの名無しさん [sage] 2021/07/04(日) 13:00:30 ID:WJcubPcO ここで「func()が定義上オブジェクトをコピー返しする関数である」のに何でコピーが削除されてムーブに成り得るのか? という疑問を抱く向きもあるかもしれないが、 これについては構造体やオブジェクトをコピー返しするような関数func()が実際には return valueの置き場所にデフォルト構築するだけのコードに落ちることがあるのを見たらワカル http://mevius.5ch.net/test/read.cgi/tech/1621389313/635
636: デフォルトの名無しさん [sage] 2021/07/04(日) 13:13:36 ID:dMFRzHLQ >>634 もしかして、コピーの代わりにムーブでオブジェクトが構築されることを「コピー省略」だと思ってる?だとしたら違うよ ていうか実験の部分は自己解決しました C++17で必須になったっていうだけで、それまでも(C++98ですらも)省略されることが許されるというのは明記されていたんですね http://mevius.5ch.net/test/read.cgi/tech/1621389313/636
637: デフォルトの名無しさん [sage] 2021/07/04(日) 13:25:14 ID:bouvqZmG 「コピー返し」ってなんぞ? http://mevius.5ch.net/test/read.cgi/tech/1621389313/637
638: デフォルトの名無しさん [sage] 2021/07/04(日) 13:29:00 ID:WJcubPcO >>636 >もしかして、コピーの代わりにムーブでオブジェクトが構築されることを「コピー省略」だと思ってる?だとしたら違うよ 別に 言っているのは 1. オブジェクトの構築はfunc()内のどこかしらで行われる 2. 1の方法によっては、func()がreturn valueをreturnする際のコピーは省略される(func()がそういうコードになる 3. func()がスタック上に返したreturn valueを呼び出し元が自動変数hogeのエリアにコピーする代わりにbar()の引数エリアにmoveする ことがある(>>601が言うように常にmoveになる、というわけではない と言う簡単な主張 http://mevius.5ch.net/test/read.cgi/tech/1621389313/638
639: デフォルトの名無しさん [sage] 2021/07/04(日) 13:49:07 ID:dMFRzHLQ >>638 じゃあ結局>>623のこの部分は間違いってことでいいの? > コピーが省略され得るのは > auto hoge = func(); > bar(hoge); > みたいな呼び出し元がhogeの用の一時的領域を次の関数呼び出しの引数としてやりくりできる場合だけなんじゃないの http://mevius.5ch.net/test/read.cgi/tech/1621389313/639
640: デフォルトの名無しさん [sage] 2021/07/04(日) 14:05:29 ID:bouvqZmG 意味ワカンネ 1. func が内部でオブジェクトを構築する話 2. func の返り値を変数 hoge に束縛する話 3. func の返り値を後で他の関数に渡す話 全部切り分けて考えろよとしか思えんのだが そして 2 について言えば>>621に尽きるだろとしか思えんのだが http://mevius.5ch.net/test/read.cgi/tech/1621389313/640
641: デフォルトの名無しさん [sage] 2021/07/04(日) 14:15:48 ID:WJcubPcO >>640 いやすまん2は確かに間違いでauto hoge = func()はhogeへのmoveで済む >>639 いやすまん「〜できる場合だけ」という限定は間違いやった ついでに言うとbar(func())でたまたまfunc()がスタック上に作ったreturn valueのアドレスも変えずにそのままbar()に渡せるとき moveが起きるという主張も間違いだったかも……(アドレスも変わらないのなら何の構築も不要 http://mevius.5ch.net/test/read.cgi/tech/1621389313/641
642: デフォルトの名無しさん [sage] 2021/07/04(日) 14:27:18 ID:bouvqZmG 何もかもおかしいよお前 「コピー返し」って結局なんやねん 独特の語法でわけのわからんことを主張するな 「印象」「かもしれない」で物事を主張するな 何がわかってて何がわかってないか知れ 質問と主張をごちゃまぜにするな 本格的に社会に居場所なくなるぞ 「全部取り下げます」とだけ言って去れ で一から勉強しろ http://mevius.5ch.net/test/read.cgi/tech/1621389313/642
643: デフォルトの名無しさん [] 2021/07/04(日) 14:32:24 ID:2p3tbjy0 RPGでアイテムを移動させた時に間違ってコピーされてアイテムが増殖する ムーブしないといけない アイテムは一個だけ http://mevius.5ch.net/test/read.cgi/tech/1621389313/643
644: デフォルトの名無しさん [sage] 2021/07/04(日) 14:37:46 ID:HHbHqtlq >>642 面倒見よくて草 昔はこの板にもアンタみたいな厳しい先輩いっぱい居たのにな 今はニワカと趣味グラマが何周送れかわからんポエム呟きあってるだけだし 昔からいる人らは完全スルーしてるはず http://mevius.5ch.net/test/read.cgi/tech/1621389313/644
645: デフォルトの名無しさん [sage] 2021/07/04(日) 14:52:36 ID:WJcubPcO >>642 Callerが(スタック上に)確保したメモリに対してcalleeが構造体を返すという返し方の意味 これについては統一した用語が無いようなのでむしろ知りたいっすね…… >>643 >>623のコードでSにムーブコンが定義されていなかったら増殖を意図しないケースでも コピコンが呼ばれるのだから>>643はたとえとしてはイマイチ http://mevius.5ch.net/test/read.cgi/tech/1621389313/645
646: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/07/04(日) 15:12:00 ID:7/Zaj2J4 >>645 要件を満たすとき (返却値が prvalue のとき) は変数の場所に直接にオブジェクトが構築される.。 コピーやムーブを省略できるというのはそういう意味で、 特に C++17 以降ではコピー省略が許されるときにはコピーコンストラクタもムーブコンストラクタも存在しなくてもいい。 https://wandbox.org/permlink/FOndP8P7Ecv5v5sB http://mevius.5ch.net/test/read.cgi/tech/1621389313/646
647: デフォルトの名無しさん [sage] 2021/07/04(日) 15:50:43 ID:WJcubPcO >>646のコードをVS2019でビルドしたら >error C2280: 'foo::foo(foo &&)': 削除された関数を参照しようとしています と言われるorz ていうか「prvalueならば必ず変数の場所に直接にオブジェクトが構築される」(例外なくそうなる)のだとしたら これはcallerがcalleeに構築すべき変数のアドレスを渡さねば実現できない芸当だけど ABIにそんな隠れた第n引数を設けることまでC++の規格で決めちゃって委員会、 とそこはかとなく疑問が…… (funcがメンバ変数だった場合、隠れた第1引数でthisを渡すことになっているのにこれにさらに追加? http://mevius.5ch.net/test/read.cgi/tech/1621389313/647
648: デフォルトの名無しさん [sage] 2021/07/04(日) 15:56:31 ID:xLbwwiyt いいからお前はRVOでぐぐって来い 話はそれからだ http://mevius.5ch.net/test/read.cgi/tech/1621389313/648
649: デフォルトの名無しさん [sage] 2021/07/04(日) 16:02:57 ID:WJcubPcO >>648 これか https://blog.kmc.gr.jp/entry/2014/12/20/231430 >まるでメンバ関数における暗黙のthisポインタのように、関数の引数に戻り値を格納する先の変数へのアドレスを渡します。 >そしてそのアドレスの先の上にオブジェクトを構築することで、関数内部での一時オブジェクト >生成を呼び出し元のオブジェクト生成とみなすことができます。 このようにしてRVOは実現されています。 >まるでメンバ関数における暗黙のthisポインタのように、関数の引数に戻り値を格納する先の変数へのアドレスを渡します。 mjk、 http://mevius.5ch.net/test/read.cgi/tech/1621389313/649
650: デフォルトの名無しさん [sage] 2021/07/04(日) 16:18:10 ID:2qJME2iB >>649 RVO は、最適化の一種なので、実現方法は色々。 とにかく、コンパイラが、関数の戻り値から左辺へのコピーやムーブを なるべく減らして、いきなりダイレクトに左辺に書き込むような方法を探し出して コード化する。 それをどやってやるかは、関数呼び出しの ABI 依存。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/650
651: デフォルトの名無しさん [sage] 2021/07/04(日) 16:52:18 ID:VOtERW9V >>647 エラーになるのは、VS2019のデフォルトがC++14だから。 プロジェクトのプロパティ→構成プロパティ→C/C++→言語 の 「C++言語標準」を「ISO C++17標準(/std:c++17)」に変更すれば通る。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/651
652: デフォルトの名無しさん [sage] 2021/07/04(日) 18:28:13 ID:WJcubPcO >>651 確かに「C++言語標準」を「ISO C++17標準(/std:c++17)」に変更したら通った >>651 >(RVOを)どやってやるかは、関数呼び出しの ABI 依存。 そういうものだと今の今まで思っていたが、 C++17で>>646のコード(コピコンもムーブコンも明示的に削除)がビルドが通るようになるということは、 第2の隠れた引数でcallerがcalleeに構築すべき変数のアドレスを渡すことが C++17では義務化されるとしか解釈できないのでは…… http://mevius.5ch.net/test/read.cgi/tech/1621389313/652
653: デフォルトの名無しさん [sage] 2021/07/04(日) 20:21:13 ID:WJcubPcO 第2の隠れた引数でcallerがcalleeに構築すべき変数のアドレスを渡しているのだとすると >>627のコードが"default"の次に"copy"になるのはある程度説明がつく 1. return_S()関数でS構築 --- ここでS:S()が呼ばれ、"default"表示 2. auto hoge = return_S()では何も起きない(∵1で&hogeにSが構築済み) 3. take_S(hoge)で呼び出しの引数としてhogeをコピー --- &hogeにあるSが、スタックの上の方に引数としてコピーされる結果"copy"表示 しかしhogeはその後使っていないのだから、コンパイラ的には3はmoveになる余地があるはず なお>>641までの漏れのレスは第2の隠れた引数は仮定せず、return_S()(callee)がスタックのトップに return valueとしてS()を構築して、 それが呼び出し元(caller)が&hogeにcopy(ムーブコンがあればmove)する穏当なモデルを考えていた 実際n3337.pdf(古いが)を読む限りRVOのやり方は全く規定されてないからアリのはず…… 何で>>642が怒り狂うのかわからん…… http://mevius.5ch.net/test/read.cgi/tech/1621389313/653
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 349 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.056s