X



C++相談室 part139
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ f65b-zn+7)
垢版 |
2018/10/06(土) 00:59:48.54ID:CdYUXXMG0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/

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

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

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

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0389デフォルトの名無しさん (スップ Sd37-VFcb)
垢版 |
2018/10/30(火) 00:35:43.38ID:0KkuIlNzd
ダブルかどうかは知らんが深さが不定の木構造なら仕方ない

んでメモリ確保はn個まとめればアロケーションコストはほぼ1/nになるんで
10とか100で十分で別にそんなに増やす必要はない
が、大量にアロケートするときしか使わない手法なので1000とか大きな数にするのが人の情
0392はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b6f-7TBo)
垢版 |
2018/10/30(火) 11:32:05.07ID:/tj4m1Wy0
データ構造全体でどれくらいの大きさになるのか事前に見積もれればいいんだけどね。

ガチでチューニングしようと思ったら
各アプリケーションでのメモリの使い方の特性を考慮しなきゃならんし、
パラメータの微調整は実際にやって試してみるしかしょうがない。
0393デフォルトの名無しさん (ワッチョイ f323-JHIh)
垢版 |
2018/10/30(火) 12:17:01.56ID:aDKxpfal0
>>392
>データ構造全体でどれくらいの大きさになるのか事前に見積もれればいいんだけどね。

そうだな
実行開始して何時間も待たされた挙句、メモリ不足でエラー終了とかマジ勘弁して欲しいわ
最初に使用メモリ量を予測してエラーにしてくれよ
0395デフォルトの名無しさん (ワイーワ2 FF33-gZJR)
垢版 |
2018/10/30(火) 15:06:52.69ID:p4LrBCE7F
>>387 >>385
キャッシュなんだから 2のn乗で適当な大きさ持ってれば大丈夫
0400デフォルトの名無しさん (ワッチョイ bbbd-x3RP)
垢版 |
2018/10/31(水) 00:55:23.06ID:2bLA79Ru0
一気解放テクというのはN億個のオブジェクトをフルスピードで作って10秒かかったとして、
破棄するときもバカ正直に10秒かけるつもりなのかとかそういう話だが
オブジェクトがリソースを所有しておりデストラクトを要するブツだったりすると
オブジェクトの占有メモリだけ一気に解放することはできないから成立しない
というわけでコンパイラの中で構文解析結果であるところの木構造を破棄するのにお目にかかるぐらい
なキモス
0401はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b6f-7TBo)
垢版 |
2018/10/31(水) 01:44:07.13ID:y5TVZzW10
ソースコードを読んだわけじゃないが、
ウェブサーバの H2O はドカンと大きいメモリを確保して頭から順番に使っていくという戦略を取ってるのでクソ速いというのを
どこかで見た覚えがあるな。

ウェブサーバならセッションが基本単位と考えれば、
セッション開始時に大きいメモリを確保してセッション終了でまるっと捨てるというのは確かに理にかなった方針だと思う。
0402デフォルトの名無しさん (ワッチョイ 2723-VFcb)
垢版 |
2018/10/31(水) 03:43:29.87ID:dHrKLKTO0
>>400
いやnewもdeleteもインプレイスでやるからメモリの確保と解放はまとめてできるんだ
んでコンストラクタとデストラクタはどっちにせよ必要なので、メモリの確保と解放が問題なんだよ

で、指摘の通り
メンバ変数がまたメモリを確保/解放してるとご利益がぐっと薄れるので
まとめて確保を使い始めるとベクターだなんだもショートストリング最適化みたいな
小サイズなら静的に確保したメモリを使うようなテクニックを使い始める。
LLVM の SmallVector やそれを基にした boost の smallvector なんかがそれか
0405デフォルトの名無しさん (ワッチョイ 2723-VFcb)
垢版 |
2018/10/31(水) 07:57:39.93ID:dHrKLKTO0
上の例はリストのノードにstring を持たせているが、
これをvectorにするだけで高速化の倍率はひどく悪化する。
https://ideone.com/k6XiHK

string は SSO(ショートストリング最適化)で小サイズならメモリのアロケートを行わないが、
vector はサイズ1でも必ずアロケートするため。
0406デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/31(水) 13:42:46.70ID:XAA9QXm2F
vector禁止
0408デフォルトの名無しさん (ワッチョイ cb1b-ALmr)
垢版 |
2018/10/31(水) 17:52:51.32ID:HGEk6qvJ0
opencv(c++)で適当な画像をDCTしてDCT係数をテキストファイルにプログラムを教えていただけませんでしょうか。
画像をDCTするとこまでは分かったんですがそのあとが分からないです。
0411デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/31(水) 18:23:30.41ID:XAA9QXm2F
>適当な画像をDCTしてDCT係数をテキストファイルにプログラム

