C++相談室 part139

■ このスレッドは過去ログ倉庫に格納されています
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
2018/10/24(水) 23:47:52.54ID:VdYWesL2F
dir.exe とかはどうだろう
2018/10/24(水) 23:49:12.41ID:VdYWesL2F
間違えた cmd.exe か
>>339
実体参照は書き込めない短縮url貼ったりするときにも使えるよね
2018/10/24(水) 23:49:46.74ID:VdYWesL2F
cmd.exe か
2018/10/25(木) 00:27:44.75ID:pvv+BGAWa
©
2018/10/25(木) 01:10:25.04ID:ZE3NVml10
文字実体参照・数値文字参照なら、コマンドが実行されて、5ch サーバーをハッキングされる事もない

cmd.exe

dot, period は、ascii コード、46 (0x2E)
2018/10/25(木) 01:38:31.34ID:AmP2wyvxM
2018/10/25(木) 11:03:54.05ID:S9429CZWH
戻り値がオブジェクトの関数書きました。
すると上司が、変更があったとき不具合の原因になるからポインタで返せと。
これ本当でしょうか。stackoverflowとか覗いてるんですがオブジェクトで返すかスマポで返すかみたいな論調ばかりです。
少なくとも生ポインタ使えという意見は見当たりません。
(生)ポインタ使ったほうがいいケースというのは実際にあるんでしょうか。
347デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/25(木) 11:14:40.21ID:5Cy/pQlUF
>>346
malloc してるやつなら
FILE * とかな
348デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/25(木) 11:14:58.15ID:5Cy/pQlUF
ああ
もちろんスマポは否定しない
2018/10/25(木) 11:19:20.78ID:UTTFABgo0
>>346
参照返しでもポインタ返しでもプログラムの堅牢性は大差ない気がする。
ちなみに俺は、NULLを返すケースがある関数はポインタ返し、
NULLを返すケースがない関数は参照返しにしてる。
2018/10/25(木) 11:36:26.68ID:kug3Loto0
c++ の標準のスマートポインタでは循環参照を持つもの、
例えば get_child() と get_parent() を持つような木構造やリスト構造は扱えない
で、大抵の場合これらは単に生ポインタで実装される。
2018/10/25(木) 11:52:04.34ID:ytpwmPM20
>>346
C++ のミスりやすい箇所ってのはメモリ管理が多くを占めるので、
生ポインタは面倒くさいわってのが普通の感覚だと思うし、
不具合の原因になるってのはよくわからん言い分なので、
もっと掘り下げて聞かないとなんとも言えん。

共有オブジェクト (DLL) のインターフェイスにする場合なんかだと
ABI の都合とかでおかしなことになったりすることもあるかもしれんなぁ
みたいな可能性を想像することは出来るが、
書いてるプログラムや開発環境の性質に固有の事情はわからん。

一般的には、生ポインタにせざるを得ないことは有っても生ポインタの方が良いってことはあんまりなさそう。
2018/10/25(木) 12:00:30.29ID:kug3Loto0
ファクトリー関数は生ポインタ返すように作るのが良いと思う
353デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/25(木) 12:24:55.50ID:5Cy/pQlUF
たしかにどこも指してない参照を返したいときは
NULLポ使えるポインタ返しにする

ダミーの空オブジェクト作れるように
C++が最初からルートオブジェクト基底してくれてればよかったのにと思うことはある
2018/10/25(木) 12:31:40.62ID:O+EPl0Ul0
struct Point{int x; int y;};
みたいな単純なPOD構造体をstructだからって教条的にいちいちnewとポインタで取り回してるプログラムは時々見かけるけど
そういうのは危ないし遅いしウザいからやめてほしい
2018/10/25(木) 12:36:58.91ID:kug3Loto0
そんなの参照と値渡しでいいということには同意するが
point 型を new / delete してるコード見た経験はないな
2018/10/25(木) 13:10:30.18ID:CpJhCfWv0
>>346の上司が言ってるのは、コピーコンストラクトや代入が正しく機能するということを
保証しなくちゃならなくなるから、ってことだろ
そこまで気にかけてる暇はないし、生ポで書くのが一般的な職場だというならそれに倣うしかない
2018/10/25(木) 13:17:16.94ID:qRFZNeCrd
そういえば俺コピー不可のクラス書いてもちゃんと private だ何だで実際に代入できないようにしてないな…
2018/10/25(木) 15:12:05.05ID:UTTFABgo0
コピー不可で思い出したけど、コピーコンストラクタと代入演算子をprivateにしたクラスを
vectorにpush_back()する記述がコンパイルエラーになるよね。

