[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/24 15:41 / Filesize : 321 KB / Number-of Response : 1024
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part137



1 名前:デフォルトの名無しさん [2018/08/27(月) 16:02:00.94 ID:vY3QDx2y0.net]
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137
https://mevius.5ch.net/test/read.cgi/tech/1531558382/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

751 名前:Aのゲームとか
ああいうのは今でもリソース必死に使い切ってるみたいよ
(Game Programming Gemsとか読んでみたらその片鱗が見える)
スーファミ時代のような変態的なのとは方向性が違ってきてるけど
大規模な開発の上でいかにパフォーマンス損なわずに開発効率を上げるかが重視されてる

もちろん2Dのスマホゲーだったら全然使い切る必要ないだろうけど、そっち方面は詳しくない
(多分言語もC#かSwiftが主流?移植性考えたらC#だろうな
[]
[ここ壊れてます]

752 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 00:00:26.48 ID:C9Mx85q+H.net]
へぇ〜〜〜面白い

「どの業界は超人多い」みたいのあるんだろうか

753 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 00:05:28.27 ID:bpDEi/Vx0.net]
個人的にはF-35のソースが読んでみたいw

754 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 06:17:40.32 ID:NMIb1H0N0.net]
>>737
さすがにF35のソースは見たことないけど、軍事関係や命に関わるコードはむしろ枯れた技術以外使わないんじゃないかな?
ECUとかはとんでもなく古い考え方(ほぼ全ての変数がグローバル)で作られてるし。
まぁECUの場合それはそれでちゃんと理由があるんだけどね。

755 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 06:26:38.28 ID:cr5GGQ8dr.net]
多次元配列クラス Tensor があるとして、そのインスタンス a は a[2][5][3] のように要素アクセスできるとします。

unique_ptr<Tensor> pa(new Tensor);
のように Tensor のスマートポインタを作った場合、pa の指してる Tensor への要素アクセスってどうやるのでしょうか。

「Tensor」の設計の詳細が必要であれば、boost の multi_array と同じとしていただいて問題ありません。

756 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 07:37:41.21 ID:ovBx3cXW0.net]
(*pa)[2][5][3]

757 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 08:18:12.28 ID:fJAN4SxzM.net]
>>732
自分は業務でC++使ってないのでそういう経験ができないのです‥
だからこそネットで活動してる人しか分からなくて‥

C++は全て独学するしかなくて、いい方法が無いかずっと考えてるのですが、結局ネットや本を見るしかなかったです

758 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 12:20:54.85 ID:h/rPVSH9r.net]
>>740
すみません……
いろんなところにアスタリスクつけたり矢印つけたりしてみたのですが、そのパターンは見落としてました……

759 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 12:31:36.38 ID:HAbRzuEs0.net]
>>742
見落とすというか……
予め正解を知っておかないと思い付くのは難しいかもしれない
そしてC++ではなくC言語的な原始的なポインタの話になるので、C++の教科書にそこまで詳しく載ってるかと言うと……

ttp://d.hatena.ne.jp/licheng/20130829/p2
ttp://www.nurs.or.jp/~sug/soft/tora/tora10.htm
ttp://tecmemo.wpblog.jp/2016/09/10/cpp-multidimensional_array/
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03010.html



760 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 13:46:02.72 ID:rTSM83rL0.net]
>>738
組み込み系のノウハウなんだろうけど、大規模な組み込みってなってくると
一体どんな英知が詰まってるのかなーとか気になって
数百万行とかじゃなかったっけ・・
まぁMISRA-C++嫁、で終わる話かもしれんけどw

>>741
自分も会社入る前とか、辞めて休業中は全部独学よ
C++の知識だけに留まらず、何か作りたいもの作ってれば、
その分野での知識が嫌でも

761 名前:ツいてくると思う
C++の知識だけに閉じこもって実際の開発(プロじゃなくて個人のフリーソフトでも)と
乖離した方向に行ってしまうのが一番怖い
[]
[ここ壊れてます]