日本語で
0413デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/31(水) 18:30:01.31ID:XAA9QXm2F
ファイルに表示
0421デフォルトの名無しさん (ワッチョイ 63b3-MyS3)
垢版 |
2018/11/01(木) 20:42:34.69ID:yQbjy7jF0
C言語は高校・大学の頃やったので大体わかります
今更ですがC++勉強するのに良い教材は何でしょうか?
本が良いですがもっと良い方法がありましたらそれでも良いです
0424デフォルトの名無しさん (ワッチョイ 3685-DqXg)
垢版 |
2018/11/02(金) 00:55:59.17ID:bpaiY9An0
C++ってnumpyみたいに2次元配列から範囲を指定して抜き出しとか出来ないですかね?

10, 20, 30, 40, 50
60, 70, 80, 90, 100
110, 120, 130, 140, 150
160, 170, 180, 190, 200

このようなvectorがあった際に
70, 80, 90
120, 130, 140
170, 180, 190
を抜き出したいです
0425デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/02(金) 01:08:54.86ID:KoqyjIsr0
equal_rangeを使う
0431デフォルトの名無しさん (ワッチョイ 9723-VEUj)
垢版 |
2018/11/02(金) 16:44:40.29ID:ggr9EF3w0
>>424
C++ から python も numpy も使える
0435デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/04(日) 13:10:56.85ID:MKH8Qowh0
そもそも2次元の配列使う必要がない
1次元で十分
池沼はいちいちみため2次元にしたがる
0436デフォルトの名無しさん (アウアウカー Sac3-XPOZ)
垢版 |
2018/11/04(日) 15:35:15.29ID:NU/4ChKLa
20年前の本読んでも問題ないか?
0437デフォルトの名無しさん (ワッチョイ 0ef0-MyS3)
垢版 |
2018/11/04(日) 16:00:02.15ID:T2TFtaIb0
みため二次元ねえ

int vec[][5] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200 };
これで済むことを、

int& elm(int row, int col)
{
static int vec[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200 };
return vec[row * 5][col];
}
いちいちこう書くやつも充分に池沼なんだが

そういうやつをちょっとプロファイリングしてみると
配列へのポインタに腹を立て、ポインタの配列にmallocして
強引に**で二次元を扱えることにするテクニックを某所で自慢したら
タコ殴りにされて、すっかり心を病んでしまい
以後、二次元配列というワードで凶暴化するようになった、とかね
0438デフォルトの名無しさん (ワイーワ2 FF12-VEUj)
垢版 |
2018/11/04(日) 17:10:10.81ID:dwIn1XjHF
>>436
tcl/tk なら枯れてるから大腿同じ
0439デフォルトの名無しさん (ワッチョイ 9abd-yxtD)
垢版 |
2018/11/04(日) 17:55:13.85ID:ntvnp4Zh0
ていうか(アドレスp)[x]は*(p+x)の別表記に過ぎないというのは規格上の話にすぎなくて、
実際問題としては一次元配列アクセスと二次元配列アクセスには最適化のかかり方次第でかなり速度差が生じるお
一次元配列にすると、概念上の次の行の要素への移動が加算1発で済むというのが喜ばしい
これとループ最適化が組み合わさると、配列スキャンが主な仕事の処理は爆速になり得る