vector<Hoge> hogeVec;
hogeVec.push_back(Hoge()); // コンパイルエラー

これってどうすればいいの?
359デフォルトの名無しさん (ワッチョイ a17f-7TBo)
垢版 |
2018/10/25(木) 15:24:01.65ID:GHCvVeSE0
emplace_back使うとか
360デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/25(木) 15:28:42.80ID:5Cy/pQlUF
friend
2018/10/25(木) 16:12:31.55ID:ytpwmPM20
>>358
std::vector の要素は CopyAssignable と CopyConstructible の要件を満たす必要がある。
実際、 std::vector は内部で要素をコピーしたり代入したりすることがあるんだから、
それが出来ない要素を入れられないのは当たり前の話で、
コンテナに入れるならポインタ (上記要件を満たすスマートポインタでもよい) を入れるようにするくらいしか方法はないと思う。
2018/10/25(木) 19:22:18.01ID:Xzu40Yvw0
>>358
ムーブしてもいいならムーブコンストラクタと代入演算子を定義すれば行けないかな
2018/10/25(木) 19:29:07.62ID:wLNEFoo10
どうせ所有権意識して std::move を使うなら個々のクラスには
手を加えず unique_ptr かますのが楽じゃないかな
2018/10/25(木) 20:30:19.71ID:ytpwmPM20
>>362-363
ムーブ可能なだけでは必要な要件を満たしてない。
コピー可能であることが要求されている。
2018/10/25(木) 20:44:45.18ID:Xzu40Yvw0
>>364
vectorの型Tの満たすべき要件は操作による
push_backとかresrveとかはコピーかムーブのどちらかが可能ならば問題ない
2018/10/25(木) 23:00:25.21ID:ZDfhcJz3r
リストのイテレータ使って周期的な処理をしたいんだが、そういう使い方合ってる?

N 要素のリストのイテレータ it = s.begin() を N 回インクリメントしたら、it はルート(?)を指すわけだが、そうじゃなくて s.begin() と同じところを指してほしい
こういう場合、どうしたら良いだろうか
2018/10/25(木) 23:40:18.35ID:NT+vxu3F0
くるくる回るシングルリンクリストを自前でこしらえたほうが手っ取り早いと思うけど、
https://www.boost.org/doc/libs/1_65_1/doc/html/circular_buffer.html
368デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/25(木) 23:59:33.84ID:ZWxqLT/20
スアホポインタみたいな頭ワルイの使うぐらなら
C++なんかつかわなければいいのに

低学歴知恵遅れは新しいもんができると
使わないといけないという使命感があるらしい

低学歴知恵遅れは自分で要否が判断できない
2018/10/26(金) 00:05:29.09ID:q2UMXiCp0
そうだね痴呆おじいちゃんには7年前に標準化された最新機能は難しすぎるから仕方ないね

半角に限らず今でもウヨウヨいるからあんまり笑い事じゃないんだけど
370デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/26(金) 00:08:04.60ID:7cGNdWT70
あんのが難しい?
知恵遅れは頭ワルイシロモノを使ってる自覚がないからな

低学歴知恵遅れはアレで難しいもん使ってるつもりでいんのか
へー
2018/10/26(金) 00:12:31.03ID:xVkfT4g2r
>>367
それ参考にして自力で実装してみます
ありがとうございます
2018/10/26(金) 01:29:12.07ID:D2okE+fs0
>>365
あ、ほんまや。 ワイの記憶は C++03 時代のやつやった。
ムーブないからしゃーなしでコピー必要やったんやな。
2018/10/26(金) 11:08:50.27ID:R8qtZuY20
うろ覚えで>>364みたいなこと断言してたのかよ
自分の記憶を疑う癖つけた方がいいよマジで
2018/10/26(金) 13:04:49.03ID:D2okE+fs0
>>373
いや、このサイトを見て確認はしたんだよ。
https://ja.cppreference.com/w/cpp/container/vector
ただ、 「C++11 以前」という書き方になってたから、前後を見ずに C++11 は含むのだと思ったし、
(現在の最新ではないとはいえ) C++11 くらいには配慮すべきだろうなっていう前提で言ってたの。

