トップページ⇒tech
1002コメント346KB

C++相談室 part124 [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 7fc9-G+K4)2016/04/03(日) 00:22:24.07ID:ZT/2NYWz0
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part123
http://echo.2ch.net/test/read.cgi/tech/1456040187/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.97【環境依存OK】
http://peace.2ch.net/test/read.cgi/tech/1439849418/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0159デフォルトの名無しさん (ワッチョイ db38-TaqW)2016/04/19(火) 10:58:38.53ID:FK9rMfbT0
>>158
喧嘩したけりゃ他行きな小僧
0160デフォルトの名無しさん (ワッチョイ 3742-Jz3o)2016/04/19(火) 11:04:51.69ID:pETlWi8B0
ID:nL6Ii7Gq0 は いらない子!
0161デフォルトの名無しさん (ワッチョイ 277b-GRux)2016/04/19(火) 11:13:16.48ID:nL6Ii7Gq0
俺は喧嘩売ってるつもりはないし、>>155という度し難いバカに親切にも「バーカ」って言ってあげただけだよ
俺に喧嘩売ってるのがFK9rMfbT0、pETlWi8B0
本当に役に立たないゴミだな
0162デフォルトの名無しさん (ワッチョイ db38-TaqW)2016/04/19(火) 11:15:39.94ID:FK9rMfbT0
>>161
喧嘩したけりゃ他行きな小僧
0163デフォルトの名無しさん (ワッチョイ 0b7b-8wQM)2016/04/19(火) 11:22:46.44ID:qXd1Jas40
荒らしに構うなって前世紀から言われてるだろ
0164tasuketekesuta (ワッチョイ d3d5-j49k)2016/04/19(火) 21:50:00.65ID:spYNmTFF0
DataSet/DataAdapterの仕様についてご教授下さい。


■DataSet/DataAdapterの仕様
DataAdapter には、SELECT、UPDATE、INSERT、DELETEのSQL文が設定できます。
Fillメソッドを実行するとSELECTのSQL文の基づいてDataSetにデータを読み込みます。このときDataSetの各行には「編集なし」のマークがついています。
値を更新するとそのマークが「更新済」、削除すると「削除済」、データを追加すると「追加済」のマークに変わります。
Updateメソッドを実行すると、DataSetの各行のマークに応じて、設定してあるUPDATE、INSERT、DELETEのSQL文を実行します。
0165tasuketekesuta (ワッチョイ d3d5-j49k)2016/04/19(火) 21:51:02.12ID:spYNmTFF0
>>164 の続き

■実施したい事【概要】
DataAdapterのFillメソッドで取得したDataSet内のDataTableに対して、
挿入/更新操作をかけていき、全ての処理が終わったら、UPDATEを行う。

その際、DataTableに挿入した順番でDBへの挿入SQLが流れてほしい。
0166tasuketekesuta (ワッチョイ d3d5-j49k)2016/04/19(火) 21:51:29.36ID:spYNmTFF0
■実施したい事【詳細】

DataTable^ tbl;//←DataAdapterのFillメソッドで取得したDataSet内のDataTableだとします

while(10000行程度ループ){

DataRow^ tg_row = tbl->Rows->Find(ループ毎に変わる値);

if( static_cast<DataRow^>(tg_row)==nullptr){
DataRow^ row = tbl->NewRow();
row["hogehoge"] = ループ毎に変わる値;
tbl->Rows->Add(row);//←★★★★★★初期挿入★★★★★★★
}
else{
row["hogehoge"] = ループ毎に変わる値;
}

}

上記のソースで5000行のレコードが出来たと仮定します。
※つまり"ループ毎に変わる値"の重複が半分あったということ

この状態でUPDATEを行うと、
なぜか、初期挿入した順番通りにinsert文が発行されません。
※DB上で見ると順番がごちゃまぜです
0167デフォルトの名無しさん (ワッチョイ d3d5-j49k)2016/04/19(火) 21:52:10.39ID:spYNmTFF0
>>164 の続き

■質問�@
なぜ、初期挿入した順番通りにinsert文が発行されないのでしょうか?
tbl->Rows->Findで取得したレコードの値を変更すると順番が変更になってしまうのでしょうか?