といいつつ次の例はideoneでこそ一次元配列アクセスの方が遅いが(爆
Visual C++ 2010だと一次元配列は10倍超速いお
https://ideone.com/K7uLo9

(VC++での結果)
******* Array 1D opt:
ntimes=100000^2, sum=2372578304
Consumed time=0 sec

******* Array 2D:
ntimes=100000^2, sum=2372578304
Consumed time=10 sec
0441デフォルトの名無しさん (エムゾネ FFba-VEUj)
垢版 |
2018/11/04(日) 18:16:57.25ID:rLQVzKFuF
C/C++で「二次元配列」と言った場合
char *hoge[N]; の方を指すのであって
char **fuga; の方は決して「二次元配列」ではない

Javaなら後者を指してるので
これらが初心者には混乱の元
0442デフォルトの名無しさん (エムゾネ FFba-VEUj)
垢版 |
2018/11/04(日) 18:17:36.23ID:rLQVzKFuF
ごみん
いきなり間違えた
char *hoge[N]; じゃなくて
char (*hoge)[N]; こうです
0443デフォルトの名無しさん (エムゾネ FFba-VEUj)
垢版 |
2018/11/04(日) 18:19:01.87ID:rLQVzKFuF
439 の言うばふぉーマンスは
char **fuga; だから落ちるのであって
char (*hoge)[N]; では落ちない
0444デフォルトの名無しさん (ワッチョイ 9abd-yxtD)
垢版 |
2018/11/04(日) 18:28:12.23ID:ntvnp4Zh0
ていうか>>439のやつもよく調べたら1000倍近い速度差で一次元配列の方が早いお
今日日のCPUアーキテクチャーでよく見られるいつもの光景だお…

(VC++でntimes = 百万の2乗にした結果)
******* Array 1D opt:
ntimes=1000000^2, sum=2273652736
Consumed time=0 sec

******* Array 2D:
ntimes=1000000^2, sum=2273652736
Consumed time=928 sec
0446デフォルトの名無しさん (ワッチョイ a323-cvuZ)
垢版 |
2018/11/04(日) 18:41:14.77ID:egw3UDrd0
>>444
VC++は2次元配列が苦手ってだけじゃない?
手元のgccとclangは最適化なし(-O0)だと1次元の方が少し遅くて最適化あり(-Ofast)だと1次元と2次元で計算部分は全く同じアセンブリになった
0447デフォルトの名無しさん (アウアウカー Sac3-U2lQ)
垢版 |
2018/11/04(日) 18:58:49.68ID:pidkuN2Fa
>>436
文法古くて生産性低いってだけで、コードは動くよ。
0448デフォルトの名無しさん (ワッチョイ df8a-6RPj)
垢版 |
2018/11/07(水) 14:24:50.89ID:ldKnJvNa0
黙って行列ライブラリ使えよ
0450デフォルトの名無しさん (ワッチョイ a323-VEUj)
垢版 |
2018/11/07(水) 15:52:57.02ID:IyZ6SaMg0
話題毎にスレ移動してる遊牧流民族
0456デフォルトの名無しさん (ブーイモ MMb9-NrKH)
垢版 |
2018/11/15(木) 19:31:27.51ID:u78hdNWAM
>>454
おまいはNGな(´・ω・`)
0466デフォルトの名無しさん (ワイーワ2 FFdf-OXRW)
垢版 |
2018/11/22(木) 12:42:34.39ID:blyr971hF
>>463
ほんそれ
0467デフォルトの名無しさん (ワイーワ2 FFdf-OXRW)
垢版 |
2018/11/22(木) 12:42:56.61ID:blyr971hF
>>465
当初から言われてたぞ
0468デフォルトの名無しさん (ワッチョイ cfa5-L5v9)
垢版 |
2018/11/22(木) 17:56:25.68ID:RROqQEmy0
test
0473デフォルトの名無しさん (ワッチョイ 537b-/G1A)
垢版 |
2018/11/23(金) 11:48:27.57ID:nZV4GP9h0
どっちも参照カウンタが0になった瞬間はガベージと言えないこともないが、スマートポインタだとその場で即削除される。
ガベージコレクションは参照カウンタが0になったメモリをメモリアロケータが適当なタイミングで削除する。
0474デフォルトの名無しさん (スッップ Sd1f-Th1j)
垢版 |
2018/11/23(金) 11:53:50.43ID:/6hb/Gdud
自分の中で結論出してるみたいだから説明したくないなあ

スマートポインタはリファレンス(参照)がなくなったときにメモリやオブジェクトを解放する。
ガベージ(参照不能なオブジェクトやメモリ)がどこかに溜まって、
いつかのタイミングでそれらをコレクトするような動作はしない。

スコープを抜けるときにスタックフレーム上のオブジェクトが破棄されるのと同様。

異論はいくらでもどうぞ
0476デフォルトの名無しさん (ワッチョイ f3c3-9Nj+)
垢版 |
2018/11/23(金) 13:11:50.55ID:QYpEy3WT0
「部屋を最後に出る奴は電灯消せよ」がスマポ(std::shared_ptr)
電灯付けっぱで誰もいない部屋を探して消し回るおばちゃんがGC
C++にはそういうおばちゃんはいない
0480デフォルトの名無しさん (アウウィフ FF27-OXRW)
垢版 |
2018/11/23(金) 13:44:09.05ID:e4GZHgy/F
生ポを上手に使えない人が使えばいい
自信があれば無くてもOK
0481はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f6f-zhOP)
垢版 |
2018/11/23(金) 13:53:48.42ID:o3+kYr4A0
可能なら生ポインタは避けるのが良い作法。
単純に、 delete を書くのめんどいから勝手にやってくれた方がよくね?
そりゃあ場合によっては生ポインタが必要な箇所もあるだろうけど、
スマートポインタは高度なライブラリ内だけでしか使われないってほど特殊なもんではない。

ポインタ型のデータメンバを持つクラスのコンストラクタで
発生した例外を function try block で捕捉して後始末をするよりは
スマートポインタを使った方が勝手に解放してくれて楽というのもある。

例外が絡むと本当にめんどいし、思考停止したい。
0483デフォルトの名無しさん (ブーイモ MMe7-XNyg)
垢版 |
2018/11/23(金) 14:36:29.45ID:D8he5SEKM
>>482
参照カウントがGCの実装アルゴリズムとして使われることがあるというだけで、スマポがGCと言ってるわけではないよ。

だいたいガイジンにとってガベージコレクションといえば↓コレなんだから、広範に収集しないスマポをGCと呼ぶのはすごい違和感。
https://money.usnews.com/careers/best-jobs/garbage-collector
0484はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f6f-zhOP)
垢版 |
2018/11/23(金) 14:46:07.98ID:o3+kYr4A0
スマポが GC かっていうのはちょくちょく話題になるね。

私自身は std::shared_ptr はガベジコレクタの一種だと考える派って話は前スレにも書いた。
https://mevius.5ch.net/test/read.cgi/tech/1535353320/303
考え方によるので定義を定める必要はないとも思ってるけどね。

>>473-474
C++ でデストラクタで不要なメモリにマークだけしておいて
実際の解放処理は後回し (とか別スレッドでやる) だとかいう手法もあるけれど、
あなたがたの基準ではこれは GC と言える?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況