でも、ちゃんと仕様を確認したら「C++11 以前」は C++11 を含まないことに気づいたって次第。
2018/10/26(金) 14:50:04.44ID:R8qtZuY20
あー、確かにあれは紛らわしいかもね・・
でもすぐ近くに「C++11およびそれ以降」ってあるしな
2018/10/29(月) 12:48:55.53ID:oLCvh0eX0
Cとhaskellはどちらがどれくらい速いですか?
2018/10/29(月) 12:50:29.22ID:cH/HmFkLM
たらい回し関数でも作って遊んでろ
2018/10/29(月) 15:30:56.80ID:oLCvh0eX0
STLのリストは要素を挿入するごとにメモリーの割り当てが起こるのか一度に割り当てられている場所に
なのかどちらですか?
2018/10/29(月) 17:02:30.38ID:AJZhbohO0
規格は要素ごとに割り当てるのを想定してるだろうけど
例えば10個分まとめて、みたいな実装もOKじゃないかな……
挿入削除やイテレータの++がO(1)みたいな各種要件さえ満たしてれば
2018/10/29(月) 18:06:21.97ID:cH/HmFkLM
vectorならともかく、そんな実装するってメリットがあまり無い気が
2018/10/29(月) 18:28:09.22ID:wGJRVi/I0
メモリのローカリティを維持できれば性能がよくなる可能性もあるんじゃね?
2018/10/29(月) 19:36:47.21ID:oZEcP9DNd
>>380
メモリのアロケーションは意外にコスト高いからまとめてアロケートしておいて
node を用意するときにそこから placement new とかして使ってゆくと高速になる
リストのノードに限らず、プロファイル取って new が時間
食ってるときにオブジェクトについてはこれで簡易に改善できる

最近はデフォルトのアロケータが高性能で意味がないこともあるけど
2018/10/29(月) 19:40:02.85ID:oZEcP9DNd
続き
解放も一気にしないと面倒なので基本追加一方で不要になったら全部消すみたいな場合に使う

巨大 xml の dom を作って、不要になったら全解放みたいなとき。
2018/10/29(月) 22:12:03.67ID:88V2EdRw0
大きいデータだと何十万回、何百万回もnewしなくちゃいけないようなクラスは
1メガくらいまとめてnew [] したほうが絶対いい。
実行時間比較すればわかるけど、かなり高速になる。
2018/10/29(月) 22:12:56.73ID:JnF9Re6Y0
1メガくらいという根拠の薄いマジックナンバーに依存する糞コード
2018/10/29(月) 22:36:16.47ID:88V2EdRw0
>>385
当然、実装するときは、まとめて確保するメモリ量は指定できるように作るのが当たり前。
いちいちそんなこと言わなくてもみんなわかると思って、例えば1メガという意図で「1メガくらい」
と書いたが、バカには伝わなかったみたいだな
2018/10/29(月) 22:38:25.00ID:JnF9Re6Y0
で、1メガという定量的な根拠は? いくら罵倒しても自動的には出てこないぞ
2018/10/29(月) 22:40:37.61ID:YGs2BWq10
パフォーマンスを求めるシーンでダブルリンクリストって
2018/10/30(火) 00:35:43.38ID:0KkuIlNzd
ダブルかどうかは知らんが深さが不定の木構造なら仕方ない

んでメモリ確保はn個まとめればアロケーションコストはほぼ1/nになるんで
10とか100で十分で別にそんなに増やす必要はない
が、大量にアロケートするときしか使わない手法なので1000とか大きな数にするのが人の情
2018/10/30(火) 09:09:19.02ID:/5i0cROz0
何百万回もnewする想定なのに1メガでいいの?
2018/10/30(火) 10:54:57.24ID:aDKxpfal0
まあnewするクラスのサイズによるだろ
サイズが100バイトのクラスなら1メガでもnewの回数が一万分の1になるので効果はありそう
2018/10/30(火) 11:32:05.07ID:/tj4m1Wy0
データ構造全体でどれくらいの大きさになるのか事前に見積もれればいいんだけどね。

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