762 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 13:48:52.76 ID:rTSM83rL0.net]
そういえば以前ここで似たようなこと言ったら
「愚者は経験に学び、賢者は歴史に学ぶ」とか言われたなw
ああいうアホになるんだよ、言語の知識だけに閉じこもって何も開発せずにいると

763 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 20:49:31.31 ID:ovBx3cXW0.net]
人は繰り返し、神は再帰する

764 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 21:21:29.13 ID:CZcrESgD0.net]
>>744
>MISRA-C++
そんなものがあるのですか?

765 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 21:28:11.49 ID:LXnmrKE+0.net]
>>747
ggrks

766 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 22:53:16.70 ID:uqsQEMjV0.net]
>>690
>(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
>全体のデザインが定まらない。
無いメソッドを呼べる言語は存在しないからこれは仕方が無い(ジャバに限らん
ジャバに限らずインターフェースには利用者が絶対呼ぶメソッドだけではなく、
呼ぶかもしれないメソッドも全部packing listに入れねばならない点が無駄が大きい

その代わり、インターフェースのメソッドはビルド単位内で一意な名前(インターフェース名)で
(直接的あるいは間接的に)修飾されるから、同じメソッド名で違う機能のやつがあっても
衝突せず、安全性が保たれる
テンプレートはこの点だけがちょっと劣る
これ以外にテンプレートに欠点など無i

767 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 00:16:16.58 ID:XAX5fYE80.net]
バイナリインターフェースが重要なシステムもあるわけで

768 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 13:25:47.21 ID:3bFkpdGnM.net]
C++とシェルスクリプトの違いって何ですか?
シェルスクリプトで出来ることでC++ができないこと
C++が出来てシェルスクリプトで出来ないこととかそういう具体例を教えてほしいです。

769 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 13:28:14.24 ID:3bFkpdGnM.net]
>>751
個人的に上げるとしたら、webのフロントエンド分野はインタプリタに勝てないと思います



770 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 13:35:28.26 ID:8zK/b6uE0.net]
比較の対象が違い杉

771 名前:さまよえる蟻人間 mailto:sage [2018/09/26(水) 13:35:54.34 ID:NuaJwewid.net]
>>751
C++はコンパイルしないと動かない。シェルスクリプトはファイルの操作やバッチ処理が得意。

772 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 14:01:36.87 ID:3yW6iUgn0.net]
>>751
デバドラをスクリプトで書いてみてくれ

773 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 14:29:30.26 ID:lYIfIhjTx.net]
>>751
桃白白とラウチェン、マジンガーZとテコンVぐらい違う。

774 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 14:43:50.80 ID:zEt8XtGI0.net]
>>751
GUI使ったアプリはシェルスクリプトでは無理

775 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 14:51:55.15 ID:3bFkpdGnM.net]
>>754
確かにファイルの操作はそうですね
>>755
確かにそういう分野はCですね
>>756
例えが古くてパッとしませんでした‥
>>757
確かにOSにインストールするものはそうですね

776 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 15:12:38.31 ID:nKPhFdqbH.net]
C++というかオブジェクト指向の質問かもしれないんですけど
エクセルにデータを書き出すためのクラスがありましてメソッドがざっとこんな感じ

・データをファイルから読み込む
・シート作成(ここで以下のメソッドを呼び出す)
・シートAに書き出す
・シートBに書き出す

・シートEに書き出す

全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
ただ正直あまり意味が無いような気もするんですよ。クラスと言うには小さすぎるものになりそうですし。
何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね

777 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 15:23:36.10 ID:dRFURWqC0.net]
それは単に

メソッド シート作成(){
シートAに書き出す
シートBに書き出す

シートEに書き出す
}

ということ?それとも

class A {
メソッド シート作成(){
シートAに書き出す
}

class B {
メソッド シート作成(){
シートBに書き出す
}

ということ?
前者ならクラス分ける意味がないと思うが。

778 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 15:33:15.98 ID:3yW6iUgn0.net]
>>757
Tcl/Tk の立場は?

779 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 19:56:11.35 ID:oECBSnBC0.net]
クラスは行数じゃなくて意味的にまとまってるかどうかだからな
意味のあるメンバがまとまってれば1万行の単一クラスがあってもいいし
デタラメに寄り集められた50行の粗大ゴミクラスもある
そういうもの