■質問�A
初期挿入した順番にinsert文が発行されようにするには、
どの様にしたら良いでしょうか?
解決策をご教授下さい。
0168デフォルトの名無しさん (ワッチョイ b763-Gtsw)2016/04/19(火) 21:59:51.04ID:4s2SrkGy0
ID:spYNmTFF0
荒らしは去れ
0169デフォルトの名無しさん (アークセー Sx27-bDYe)2016/04/20(水) 03:23:29.57ID:y2Y1qnWRx
>>167
データベースに依存した問題
てか、SQLのほうの話題だろ
0170デフォルトの名無しさん (ワッチョイ cf13-kHia)2016/04/20(水) 05:58:33.09ID:Ysvgw+BH0
>>167
そもそも、挿入順とDB上での順番が一致することは保証されていない。
http://q.hatena.ne.jp/1153407134
0171デフォルトの名無しさん (アウアウ Sa67-33s9)2016/04/20(水) 07:18:51.45ID:dTPS4iPYa
そもそも格納順番とかそっちに任せるから、とにかく最新情報科学技術の粋を結集して高速にデータを参照させてくれってのがデータベースでしょ
0172デフォルトの名無しさん (オッペケ Sr27-Gtsw)2016/04/20(水) 07:58:13.83ID:thevk6F2r
いいえ違います
0173デフォルトの名無しさん (オッペケ Sr27-Gtsw)2016/04/20(水) 08:01:43.93ID:thevk6F2r
クエリーでなくリーレション(アトリビュートのドメインの直積)にはそもそも概念モデルとして順序の概念が無いし
0174デフォルトの名無しさん (ワンミングク MMef-Gtsw)2016/04/20(水) 09:22:54.95ID:8iJwmy9eM
まぁデータベースは表ではなくて集合を表現したものだからな
0175デフォルトの名無しさん (ワッチョイ 4b40-u1fT)2016/04/20(水) 23:06:05.59ID:sW5MEHFW0
不慣れなプログラマが作る全ソースが全ヘッダを読み込むので困る。ちょっと弄ると全ビルド
0176デフォルトの名無しさん (ワッチョイ 0b7b-y51b)2016/04/20(水) 23:42:45.99ID:ZQBKVnsi0
すぐテンプレ使いたがる馬鹿のコードなんてそんなもんよ。
0177デフォルトの名無しさん (ワッチョイ 19e3-zfCm)2016/04/21(木) 22:25:29.05ID:3sH/HRos0
翻訳環境にとんでもない化け物がお手頃で使えるようになった今、
理想的には、実行イメージ全体が1つの翻訳単位に収まっていることだね
翻訳単位の境界をまたげない最適化が結構もったいないことになってるから
0178デフォルトの名無しさん (ワッチョイ 4db4-z8Ax)2016/04/22(金) 16:20:21.52ID:VK3N1B+b0
つまり cc と ld を一つのコンパイル単位にまとめてコンパイルすれば Linux カーネルが3秒でビルドできる爆速コンパイラに
0179デフォルトの名無しさん (ワッチョイ 3e16-zfCm)2016/04/22(金) 16:27:16.85ID:trDHzPiw0
いやコンパイラが爆速かどうかではなくバイナリを爆速にするって話
最適化をがっつりやるならその分の時間はかかるだろうし
0180デフォルトの名無しさん (ワントンキン MMd0-3Kaz)2016/04/22(金) 17:55:39.19ID:bwUeH041M
テンプレート書くよりその都度コピペした方が色々はやいよねコンパイル時間とか
0181デフォルトの名無しさん (JP 0H41-SZE8)2016/04/22(金) 19:18:24.79ID:cAq2nbH2H
そして地震がきた時にクソコードの山に押し潰されるのを待つのだ
0182デフォルトの名無しさん (ワッチョイ 4b02-gALo)2016/04/22(金) 19:35:18.98ID:LlaEs4+z0
テンプレートはコンテナ以外で明確に使った方が良いケースはどんなのがある?
0183デフォルトの名無しさん (ワッチョイ 4b3c-FmnC)2016/04/22(金) 19:47:23.35ID:x1AcDznE0
アルゴリズムとか
0184デフォルトの名無しさん (アウアウ Sa05-1g4J)2016/04/22(金) 21:06:06.11ID:7+eL8tO2a
保守性のために標準ライブラリを使うんだろ
コーディング速度や実行速度の為ではない
0185デフォルトの名無しさん (ワンミングク MMd0-3Kaz)2016/04/22(金) 21:27:17.03ID:+uE+J+gQM
標準ライブラリを使う使わないの話はお前以外してない
0186デフォルトの名無しさん (ワッチョイ 217b-xSxp)2016/04/23(土) 02:40:57.38ID:m/KBeaUS0
>>182
信号処理とかだとテンプレートなしではもう無理
論理的に同じ処理をするのに、整数、float、doubleで別々のコードを書かなきゃいけないなんて
やってられない
0187デフォルトの名無しさん (ワッチョイ f1e1-gALo)2016/04/23(土) 08:43:35.78ID:F/8DDl4q0
>>182
テンプレート引数にテンプレートを指定する手法が必要な時。
0188デフォルトの名無しさん (ワッチョイ 6be7-FmnC)2016/04/23(土) 08:46:03.16ID:bKfgUY2x0
ファクトリーメソッドとかかなぁ。
0189デフォルトの名無しさん (ワッチョイ 4db4-z8Ax)2016/04/23(土) 14:18:29.26ID:nvSaEwLX0
>>186 はまさに >>183 の例だな
型の振る舞いだけに着目して抽象的な操作を記述できるようにする
だから静的型付けの言語でテンプレートやらジェネリクスやらをまともに使うには型制約が必須なんだけど、
未だに型制約を記述するための支援がない言語があるらしい
0190デフォルトの名無しさん (ワッチョイ 57e6-zfCm)2016/04/23(土) 19:16:14.77ID:tcao+QTV0
>>186でFA
0191デフォルトの名無しさん (ワッチョイ 1030-gALo)2016/04/23(土) 20:18:32.35ID:hfDo0ds00
例をあげようって話の流れで、なんで一例に対してファイナルになるんだよ
0192デフォルトの名無しさん (ワッチョイ 57e6-zfCm)2016/04/23(土) 21:02:12.70ID:tcao+QTV0
> 整数、float、doubleで別々のコードを書かなきゃいけないなんて
やってられない