そうだな
実行開始して何時間も待たされた挙句、メモリ不足でエラー終了とかマジ勘弁して欲しいわ
最初に使用メモリ量を予測してエラーにしてくれよ
2018/10/30(火) 14:48:22.73ID:bp+Jjz8rM
今時はメモリエラーなんて出さずに延々確保しにいってスラッシングしまくるだけ
395デフォルトの名無しさん (ワイーワ2 FF33-gZJR)
垢版 |
2018/10/30(火) 15:06:52.69ID:p4LrBCE7F
>>387 >>385
キャッシュなんだから 2のn乗で適当な大きさ持ってれば大丈夫
2018/10/30(火) 16:22:00.39ID:YIrhnuea0
2^N+αの方がいいぞ
2018/10/30(火) 21:01:00.62ID:Z4vjmLqM0
>>395
テキトーの用語の使い方を間違っているな
2018/10/31(水) 00:35:59.17ID:7q2lQPFCM
適当には適切という意味もあるんやで
2018/10/31(水) 00:55:16.82ID:n3cdWN/k0
jemallocのデフォルトチャンクサイズは1MiBらしいな
経験的に悪くない数字なんだろう
2018/10/31(水) 00:55:23.06ID:2bLA79Ru0
一気解放テクというのはN億個のオブジェクトをフルスピードで作って10秒かかったとして、
破棄するときもバカ正直に10秒かけるつもりなのかとかそういう話だが
オブジェクトがリソースを所有しておりデストラクトを要するブツだったりすると
オブジェクトの占有メモリだけ一気に解放することはできないから成立しない
というわけでコンパイラの中で構文解析結果であるところの木構造を破棄するのにお目にかかるぐらい
なキモス
2018/10/31(水) 01:44:07.13ID:y5TVZzW10
ソースコードを読んだわけじゃないが、
ウェブサーバの H2O はドカンと大きいメモリを確保して頭から順番に使っていくという戦略を取ってるのでクソ速いというのを
どこかで見た覚えがあるな。

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

で、指摘の通り
メンバ変数がまたメモリを確保/解放してるとご利益がぐっと薄れるので
まとめて確保を使い始めるとベクターだなんだもショートストリング最適化みたいな
小サイズなら静的に確保したメモリを使うようなテクニックを使い始める。
LLVM の SmallVector やそれを基にした boost の smallvector なんかがそれか
2018/10/31(水) 03:44:09.76ID:dHrKLKTO0
boost のは small_vector の typo
2018/10/31(水) 05:48:21.49ID:dHrKLKTO0
まとめてアロケートするコードのテストコードを書いてみた
簡単なリストのアロケーションと解放
100個ずつと1000個ずつではだいぶ違った
1000を10000にしても大差ない

https://ideone.com/oyIM5p
2018/10/31(水) 07:57:39.93ID:dHrKLKTO0
上の例はリストのノードにstring を持たせているが、
これをvectorにするだけで高速化の倍率はひどく悪化する。
https://ideone.com/k6XiHK

string は SSO(ショートストリング最適化)で小サイズならメモリのアロケートを行わないが、
vector はサイズ1でも必ずアロケートするため。
406デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/31(水) 13:42:46.70ID:XAA9QXm2F
vector禁止
2018/10/31(水) 15:36:31.08ID:wG8+54SGM
よーしパパbitset使っちゃうぞ
2018/10/31(水) 17:52:51.32ID:HGEk6qvJ0
opencv(c++)で適当な画像をDCTしてDCT係数をテキストファイルにプログラムを教えていただけませんでしょうか。
画像をDCTするとこまでは分かったんですがそのあとが分からないです。
2018/10/31(水) 17:53:54.59ID:HGEk6qvJ0
>>408
テキストファイルに表示するです
2018/10/31(水) 18:14:35.77ID:N9TdgOC+0
日本語でOK
411デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/31(水) 18:23:30.41ID:XAA9QXm2F
>適当な画像をDCTしてDCT係数をテキストファイルにプログラム