780 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 20:09:57.19 ID:LRnZd7JJa.net]
>>762
数字が逆じゃないか?

781 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 20:16:07.55 ID:ME0063O80.net]
>>759
>何行超えたらでかいだろとか何行なんてクラスとしては小さすぎるだろみたいなラインってありますかね
ないよ
機能で分けれ

>例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。
「書く内容を決める」機能が「シートに書く」機能を継承するなんてナンセンス
どのシートに書くかなんて「シートに書く」機能に引数で渡せばいいだけ

782 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 20:55:21.65 ID:oECBSnBC0.net]
>>763
あってるよ
50行でも粗大ゴミは作れちゃうんだよ

783 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:26:48.70 ID:zZL/tnLy0.net]
さすがに一万行でまとまってるクラスってのはないわ。。

784 名前:デフォルトの名無しさん [2018/09/27(木) 00:28:50.85 ID:pq96CSzd0.net]
もしかして知恵遅れは
なんか書くために毎度毎度ofstreamを継承すんの

もしかして知恵遅れは
なんか読むために毎度毎度ifstreamを継承すんの

さすが

785 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:36:33.47 ID:3iNJ0doV0.net]
例えば、基本クラスに出力クラスを作って、
派生クラスに、プリンター・PDF など、機能が異なるならオブジェクト指向だけど、

機能が同じなら、派生クラスではない。
単に、属性・メンバ変数が変わるだけ

786 名前:デフォルトの名無しさん [2018/09/27(木) 00:50:27.91 ID:pq96CSzd0.net]
void aho::write(ostream& aho) const {
aho << "aho" << endl;
aho << "baka" << endl;
aho << "manuke" << endl;
}

こんな感じで作っとけば
いろんなもんに書ける可能性がある

抽象化をうまく利用するというのは
こういうことだからな

787 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 05:39:28.23 ID:DR3ASZ+QH.net]
江添亮に匿名で質問ができて、高確率で答えが帰ってくる空間ってもうないのでしょうか

788 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 07:33:12.06 ID:zZL/tnLy0.net]
本人のtwitterにでも投げれば?
高確率で「質問ではない」が帰ってくるが。

789 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 07:58:37.31 ID:GSDkLsyd0.net]
>>751
シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
C++からならできる
つまりシェルスクリプトだけでは金輪際できない仕事というのは少なくとも1つある

もっともこの宇宙自体がシェルスクリプト上で走っているシミュレーションなら話は別やが…



790 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 08:51:58.83 ID:Ct84HJ0d0.net]
c++はコンパイラいるやろが

791 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:07:42.86 ID:eHS6051wM.net]
そんな規約あったっけ?
Cling とか CINT はパチモノ?

792 名前:デフォルトの名無しさん [2018/09/27(木) 13:29:28.75 ID:lX4OM9LG0.net]
>>769
そういうのは、templateのほうがいい。ostreamに依存せずにすむ。

793 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 16:27:38.79 ID:Zeo03I1R0.net]
766からの流れでそうなっただけだろ

794 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 16:47:26.94 ID:Oj9x/TA+0.net]
俺には誰一人として標準のstreamクラスを継承する話はしてなかったように思えてならないんだが
(最初の>>759も書き出す処理を継承で共通部分と個別部分に分ける案を問うているだけ)
なんでそういう話になってるんだっけ

795 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 20:48:20.83 ID:vb6QqVUs0.net]
>>777

>>759
>全体で1000行ほどなんですけど、例えばシートに書き出す共通部を親クラスにして、
>それを継承した各シート毎に書き出すクラスを作るみたいなこと考えてます。

書き出す共通部をまとめたクラスというのは
ファイルで言えば ofstream みたいなものなのであろうと皆疑ってるんだろう。
「みたいなものではない」という、結論が違ってくるような違いも提示されないし。

796 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 20:54:25.22 ID:/ZxE29S10.net]
関数にすると不味いことある?