じゃあ、これ以上の答えがあるってのか?
0193デフォルトの名無しさん (ワッチョイ 1ec0-v6Xr)2016/04/23(土) 21:36:34.80ID:zzpDuGYL0
1st アンサーかも
0194デフォルトの名無しさん (ワッチョイ 1030-gALo)2016/04/23(土) 23:38:40.69ID:hfDo0ds00
>>192
それはテンプレートの基本機能じゃね?
0195デフォルトの名無しさん (ワッチョイ 5cec-zfCm)2016/04/24(日) 06:26:37.85ID:936uZ4pr0
あとは重箱の隅みたいな細かいことばかりだと思うが?
0196デフォルトの名無しさん (ワッチョイ 1030-gALo)2016/04/24(日) 09:20:15.79ID:bi4aOyNo0
いやだから、例をあげろっていう話の流れだったんじゃ
0197デフォルトの名無しさん (ワッチョイ 6be7-FmnC)2016/04/24(日) 09:37:21.56ID:qrH7Oshx0
唯一解が出ちゃってぽしゃったんだよ。
0198デフォルトの名無しさん (スプー Sdf8-DbIH)2016/04/24(日) 09:53:33.85ID:PJXOgY3Xd
>>195
非型は?
0199デフォルトの名無しさん (アウアウ Sa05-L+iy)2016/04/24(日) 14:18:35.81ID:nyww5Nv/a
コンパイル時に計算したい場合か
0200デフォルトの名無しさん (オッペケ Sr8d-DbIH)2016/04/24(日) 22:23:36.21ID:tmf17AXnr
オナニー以外に使い道は無い
0201デフォルトの名無しさん (ワッチョイ 4b02-gALo)2016/04/24(日) 22:35:15.43ID:C4if0ujR0
オーバーロードで事足りる程度でもテンプレートなら行数を圧縮することはできる
0202デフォルトの名無しさん (ワッチョイ f140-FmnC)2016/04/25(月) 02:07:03.74ID:4nVWf6Tg0
行数を圧縮すると成果物が少ないと評価される…
0203デフォルトの名無しさん (アウアウ Sa05-1g4J)2016/04/25(月) 08:14:09.84ID:4toUZyy7a
糞査定なんとかしないと
0204デフォルトの名無しさん (スプー Sdf8-DbIH)2016/04/25(月) 08:48:18.03ID:RM4kY/BSd
C++11になってVariadicと右辺値/左辺値が登場したので、型のバリエーションだけじゃなくてもっといろんな
パターンについてのバリエーションをtemplateで表現できるようになった。
俺はヘタレなのでかなり難しくなったと感じている。
0205デフォルトの名無しさん (ワッチョイ 5c42-zfCm)2016/04/25(月) 13:43:44.73ID:d+bG+pO00
>>201
無数にあっちゃいけない関数はオーバーロード一択でそ
0206デフォルトの名無しさん (JP 0H41-uQxx)2016/04/25(月) 14:15:42.28ID:FkG7uZgrH
質問失礼します。