日本語で
2018/10/31(水) 18:28:26.25ID:HGEk6qvJ0
>>408
もう1回書きますがテキストファイルに書き出すです
413デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/31(水) 18:30:01.31ID:XAA9QXm2F
ファイルに表示
2018/10/31(水) 18:44:17.50ID:YG0rnI8eM
OSが分からんが、一番楽チンであれこれ考えなくて良いのは普通にprintfしてファイルにリダイレクト。
2018/10/31(水) 21:27:56.35ID:HGEk6qvJ0
windowsです
2018/10/31(水) 22:31:25.44ID:wG8+54SGM
dctは出来るのにストリームへの出力は出来ないのか
2018/10/31(水) 22:34:24.39ID:Cti468/q0
ofstreamでファイル開いて<<で出力
ascii文字だけなら文字コード気にしなくてもいい
2018/11/01(木) 01:13:06.51ID:PigZrB5P0
DCT係数が配列に格納されているんですがそのすべてを書き出すのができないです
419デフォルトの名無しさん (ワッチョイ a323-WkUi)
垢版 |
2018/11/01(木) 10:51:44.25ID:z733lC2q0
>>416
https://twitter.com/Campaign_Otaku/status/1057156200981135361/photo/1

空で字描ける人が着陸の仕方を「どうやるの」なんて疑問は出てくるはずがない。
「どういう風に降りようかな」って意味なら判る。
完全に誤訳
https://twitter.com/5chan_nel (5ch newer account)
2018/11/01(木) 20:17:49.41ID:Pz4tYpgEd
>>418
Mat 型の変数 m に入ってるなら
std::cout << m;
で標準出力に出るだろう

参考
http://opencv.jp/cookbook/opencv_mat.html
2018/11/01(木) 20:42:34.69ID:yQbjy7jF0
C言語は高校・大学の頃やったので大体わかります
今更ですがC++勉強するのに良い教材は何でしょうか?
本が良いですがもっと良い方法がありましたらそれでも良いです
2018/11/01(木) 20:56:14.21ID:Pz4tYpgEd
>>421
まずは「プログラミング言語 C++」を読んでみては?
高いから図書館で借りるといい
2018/11/02(金) 00:38:53.71ID:YtkatxxE0
effective c++とか
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
を抜き出したいです
425デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/02(金) 01:08:54.86ID:KoqyjIsr0
equal_rangeを使う
2018/11/02(金) 01:34:41.33ID:T61e9sN/0
>>424
自分で書きたくないならあり物のライブラリ使えばいいのでは
よく知らんけど opencv の Mat とか BLAS とか

https://minus9d.hatenablog.com/entry/2014/03/21/114514
2018/11/02(金) 01:58:52.59ID:CMIkY+8nr
boost の multi_array でできる
かなり調べた結果これに行き着いたから、他のを見つけるのは至難の業だと思う
2018/11/02(金) 02:00:44.27ID:CMIkY+8nr
まぁ2次元配列に限るなら正直 vectorのvector でそういう動作するもの簡単に作れるよね
2018/11/02(金) 04:22:50.02ID:T61e9sN/0
普通こういうものの部分行列はデータをコピーしないで動作するんだよ。用途によるけどだいたいは。
2018/11/02(金) 09:58:57.11ID:UBXHQBH/0
>>423
質問者に合ってると思うか?
431デフォルトの名無しさん (ワッチョイ 9723-VEUj)
垢版 |
2018/11/02(金) 16:44:40.29ID:ggr9EF3w0
>>424
C++ から python も numpy も使える
2018/11/02(金) 21:55:06.47ID:yMnDBJfs0
>>424
vectorではなくvalarrayの使いどころだ
2018/11/02(金) 22:55:21.07ID:lVpg8bJur
valarrayじゃなきゃ駄目な場面なんて知らんがな
2018/11/03(土) 00:31:38.77ID:ogvvzewS0
slice使える
435デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/04(日) 13:10:56.85ID:MKH8Qowh0
そもそも2次元の配列使う必要がない
1次元で十分
池沼はいちいちみため2次元にしたがる
436デフォルトの名無しさん (アウアウカー Sac3-XPOZ)
垢版 |
2018/11/04(日) 15:35:15.29ID:NU/4ChKLa
20年前の本読んでも問題ないか?
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して
強引に**で二次元を扱えることにするテクニックを某所で自慢したら
タコ殴りにされて、すっかり心を病んでしまい
以後、二次元配列というワードで凶暴化するようになった、とかね
438デフォルトの名無しさん (ワイーワ2 FF12-VEUj)
垢版 |
2018/11/04(日) 17:10:10.81ID:dwIn1XjHF
>>436
tcl/tk なら枯れてるから大腿同じ
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
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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