797 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 21:00:15.42 ID:Oj9x/TA+0.net]
>>778
そうなのか……ありがとう
俺はostreamを引数に取る関数オブジェクトを多態やprotectedを使って実装するみたいなイメージで読んでた

798 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 21:09:44.86 ID:/ZxE29S10.net]
最初にクラスを設計し始めるのは筋が悪いと思ってる。そんな3流プログラマ。

799 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 23:22:58.17 ID:GSDkLsyd0.net]
訂正;
△:シェルスクリプトだけではシェルスクリプトを解釈実行することはできない
○:シェルスクリプトがあるだけではシェルスクリプトの解釈実行を開始することはできない

シェルスクリプトはもちろんシェルスクリプトから呼ばれるシステムコールその他の
一切合財をシェルスクリプト上だけでシミュレートする能力がある(と思う)が
全ての始まりを起こすのにC/C++で書かれたOSを要する

>>781
つまりクラスの設計はおくらすのが正しい



800 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 23:59:38.23 ID:RQl7S0Gm0.net]
来たよ、暇なので

801 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 09:32:22.81 ID:hWUH9Sli0.net]
最新のC++コンパイラが使えないので質問。
右辺値参照が仮引数になっている以下のような関数があった場合、

aaa(左辺値の変数);

とすると、ちゃんと、aaa() は呼び出される?
それともエラーになる?

void aaa(T&& a)
{
  ・・・
}


802 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 09:39:47.21 ID:UtPWkOJga.net]
>>1のオンラインコンパイラを使おう

803 名前:はちみつ餃子 mailto:sage [2018/09/28(金) 09:40:07.87 ID:7KXXqv1B0.net]
>>784
呼び出される。
lvalue は rvalue にもなる。

804 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 09:48:18.84 ID:hWUH9Sli0.net]
>>785
どこにあるの?

805 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 09:53:42.38 ID:hWUH9Sli0.net]
では、aaa()に次のようなoverloadがある場合は、「2」の方が呼び出されて、
#if の部分を 0 にすると、「1」が呼び出される?
だとすると、昔のC++では無かったような overloadの仕様かも?

T b;
aaa(b); // bは左辺値のつもり

void aaa(T&& a)
{
  puts("1, 右辺値参照、T&& に来たよ。");
}

#if 1
void aaa(T& a)
{
  puts("2, 左辺値参照、T& に来たよ。");
}
#endif


806 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:13:48.61 ID:WRA8TBfa0.net]
>>788
>>785

807 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:23:34.25 ID:RVKB6eOl0.net]
>>784
呼び出されない
右辺値参照は左辺値を受け取らない(原則)

ただしTがテンプレート仮引数の場合と、auto&&の場合は、
右辺値参照で左辺値を受け取れる(特例)

型を推定させた場合に限り、右辺値参照は、
左辺値参照への左辺値参照に変形できる

808 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:32:29.28 ID:hWUH9Sli0.net]
[Compile and Execute C++11 Online (GNU GCC v7.1.1)]
https://www.tutorialspoint.com/compile_cpp11_online.php
で下の方のコードを試したら、

$g++ -std=c++11 -o main *.cpp
main.cpp: In function ‘int main()’:
main.cpp:18:10: error: cannot bind rvalue reference of type ‘TPerson&&’ to lvalue of type ‘TPerson’
   aaa(b); // bは左辺値のつもり
     ^
main.cpp:8:6: note:  initializing argument 1 of ‘void aaa(TPerson&&)’
void aaa(TPerson && a)
   ^~~

というエラーになった。gcc 7.1.1 では、>>786 の言ってくれたことと合ってない???


809 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:33:03.33 ID:hWUH9Sli0.net]
>>791
[続き]

#include <stdio.h>

struct TPerson {
 int m_age;
};

void aaa(TPerson && a)
{
  puts("1, 右辺値参照、T&& に来たよ。");
}

int main()
{
  printf("Hello, World!\n");
  
  TPerson b;
  aaa(b); // bは左辺値のつもり

  return 0;
}