'abc.exe': 'C:\Visual Studio 2008\Projects\xyz.dll' を読み込みました。Cannot find or open the PDB file
'abc.exe': 'C:\Visual Studio 2008\Projects\xyz.dll' をアンロード

このアンロードはどうやって止めるのでしょうか?

実行した際に、dll内のメソッドを参照できないようで、以下のエラーとなります。
ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセン
ブリ 'hoge.dll'、またはその依存関係の 1 つが読み込めませんでした。
指定されたモジュールが見つかりません。
場所 hoge.hogeclass..ctor()
場所 main(Int32 argc, SByte** argv)
場所 _mainCRTStartup()
コンパイルはできています。

よろしくお願いします。

(なんか急にできなくなった気がします。前は、問題無だったはずなのになぁ)
0207片山博文MZ ◆T6xkBnTXz7B0 (ガラプー KK9b-0LZu)2016/04/25(月) 14:21:48.07ID:9Ydy9LbhK
>>206
ファイル'hoge.dll'が見付からないからエラーになってる。'hoge.dll'はどこにある?
0208デフォルトの名無しさん (JP 0H41-uQxx)2016/04/25(月) 16:01:11.85ID:FkG7uZgrH
回答ありがとうございます。

exeと、同じフォルダにあります。
読み込みました」って、出てるから、いったん読み込みはできてると思うのですが。

Cannot find or open the PDB file
(このPDBについてのメッセージは、関係ないと思います)

よろしくおねがいします。
0209デフォルトの名無しさん (ワッチョイ 98ff-nTsV)2016/04/25(月) 16:14:18.30ID:Y5eHwd9i0
C++/CLIのほうで聞いたほうがいいかも
そのパスはほんとにそのまま?日本語混ざってたりしないよね
0210デフォルトの名無しさん (ワントンキン MMd0-DbIH)2016/04/25(月) 16:17:09.73ID:nodCWmX5M
pdbも同じとこにおきゃいいじゃん
0211デフォルトの名無しさん (JP 0H41-uQxx)2016/04/25(月) 16:33:35.80ID:FkG7uZgrH
回答ありがとうございます。

>209
日本語は、入っていません。

>210
拾ってきたdllでして、pdbがありません。

他にも、以下のような、謎のメッセージも出ています。

'abc.exe': 'ImageAtBase0x10000000' を読み込みました。含める/除外する設定により、読み込みは無効になっています。
'abc.exe': 'ImageAtBase0x10000000' をアンロード