810 名前:はちみつ餃子 mailto:sage [2018/09/28(金) 10:35:31.98 ID:7KXXqv1B0.net]
あれ? ごめん。
確かめたら呼び出されなかった。

勘違いしてたかも

811 名前:はちみつ餃子 mailto:sage [2018/09/28(金) 10:39:58.90 ID:7KXXqv1B0.net]
あ、逆の場合と混同してた。
const T& に rvalue がマッチするんだった。

このあたりのルール、なんか一貫性がない感じがする。

812 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:40:42.82 ID:hWUH9Sli0.net]
>>793
でも、以下の std::move() の実装の説明だとあなたの言ってる方が正しい気がする。

https://stackoverflow.com/questions/36206764/understanding-the-code-for-stdmove
www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics

The move function really does very little work. All move does is accept
either an lvalue or rvalue argument, and return it as an rvalue
without triggering a copy construction:

template <class T>
typename remove_reference<T>::type &&move(T &&a)
{
  return a;
}
It is now up to client code to overload key functions on whether
their argument is an lvalue or rvalue (e.g. copy constructor and
assignment operator). When the argument is an lvalue,
the argument must be copied from.
When it is an rvalue, it can safely be moved from.


813 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:44:16.75 ID:hWUH9Sli0.net]
>>790
なるほど、std::move() は、あなたの言ってくれた、template の場合に当たるから
こその動作だったんだ・・・。

814 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:49:49.55 ID:hWUH9Sli0.net]
>>794
template の場合と、auto の場合は、まさに、一貫性が無いということらしい。

こういう一貫性の無さのことを「直交性が低い」と言って、言語が分かりにくい
指標になるらしい。

815 名前:はちみつ餃子 mailto:sage [2018/09/28(金) 11:07:41.28 ID:7KXXqv1B0.net]
>>797
一貫性は無いけど、仮引数の rvalue reference に lvalue がマッチ「してほしくない」というのはわかるので、
まあしょうがない。

816 名前:はちみつ餃子 mailto:sage [2018/09/28(金) 11:11:50.31 ID:7KXXqv1B0.net]
>>790
ちょっと確認なんだけど、
テンプレート仮引数 T に対して T&& に lvalue がマッチするっていうのは、
実際には lvalue reference として機能するという意味でいいんよね?
(変形できるというのはそういう意味だよね?)

817 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 11:58:59.36 ID:RVKB6eOl0.net]
>>799
それ以外の何だと思うの?

818 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 12:26:11.67 ID:hWUH9Sli0.net]
>>798
あまのじゃく?

819 名前:はちみつ餃子 mailto:sage [2018/09/28(金) 12:29:12.61 ID:7KXXqv1B0.net]
>>800
「変形される」だったら勝手にやってくれるんだなーと思うんだけど、
「変形できる」という言い回しにちょっと引っかかりを感じたというふんわりした疑問なので、
具体的に別の可能性を思い浮かべたわけではないです。



820 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 14:07:40.60 ID:7VsD45M6M.net]
江添とお前らどっちがC++に詳しい

821 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 14:45:05.48 ID:hWUH9Sli0.net]
>>803
その人もここに来るかも知れないから。

822 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 14:53:59.72 ID:5bmo24w9p.net]
江添で言えばまさにわかりやすくその辺の事情解説してくれてるだろ
今の話で江添より詳しいとかありえねー

823 名前:はちみつ餃子 mailto:sage [2018/09/28(金) 17:00:34.02 ID:7KXXqv1B0.net]
>>803
江添氏は C++ を使うプログラマというよりは、
C++ の規格の専門家として C++ の知識を持ってるんだから、
かなり詳しいよ。

824 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 17:18:49.52 ID:hWUH9Sli0.net]
>>806
いずれにせよ、気持ちはうれしかったよ。

825 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 17:49:54.67 ID:7VsD45M6M.net]
>>805
そのへんの事情って?
>>806
それは本人も自負してるようだけど

826 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 18:34:51.41 ID:2UofBC6a0.net]
>>790, >>794あたりの仕様の事情な

827 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 21:21:09.15 ID:tCflGkAm0.net]
もし非テンプレート関数かつ非インライン関数なvoid bar(Foo&& a)に左辺値xを渡してビルドが通る言語規格だとしたら、
 tmp = xのコピー
 barのビルド結果←(tmpのアドレス)
ということになってxのコピコンが呼ばれてしまうま
つまり右辺値参照がコピコン削減になるかどうかというのは関数を右辺値参照にしただけでは決まらず、
呼び出し元の条件次第なので、bar()を作る人/使う人双方の慢心を避けるためにエラーにするんだろJK

一方テンプレート関数またはインライン展開される関数なら、上のようなへタレコードに一時的になっても
すぐさまコピコン削減ができるから実質弊害が無い
ただし、そういった関数でも再帰呼び出ししたりアドレスをとったりすると上と同じ議論になるので、
再帰呼び出し/アドレスを取る操作 両方ともありえるインライン関数は>>790の例外の適用外とされ、
テンプレート関数は再帰呼び出しが有り得ないし、アドレスを取る奇特な人間も居ないだろうということで>>790の例外が設けられた

828 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 21:24:43.89 ID:tCflGkAm0.net]
訂正;
△: すぐさまコピコン削減ができる
○: コンパイラがすぐさまコピコン呼び出し削減最適化をかけられる

コピコン呼び出し削減最適化はこの場合データフロー解析の結果を流用したらできる
C++はgotoが使われたとき、コンストラクタが呼ばれずに使われるオブジェクトが生じないか否か確かめるために
データフロー解析はもともと必須なので、コピコン呼び出し削減最適化はC++コンパイラ書きなら誰でも出来る(多分

829 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 21:34:28.86 ID:tCflGkAm0.net]
>>794
>const T& に rvalue がマッチするんだった。
それはある意味当然すぐる
const T& x = r; // rは右辺値
...
y = x // (*)
としたときに、コンパイラは(*)みたいな文が現れるまでは、
xへのアクセスを機械的にrへのアクセスに置き換えれば良いわけでゼロコスト
rが所有権を失ったらxのアクセスも不正となるが、これは書き換え可能なオブジェクトを
const参照をとってから書き換えた場合も似たようなもの(身からでたサビ
なのでコンパイラはやっぱ何もしなくて良い



830 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 21:36:22.95 ID:tCflGkAm0.net]
(30分前にこのスレを読んで初めて右辺値とか右辺値参照といったブツを知った初心者なので語ってみた

831 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 22:13:49.14 ID:pgnHcfqPM.net]
>>812
y = x
の後もxへのアクセスはrへのアクセスで良くないの?

832 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 22:40:22.15 ID:5I7m9/jNd.net]
どんな文が現れようとずっとrでいいんじゃね?

833 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 22:45:46.54 ID:tCflGkAm0.net]
>>814 >>815
ホンマや!(;゚Д゚)天才か!

834 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 22:50:40.02 ID:pgnHcfqPM.net]
>>816
ウッサイ、チネ

835 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 23:48:18.05 ID:AAs3crMS0.net]
>>810
再帰だろうがアドレスとろうがオンラインだろうが例外は適用されるだろ。
やっぱ30分で理解するのは無理じゃね?

836 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 23:50:49.06 ID:HzE5xAmYr.net]
auto a = funcA(funcB(funcC(input)));
みたいな感じの関数の入れ子ってさ、ある関数が終わる度にその都度インスタンスを作ってコピーして次の関数に渡すということを繰り返すんだよね?

つまり、関数たちの返り値が巨大なオブジェクトだったら、このように書くことで余計に時間がかかるよね?

837 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 00:09:10.14 ID:UwfF5QN40.net]
>>819
いんや。
オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし、戻り値最適化で一切何も起こらない可能性すらある。


て、はちみつが言ってた。

838 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 00:13: ]
[ここ壊れてます]

839 名前:53.80 ID:X+ykKtqpr.net mailto: >>820
へぇ

> 一切何も起こらない
というのは、一切余計なオーバーヘッドがない、ということですか?
[]
[ここ壊れてます]