よろしくおねがいします。
0212デフォルトの名無しさん (ワッチョイ 397b-DbIH)2016/04/25(月) 17:20:39.11ID:Vz/PfYjH0
拾い物のdll名を出せない理由は?
盗品だから?
0213デフォルトの名無しさん (ワッチョイ 66a6-zfCm)2016/04/25(月) 18:20:21.95ID:zMzD7cFX0
どーでもいいわ、んなこと
0214デフォルトの名無しさん (ワッチョイ 3e4e-DbIH)2016/04/25(月) 21:18:39.53ID:nQ9xWXS00
>>211
まさかデバッガでステップインしようとしてる?
0215デフォルトの名無しさん (ワッチョイ 3ee5-v6Xr)2016/04/25(月) 22:09:57.56ID:p2RYg3GI0
右辺値なんて無くてもいいよね
0216デフォルトの名無しさん (ワントンキン MMd0-DbIH)2016/04/25(月) 22:22:09.27ID:nodCWmX5M
>>211
ビルドの設定が違うとかじゃないの
ランタイムをマルチスレッドにするかマルチスレッドDLLにするかとか
depedency walkerかなんかで必要なdll探してみて足りなきゃ置く、ランタイムのバージョンそろえる、そもそもランタイムの要否を調べてみたら
0217デフォルトの名無しさん (ワッチョイ 6aa6-gALo)2016/04/25(月) 22:25:01.35ID:gNn0n/ow0
>>215
なんでどさくさに紛れて変なこと言うの?www
0218デフォルトの名無しさん (ワッチョイ 7063-DbIH)2016/04/25(月) 22:35:01.48ID:yNWSO4Dk0
>>206
.NET Frameworkの質問をC++スレでするな低能
知らない奴がdepedency walkerとか言い出しちゃうだろ
0219デフォルトの名無しさん (ワッチョイ 3951-DxlG)2016/04/25(月) 23:23:42.73ID:yWovrPca0
>>206
xyz.dllが使ってる他のdllが見つからなかったからxyz.dllのロードも失敗したってことだろ。
0220デフォルトの名無しさん (ドコグロ MM5c-DbIH)2016/04/26(火) 07:05:42.42ID:9Pm0YF2lM
>>215
理解できないものはないものとして使わない
って言うのは正しい姿勢
なので
> 右辺値なんて無くてもいいよね
と君が考えるのは正しい
0221デフォルトの名無しさん (ワッチョイ 617b-3Kaz)2016/04/26(火) 08:03:25.27ID:uoCWhHDE0
他人に同意を求めるつもりで書いたなら正しくないけどな
0222デフォルトの名無しさん (スプー Sda8-DbIH)2016/04/26(火) 08:08:11.99ID:X2oLSlFmd
右辺値がない?
0223デフォルトの名無しさん (ワントンキン MMd0-DbIH)2016/04/26(火) 08:30:56.28ID:15Xmlz4WM
俺も右辺値参照いまいちよくわかってないんだけど、

doubleとかを返す関数で、return前に

double calc() {
  double&& res = ...
  return std::move(res);
}
は意味ないよね?

std::vector<double> calc() {
  std::vector<double>&& res = {};
  //ごにょごにょ
  return std::move(res);
};
も意味ないよね?

const std::vector<double>& calc() {
  std::vector<double>&& res = {};
  //ごにょごにょ
  return std::move(res);
};
は意味ある

でも、
std::vector<double> v = calc();
だと結局コピーが起きてもったいない?
const std::vector<double>& v = calc();
だと意味ある

こんな認識なんだけど正しいのだろうか
0224デフォルトの名無しさん (ワッチョイ 8dec-zfCm)2016/04/26(火) 08:46:32.55ID:rGhmFmB70
なんでresを右辺値参照にしてるんだ? そこは関係ないぞ。

C++98ではテンポラリを束縛する参照にconstが必須だったが、
それではムーブ動作させるのにconst_castが必要というアフォなことになっていて、
じゃあconst任意の参照を新設しましょうって出てきたのが右辺値参照で、
使うときの考え方は参照先がテンポラリの場合に使うものだ。
0225デフォルトの名無しさん (アウアウ Sa05-L+iy)2016/04/26(火) 09:47:41.48ID:A4vuhbbUa
const T&で大体十分
0226デフォルトの名無しさん (スプー Sda8-DbIH)2016/04/26(火) 10:46:34.53ID:X2oLSlFmd
どんな場合もローカル変数を参照で返してはいかんよ
0227デフォルトの名無しさん (スプー Sda8-DbIH)2016/04/26(火) 10:48:10.37ID:IHpx3UMhd
んなこたない
0228デフォルトの名無しさん (ワッチョイ 3ee5-v6Xr)2016/04/26(火) 11:06:37.75ID:GLJzO2KH0
そもそも右辺値参照みたいな変な事をしなくても良いコードを書けば良い。
0229デフォルトの名無しさん (スプー Sda8-DbIH)2016/04/26(火) 11:34:25.19ID:X2oLSlFmd
>>227
いかんでしょ
0230デフォルトの名無しさん (スプー Sda8-DbIH)2016/04/26(火) 11:35:38.49ID:IHpx3UMhd
んなこたない
0231デフォルトの名無しさん (スプー Sda8-DbIH)2016/04/26(火) 11:52:48.14ID:X2oLSlFmd
>>230
いやいかんでしょ
0232デフォルトの名無しさん (ワッチョイ 3ee5-v6Xr)2016/04/26(火) 11:57:22.86ID:GLJzO2KH0
右辺値参照を使わざるを得ない状況なんて無いよね。
0233デフォルトの名無しさん (ワッチョイ 4306-gALo)2016/04/26(火) 17:12:26.21ID:sp7HDy2O0
お前がそう思うんならそうなんだろう お前ん中ではな
っつぅか
チューリング完全ならなんでも書けるんだからC++自体いらないよね、K&Rで充分
っつぅか
0234デフォルトの名無しさん (スプー Sda8-DbIH)2016/04/26(火) 17:55:22.27ID:X2oLSlFmd
>>232
それってRVOでなんとかなるの意?
0235はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 19a8-gALo)2016/04/26(火) 18:01:58.79ID:1VUmXePL0
言語機能の多くは抽象化の道具なんだよ。
一旦書いたら中身は忘れてしまいたいから壁を作ってその向こうに押しやる道具が必要なんだ。
0236デフォルトの名無しさん (スプー Sda8-DbIH)2016/04/26(火) 18:03:13.30ID:X2oLSlFmd
まーた
0237デフォルトの名無しさん (オッペケ Sr8d-DbIH)2016/04/26(火) 18:17:56.12ID:jVopD7Dvr
>>223
2番目はコピーが発生しないようムーブしているから意味はある
ただ安易なmoveや参照の使用は最適化を阻害するため推奨はされない

推奨される書き方はこう
std::vector<double> calc() {
  std::vector<double> res = {};
  return res;
}
std::vector<double> v = calc();
0238デフォルトの名無しさん (ワッチョイ 4b02-gALo)2016/04/26(火) 18:57:35.91ID:tQCMt5AL0
>>232
アセンブラを使わずにギリギリまでチューニングしたいときに使えるんじゃないの
知らないけど
0239デフォルトの名無しさん (ワッチョイ 4db4-gALo)2016/04/26(火) 19:07:46.09ID:1BXtyTOd0
戻り値最適化って「本当に最適化されてんのか」っていっつも不安になる
0240デフォルトの名無しさん (ワッチョイ 617b-3Kaz)2016/04/26(火) 19:31:52.57ID:uoCWhHDE0
意味があるのはこういう時
std::vector<double> v = {};
o.assign(std::move(v));//これ以降vは使わない

でもこれも出来るのであればstd::vector<double>を返す関数作って関数の返り値を直接引数に渡せば不要

あと、std::vectorに入れるクラスの場合(nothrowな)move operator書いた方がパフォーマンスあがる事が多い
0241デフォルトの名無しさん (ワッチョイ 617b-3Kaz)2016/04/26(火) 19:38:27.71ID:uoCWhHDE0
ちょっと補足
この場合のassignの定義は
void assign(std::vector<double> v){
member.swap(v);
}
こんな感じのものね
0242デフォルトの名無しさん (ワッチョイ 7063-DbIH)2016/04/26(火) 20:22:16.94ID:gEJwYSMG0
↑糞コード
0243デフォルトの名無しさん (ワッチョイ 7063-DbIH)2016/04/26(火) 22:14:51.75ID:gEJwYSMG0
糞コードを発明する前にstring::assignとかの標準ライブラリが
どうなってるか調べようとしないんだろか
因みにスコットメイヤーの本には値渡しはhigher costとあるな
0244デフォルトの名無しさん (スプー Sda8-DbIH)2016/04/26(火) 22:30:23.02ID:X2oLSlFmd
まあいいじゃないか。実行時性能なんか、どうだって。
0245デフォルトの名無しさん (ワッチョイ 7063-DbIH)2016/04/26(火) 22:53:39.31ID:gEJwYSMG0
>>239
もし最適化されてなかったら困るのか?
別にコピーが走る訳じゃない
0246デフォルトの名無しさん (アウアウ Sa05-1g4J)2016/04/26(火) 23:32:52.19ID:JB7K2U7Pa
最適化はC++erの大好物だ
0247デフォルトの名無しさん (ワッチョイ 617b-3Kaz)2016/04/27(水) 01:49:55.63ID:GuBYWkr/0
こういうのは値渡しでswapした方がいいって事知らねえの?
0248デフォルトの名無しさん (ワッチョイ 19a8-gALo)2016/04/27(水) 01:53:22.01ID:0mhH1Qow0
実際に遅いことがわかってからチューニングにとりかかっても遅くはない。
まあライブラリはどういう状況で使われるかわからんから積極的に性能も意識して欲しくはあるが。
0249デフォルトの名無しさん (ワッチョイ 617b-7Ba6)2016/04/27(水) 02:12:47.40ID:GuBYWkr/0
>>243

例えば
void assign(const std::vector<double>& v){
member = v;
}
こうだと必ず1度コピーが動く。

void assign(std::vector<double> v){
member.swap(v);
}
こうだと引数がrvalueの場合最適化でコピーが動かない場合があるし、
C++11ならmoveになる。
swapのコストが低いのは言わなくてもわかるよね。
lvalueの場合でもコピーは1度

C++11以降で
void assign(const std::vector<double>& v);
void assign(std::vector<double>&& v);
二つ書いたときとのコスト差はswapのみ
0250デフォルトの名無しさん (オッペケ Sr8d-DbIH)2016/04/27(水) 19:30:14.55ID:2yCvnT+mr
>>249
>コスト差はswapのみ
ムブコンのコストはどこ行ったのよ
0251デフォルトの名無しさん (ワントンキン MMd0-3Kaz)2016/04/27(水) 19:52:26.36ID:turQDkKlM
>>250
rvalue渡したらどっちもmoveになる
0252デフォルトの名無しさん (オッペケ Sr8d-DbIH)2016/04/27(水) 20:04:17.37ID:2yCvnT+mr
>>251
いやならないし
参照ならassign呼び出し時のmoveは起こらない
0253デフォルトの名無しさん (ワントンキン MMd0-3Kaz)2016/04/27(水) 20:09:13.21ID:turQDkKlM
値渡しの方がmoveコンストラクタ自体動かない場合もあるからswapコストより差は小さくなる可能性があるという話であれば、否定はしない。

値渡し=高コスト=糞コード
と考えもせずに言う奴の反論したかっただけだからそこまで細かい説明するのであればご自由に
0254デフォルトの名無しさん (ワントンキン MMd0-3Kaz)2016/04/27(水) 20:16:31.83ID:turQDkKlM
>>252
想像より下だったか…

void assign(std::vector<double> v);
これにrvalue渡したらmove一回swap一回
lvalue渡したらコピー1回swap一回

void assign(const std::vector<double>& v);
void assign(std::vector<double>&& v);
これにrvalue渡したら下のが呼ばれて中でmove一回
lvalue渡したら中でコピー1回
0255デフォルトの名無しさん (ワッチョイ 6aa6-gALo)2016/04/27(水) 20:33:00.00ID:56VYowtZ0
void assign(std::vector<double> v);
これ定義しちゃうとオーバーロードきかないんだっけ?
0256デフォルトの名無しさん (ワッチョイ 7063-DbIH)2016/04/27(水) 23:41:06.04ID:2JVtUYOe0
>>254
どこをどう数えたらswapの違いになるのか

右辺値を渡した時
 f(X p);
  関数呼び出しのムーブ生成(メモリ確保+ムーブ)
  swap内の一時オブジェクトのムーブ生成(メモリ確保+ムーブ)
  swap内のムーブ代入(破棄+ムーブ)
  swap内のムーブ代入(破棄+ムーブ)
 f(X && p);
  ムーブ代入(破棄+ムーブ)

左辺値を渡した時
 f(X p);
  関数呼び出しのコピー生成(メモリ確保+コピー)
  swap内の一時オブジェクトのムーブ生成(メモリ確保+ムーブ)
  swap内のムーブ代入(破棄+ムーブ)
  swap内のムーブ代入(破棄+ムーブ)
 f(X const & p);
  コピー代入(破棄+コピー)
0257デフォルトの名無しさん (ワッチョイ 6aa6-gALo)2016/04/27(水) 23:48:41.61ID:56VYowtZ0
>>256
メモリ確保って一口に言ってるけど
0258デフォルトの名無しさん (ワッチョイ 753c-C5As)2016/04/27(水) 23:54:55.96ID:XwQarpQA0
std::cout << 0["2ch"];

これは合法ですか?
■ このスレッドは過去ログ倉庫に格納されています