840 名前:デフォルトの名無しさん [2018/09/29(土) 00:22:35.94 ID:4+9Po3M4a.net]
単純なコピーよりは早くなる可能性があるってだけでは?

841 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 00:30:08.48 ID:UwfF5QN40.net]
ちょっと誇張しすぎた。
正しくは「コピーもムーブも起らない可能性すらある」

コピーもムーブも起こらなければ、その分のオーバーヘッドは当然ないよ

842 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 00:36:40.21 ID:X+ykKtqpr.net]
へぇ〜〜〜
ありがとうございます

まぁそこがボトルネックじゃない限り余計なこと考えない方が身のためなのかもしれませんが

843 名前:はちみつ餃子 mailto:sage [2018/09/29(土) 02:25:18.76 ID:4F2hgYyq0.net]
>>819-824
コピーもムーブも省略される可能性ってのは、左辺の場所でオブジェクトを直接に構築するっていう意味。
構築してからそのままコピーしてる (そして元のオブジェクトが一時的である) 場合は実際には直接構築したって同じよねという話。

844 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 14:26:47.44 ID:7XGFV27+0.net]
>>820
>オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし
なんかムーブコンストラクタを魔法か何かと勘違いしてないか?
ムーブコンストラクタの方が重い処理してたら当然重くなるんだぞ

845 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 14:32:22.06 ID:OnnXxjQtM.net]
>>826
ええ…
コピーより重いムーブコンストラクタの存在を前提に話す必要ある?

846 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 14:44:27.90 ID:7XGFV27+0.net]
むしろムーブで軽くなるのは大抵の場合ムーブによってヒープの確保、解放を
避けられるクラスだけ、だろ
ある意味そっちの方が限定して話をしてると思うが

基本をすっ飛ばすからはちみつその他誤解するやつが出てくる

847 名前:デフォルトの名無しさん [2018/09/29(土) 14:49:31.13 ID:IuTgmxg/0.net]
この機能が必要になった背景・経緯

ムーブセマンティクスは、C++03でもNRVO(特定の文脈でのコンストラクタの省略)や、 C++11で非推奨となったstd::auto_ptrで実現されていた。
しかし、NRVOがいつでも機能するわけではなかった。
また、std::auto_ptrにはコピーと同じ文法でムーブしていることなど、問題が多かった。
そのため、コピーと区別でき、統一的にムーブを表す文法が言語機能として必要とされた。


つまりこんなあぶなっかしい
unique_ptr、shared_ptr、weak_ptrとか使ってるヤツラも
クルクルパーしかいない

この程度の簡単な制御も自分で簡単に制御しきれないワケだからな

848 名前:デフォルトの名無しさん [2018/09/29(土) 14:56:25.79 ID:IuTgmxg/0.net]
しかしアホのあたらしもの好きは半端ない
頭悪いシロモノでも新しいものができたら使わないといけない病になってるからな
シロウトに多い

849 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 14:58:40.21 ID:7XGFV27+0.net]
いや、autoはともかくshared, unique, weakは危なっかしくないと思うが・・
ムーブが使えるようになってからだし
あと個人的にはcpprefjpは規格寄り過ぎてユーザー寄りじゃないと思う
cppreference.comを使うべき



850 名前:デフォルトの名無しさん [2018/09/29(土) 14:59:08.11 ID:IuTgmxg/0.net]
で、こんなしょうもないことより
ホントに理解しないといけない部分がすっぽりと抜けてる

851 名前:はちみつ餃子 mailto:sage [2018/09/29(土) 16:42:03.70 ID:4F2hgYyq0.net]
C++ の (というかプログラミング言語の) ほとんどの機能は抽象化の道具。
ムーブもまた、見かけ上は代入っぽい抽象で扱えるものであっても
実態はもうちょっと速いコードにも出来る (可能性がある)。

>>829
そういう簡単な制御すら抽象化層に押し込められない方がよっぽど駄目。
クルクルパーだと思ってるならなおさら、
簡単な制御なら (いつも間違いなく) 出来ると期待すべきでない。
そんでもって大抵の人間はクソザコで、しょうもない間違いをする。
問題は道具で解決すべき。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<321KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef