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


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

【初心者歓迎】C/C++室 Ver.106【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2020/07/13(月) 13:51:48.09 ID:WBkWHxcT.net]
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

637 名前:デフォルトの名無しさん mailto:sage [2021/03/19(金) 03:28:58.86 ID:mbZVOQ2F.net]
だからムーブコンストラクタとムーブ代入演算子があるんだろうが・・

638 名前:デフォルトの名無しさん mailto:sage [2021/03/19(金) 03:37:37.65 ID:0CmLwf9e.net]
>>617-618
てかそもそもコンストラクタ走っていいのかよこの場合に

639 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 12:21:23.57 ID:dUyySPje.net]
クラスFooのメンバ関数fの型ってどう書くの?
戻り値void、引数intです。

640 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 12:52:45.71 ID:N6zWukcq.net]
>>620
f の型は void (int) だけど f へのポインタの型は void (Foo::*)(int)

641 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 18:45:41.35 ID:WYvZUx+H.net]
>>621
それはメンバ関数へのポインタでしょ
聞いてるのは関数の型でもなく、メンバ関数の型です

642 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 20:18:08.96 ID:DC3guaga.net]
言われてみれば関数の型ってなんだ?

643 名前:はちみつ餃子 mailto:sage [2021/04/09(金) 21:13:09.06 ID:foJJo5gI.net]
C だと関数指示子 (Function Designator) で説明されたりするんだが、
C++ の仕様を Designator で検索しても出てこないな。
シグネチャもまたちょっと違う概念だし、
このあたりのきちんとした解説がまとまったものがあればぜひ読みたい。

644 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 21:39:18.43 ID:MYEEijki.net]
「メンバ関数の型」が必要になるケースって何じゃろ?

645 名前:デフォルトの名無しさん mailto:sage [2021/04/10(土) 01:44:53.83 ID:4ITkpFPM.net]
>>622
だから「f の型は void (int)」って書いたのに、なんでそれが答えじゃないと思うの?

typedef void ftype(int);
struct Foo { ftype f; };
void Foo::f(int) {}
int main() { Foo x; x.f(0); }



646 名前:デフォルトの名無しさん mailto:sage [2021/04/10(土) 08:44:20.64 ID:gtw6CEDD.net]
関数ポインタを考える以前は関数の型と言えばイコール評価した値の型だったな。

647 名前:デフォルトの名無しさん mailto:sage [2021/04/13(火) 16:10:43.48 ID:uVvL/txB.net]
今は関数の型とかもうどうでもよくて
一周回り帰えりキャプチャとかダイナミックスコープとかの有用性や整合性が中心よね

648 名前:デフォルトの名無しさん mailto:sage [2021/04/15(木) 15:55:01.75 ID:6RtJrvVe.net]
pod的な意味でなく論理的整合性的な型付けの恩恵受けたいなら、別に包む必要無くても常に即席structで返しててやんでい

649 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:11:28.54 ID:LUJ0Utr0.net]
C++/CLIで、スタティックライブラリからマネージドクラスを公開するのは無理なんでしょうか?
ヘッダファイルに全部実装書けば出来る、ってところまでは調べたんですが、ソースコードをプロジェクト外に置いてるのと変わらないので…。
ダイナミックライブラリでできるならそれでも構わないです。

650 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:19:46.15 ID:nPKzA798.net]
>>630
.NETでstatic libraryなんて作れたっけ?
最終的に.exeと.dllができるのが邪魔だからstatic libraryにしたいというだけなら、
いったんDLLとして作ってILmergeするのが一般的だと思う

651 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:36:31.23 ID:LUJ0Utr0.net]
>>631
Lib自体は作れるし、アンマネージクラスなら公開もできるんですが、マネージクラスだと参照側でメンバーが参照できず、LNK2020が発生してしまうんですよね。
ビルドオプションでなんとかできるものなのかな、と。

652 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 09:53:24.75 ID:K4uxnQki.net]
LNK2020ってそれnativeのC++からリンクしようとしてる?

653 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 14:56:57.93 ID:LUJ0Utr0.net]
>>633
libなのでクライアントはC++です

654 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 15:16:56.42 ID:K4uxnQki.net]
そりゃ無理。その仲立ちをするためにC++/CLIがあるのに。
一応nativeのC++からでも自分でCLRを立ち上げたりしてマネージドクラスにアクセスする方法は
あるらしいが、リンクしてそのまま呼ぶという形にはならない。

655 名前:デフォルトの名無しさん [2021/04/24(土) 15:41:46.62 ID:at4cvaWV.net]
自作のプログラム、起動時の読み込み処理の前に以下を入れると
for(int i = 0; i < 100; ++i){
OutputDebugString("dummy!!!!\n");
}
起動時に行っている外部データの読み込みが凄く速くて
これを無くすと凄く遅くなるんですが怖い…
3分くらい違いが出るので明らかにおかしい
どっかでメモリでもぶっ壊れてますかね?
どういう理由が考えられるでしょうか?



656 名前:636 mailto:sage [2021/04/24(土) 15:43:36.70 ID:at4cvaWV.net]
さっきのダミーを入れなくても
普通にコードを追加したりしてても遅くなったり速くなったりする
別に読み込み処理の部分とは関係ないところでも。
なんでだろう?

657 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 15:54:20.61 ID:hc4SaSPr.net]
>>637
それは、本当に native の C++?
もしかして、C#のC++/CLI とか

658 名前:H []
[ここ壊れてます]

659 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 16:03:17.28 ID:lkpB631F.net]
コンパイラはほんと何してるのか分からんから、問題の部分だけ切り出したのを.sへ吐かせて読みなさい
10行程度のcコードなら、edxとか変な名前のは取り敢えず変数だなって思って追えば、アセンブリ知らずとも大体分かるよ

660 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 20:39:49.92 ID:LUJ0Utr0.net]
>>635
いや、
C++ライブラリ内にマネージクラスを作って
マネージのC++プロジェクトから
呼び出したいだけ
DLLだったら、C#のDLLからマネージクラスを呼び出すのと
理屈上同じだからできそうな気がするのだけれど

以前実装した時はInterfaceだけ公開して
呼び出されるとそのインスタンスを返す、みたいなことをしたんだけれど

661 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 21:31:19.65 ID:+v1plSJo.net]
>>640
.NETはstatic libraryをサポートしていない
出来上がった.libにはそのマネージドクラスのメタデータとか入ってないんじゃない?

662 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 00:05:51.07 ID:Oojm0ZzH.net]
>>641
結局そういうことだよね
なんか普通にlibのクラスを呼び出せますみたいなのをサンプル付きで出してた記事があってさ…。

まあstaticメソッドしかないクラスばかりだから、アンマネージクラスで公開するか、namespaceでまとめます。
ありがとうございました。

663 名前:636 [2021/04/25(日) 00:07:18.69 ID:sRfn5IZk.net]
>>638
C++とWin32APIのプログラムです
>>639
これは自分へのレスですか?

特に遅くなる以外は止まったりする事もないので
困ることはないですがなんか気持ち悪い…

664 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 03:40:15.50 ID:vJWG11Gh.net]
>>643
外部データの読み込みは、fopen, _open, CreateFile、CFile のどの系統を使
ってる?

665 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 03:43:25.25 ID:vJWG11Gh.net]
>>643
関係ないかもしれないが、HDDが寿命で故障寸前の時にHDDの読み込みが
時々極端に遅くなったりする現象を経験したことがある。
その場合は、そのプログラム以外でも同様の現象が起きるが。



666 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 03:49:56.55 ID:vJWG11Gh.net]
>>645
もし、他のアプリやファイルマネージャーも遅くなることがあるなら、
CrystalDiskInfoなどで診断してみて欲しい。
そのアプリだけ遅くなるが、アプリの動作は正常、というなら、
メモリーやスレッドやOSリソースの使いすぎなども考えられなくは無いが。
何か極端に変わったことしてたりしない?

667 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 09:07:00.47 ID:x26Nnfhp.net]
OutPutDegugなんちゃらの関数がファイル出力してるなら、単純にそのドライブのアクセス準備が整ってないとか。

以前、SSDに同じファイル名で一時ファイルの作成と削除を繰り返したら、SSDの仕組み上めっちゃ遅くなったことがある。

668 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 09:59:46.07 ID:j6IXZwA/.net]
>>642
どこの記事?
ちょっと気になった

669 名前:636 mailto:sage [2021/04/25(日) 10:38:16.68 ID:sRfn5IZk.net]
>>645-647
遅くなる原因の個所が分かった!
画像を読み込む時にメモリを操作して
16bitで読み込む部分があるんだけど
これを32bitで読み込むようにすると
どんなコードでもまったく遅くならない。
メモリの操作の部分がおかしかったみたい。
自分で書いたコードじゃないのでよくわからない。
32bitのやつと16bitのやつを載せるのでおかしい所あったら教えて。

670 名前:636 mailto:sage [2021/04/25(日) 10:39:18.00 ID:sRfn5IZk.net]
これは遅くならないコード
int X = 0;
for(int y = ImageHeight - 1; y >= 0; --y){
X = 0;
for(int x = 0; x < ImageWidth; ++x){
pPx[X] = ((DWORD*)pSrcBuf)[x + (y * ImageWidth)];
++X;
}
pPx += Pitch;
}

671 名前:636 mailto:sage [2021/04/25(日) 10:42:37.48 ID:sRfn5IZk.net]
これが遅くなる場合があるコード


672 名前:WORD px, tmp;
BYTE b;
int X = 0;
for(int y = ImageHeight - 1; y >= 0; --y){
X = 0;
for(int x = 0; x < ImageWidth; ++x){
px = 0x00000000;
pPx[X] = px;

b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0xff000000) >> 24); //A
tmp = 15 * (b / 255.f);
px |= tmp << 12;

b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0x00ff0000) >> 16); //R
tmp = 15 * (b / 255.f);
px |= tmp << 8;

b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0x0000ff00) >> 8); //G
tmp = 15 * (b / 255.f);
px |= tmp << 4;

b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0x000000ff)); //B
tmp = 15 * (b / 255.f);
px |= tmp;

pPx[X] = px;

++X;
}
pPx += Pitch;
}
[]
[ここ壊れてます]

673 名前:636 mailto:sage [2021/04/25(日) 10:46:22.20 ID:sRfn5IZk.net]
pPxは、32bitの時はDWORD*で、16bitの時はWORD*になってた。
全て載せると長くなるので変更すると速度が変わる部分だけ載せたよ。
16bitの方でも>>636のダミーを入れれば遅くならないんだよね。
やっぱメモリが壊れてるのかな?

674 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:02:40.44 ID:vJWG11Gh.net]
>>651
pSrcBuf, pPx, Pitch の型、及び、それらを初期化しているコードが重要。
そこに問題があるとバッファオーバーランしている可能性が捨てきれない。

675 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:04:39.40 ID:vJWG11Gh.net]
>>653
「初期化しているコード」を載せる際、ImageWidth, ImageHeightとの
値の関係が分かるようにしてほしい。
要は、ちゃんとバッファの範囲内に読み書きが収まっているかどうかが知りたい。



676 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:19:47.09 ID:vJWG11Gh.net]
>>652
例えば、pPxの指しているメモリーブロックのバイトサイズが、
Pitch * ImageHeight * (pPx の 1 要素当りのバイト数)
以上に、pSrcBufの指しているメモリーブロックのバイトサイズが、
ImageWidth * ImageHeight * 4
以上になっていることが重要。

677 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:46:51.84 ID:vJWG11Gh.net]
そういえば、pSrcBufを((DWORD *)pSrcBuf)のようにキャストしてから使っている
ことも気になる。
pSrcBuf = new DWORD [ImageWidth * ImageHeight]
ではなく、
pSrcBuf = new BYTE [ImageWidth * ImageHeight * 4]
などとしているのだろうか。

678 名前:636 mailto:sage [2021/04/25(日) 12:16:02.68 ID:sRfn5IZk.net]
>>653-656
void *pSrcBuf;
LONG Pitch;
pPxは、16bitの時がWORD*で32bitの時がDWORD*
という感じになってた。

初期化の部分がかなり複雑で結構辿って調べる必要があるんだよね…
でも思うのは初期化は、16bitと32bit大体同じで違うのはpPxの型くらいで
それで>>650の32bitのコードだと全然遅くならないから
>>651の16bitのコードの部分自体が何か変だったのかなと思ったんだけど
ここ自体は大丈夫なのかな?

679 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:26:15.86 ID:QOuShU0Z.net]
そもそも遅くなるって何分が何分になるん?
100分が103分ならそんなもんじゃね?
としか思えないし

680 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:48:46.76 ID:sRfn5IZk.net]
>>658
それが30秒が2分とか3分とかになっちゃって。

681 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:01:13.96 ID:9Nm1id/y.net]
>>659
それだとせいぜい6倍くらいだね。
>>650>>651 だと 6倍くらいの差が出るのは当然だよ。

682 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:37:31.77 ID:sRfn5IZk.net]
>>660
いやそうじゃなくて、>>636のダミーコードを入れると
何故か速い速度になって、それを取り除くと遅くなってしまう感じ。
普通にコード書いてても関係ない部分を追加したりすると遅くなったり
速くなったりするからおかしいなと思ってて。

683 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:41:04.92 ID:9Nm1id/y.net]
>>661
なるほど。では、
>初期化の部分がかなり複雑で結構辿って調べる必要があるんだよね…
であったとしても、原因を特定するには、少なくともまずそこを丹念に
調べる必要がある。

684 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:41:34.25 ID:QOuShU0Z.net]
>>661
とりあえず遅いコードと速いコードを晒してよ
バッファーオーバーランで制御変数壊してるとかあるかも知れんし

685 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:45:29.68 ID:9Nm1id/y.net]
>>661
そういえば、速い時でも30秒もかかっていることはとても気になる。
>>650 のコードだとどれくらいの時間になるの?
経験と勘で言えば、そのような平易なコードで30秒も掛かって、
時と場合により3分もかかるという現象が起きる場合、キャッシュ
が乱れている可能性がある。
もしかして、どこかで極端にメモリーをランダムアクセスしてない?
巨大なメモリーの中を、極端に不連続な場所をあっちこっちアクセスする



686 名前:
キャッシュが聞きにくくなって、急激に遅くなることがある。
[]
[ここ壊れてます]

687 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:57:01.28 ID:sRfn5IZk.net]
>>662
確かにそこは念入りに調べる必要がありますね。
>>663
それが本当に>>636をまったく関係ない部分に入れるだけで
速くなったりしてて。普通にコード書いてまったく関係ないところ追加したりすると
速くなったり遅くなったりするんだよね。一旦速くなったら弄らない限り遅くなる事はなくて
逆に一旦遅くなったら弄らない限り速くなったりする事はない感じ。
>>664
読み込んでメモリ操作する部分自体はかなり多い数をやってるので
20〜30秒くらいかかる時もある感じ。
読み込みとメモリ操作の部分で細かくメモリ確保と解放をやってるので
それのせいもあるのかな?

688 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:04:55.13 ID:9Nm1id/y.net]
>>665
>読み込んでメモリ操作する部分自体はかなり多い数をやってるので
>20〜30秒くらいかかる時もある感じ。
話を総合すると、
>>650 のコードが、「20〜30秒くらいかかる」が、
>>651 のコードが、速い時には「30秒」
ということになるが、コードを見る限り、651のコードは650の
コードの10倍以上かかっても不思議ではないコードになっているので、
この速度差はむしろ、少な過ぎる。
むしろ、>>651のコードは「3分」かかっている方が、
長年の経験と勘では正常に思える。

689 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:13:30.56 ID:CFgRAQQ/.net]
読込とか細かいメモリー確保とかコードに無いこと言われてもエスパーじゃないのでどうしょうもないな
悪いけど情報出せないなら他でやってくれ

690 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:19:48.04 ID:sRfn5IZk.net]
>>666
今チェックしたら650の方が少し速かったですw
650が12秒くらいで、651が22秒くらいでした
これが速い場合で、651が遅い場合は2分くらいでした。
650は遅くなることがないです。

>>667
ほんとうにそうですね。
とりあえず晒した所が大丈夫なら
他の部分は自分で調べてみようと思います。

691 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:45:51.96 ID:S2tV53BX.net]
>>668
>今チェックしたら650の方が少し速かったですw
>650が12秒くらいで、651が22秒くらいでした
>これが速い場合で、651が遅い場合は2分くらいでした。
>650は遅くなることがないです。

これだけでも重要なことが分かる。以後は、処理時間に関する(数学的な)定量的な話になる。
まず、650と651の速度差が1.8倍程度しかないことからすると、
pSrcBuf と pPx の読み書きに相当時間が掛かっていることを示唆している。
650と651のソースを比較した時、計算部分の処理がとても増加しているが、
読み書きはキャッシュまで考慮すると、650と651で差が出ない。
651では、pSrcBufからは何度も読み込まれているが、最初に一回読み込まれた後はキャッシュに乗っているため、
複数回読んだからといって時間増大の原因にはなりにくい。
651では割り算や掛け算の計算量が物凄く増えているのにそれが比率にして 0.8 にしかなっていない。
(割り算や掛け算は本質的に遅いことはこの議論に置いて重要である。)
大量の割り算、掛け算に掛かっている時間が 0.8しかないのに、高々1回ずつのメモリーへの読み書きが 1.0 の時間
かかっていることに着目すると、1ピクセルあたり、データバス-CPU間の転送の観点で言って、
pSrcBufからの「一回の」読み込みとpPxへの一回の書き込みに、かなり時間が掛かっていることを意味する。
データがキャッシュに乗っていれば、ここまでの時間が掛からないので、
長年の経験と勘によれば、このような事態が起きたとき、CPUの中のすべてのキャッシュを一掃してしまっていることが多い。
だから、例えば、バックグラウンドで他のアプリが動いていたりすると、キャッシュを
復活させるために物凄く時間が掛かることがある。
それで、他のアプリがメモリーを復活させようとしたかしていないかによって、
OS全体としての処理時間が如実に変わる現象が起きることがある。
これが、今回の奇妙な現象が起きている原因かも知れない。

692 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 16:25:58.61 ID:sRfn5IZk.net]
>>669
細かい分析ありがとう。
だとしたら>>636のダミーを入れると速くなるのも
そのキャッシュの原因に何か関係してるのかな?
でも今まで>>665でも書いたように一旦遅くなったら
遅くなったままで、速くなったら速くなったままなんだよね… コード弄らない限り。
もしかすると何か条件が重なればコードを弄らなくても遅くなったり
速くなったりすることもあるのかもしれないけど。今のところは確認出来てない感じ。

693 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 16:32:43.41 ID:S2tV53BX.net]
>>670
それより、650のコードで12秒も掛かっていることにかなり違和感を覚える。
ImageWidth が、ImageHeight が 2000 位までなら、4*10^6 ピクセルくらいで、
32BIT RGBカラーだとしても16MB位。
いまのCPUだと、>>650のコードくらいで12秒も掛かるはずは無い。
大雑多な予測だと、3.0GHzのCPUで、10(ms)くらいまでのはず。
ImageWidth や ImageHeight の値はいくらくらいになってる?

694 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 17:04:17.68 ID:/0G3TNx0.net]
650は最適化で X も x も同じ値で遷移していくし内側のループは
memcpy 相当のブロック転送におきかわりそうだけど

695 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 20:18:48.31 ID:j6IXZwA/.net]
650使えば遅くならないならいったん解決?



696 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 01:18:20.13 ID:0cli3R6k.net]
>>671
大きな画像(2048*2048)とかを結構読み込んでて。
読み込み処理自体は他の部分もあるのでそのくらいになってしまってる感じ。
>>672-673
一応は650にすれば何の異常もなくとても速く動作はするんだけど
出来れば原因が知りたいと思ってて。難しいならもうあきらめるけど。

697 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 01:51:09.48 ID:u7NjNSbC.net]
>>674
ファイルから読み込んでるらしいけど、fseek をループの中で多数回使うと
使わない場合と比べて劇的に遅くなるけど、seek 系の関数は使ってない?

698 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:03:22.38 ID:+l9LtKe6.net]
ファイル読み込みの部分でHDDキャッシュがかかってるかどうかだったり
よくある話

699 名前:636 mailto:sage [2021/04/26(月) 02:36:05.57 ID:0cli3R6k.net]
色々と試行錯誤してたら
>>651のコードのこの部分を
for(int x = 0; x < ImageWidth; ++x){
このように書き換えたら普通に速くなったw
for(int x = 0; x < ImageWidth / 1.0f; ++x){

なんか最適化が効いたり効かなかったりみたいな差に感じてしまう。
そういう原因なのかな?

700 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:37:06.08 ID:u7NjNSbC.net]
>>674
2048 * 2048 ドットの画像だとベタデータにしたとき16MBになってしまうので、
それを沢山読み込むとメモリー不足になり仮想記憶が働いてしまっている可能性も
有るかも知れない。どれくらいの枚数読んでいるか知らないのでなんとも
言えないけど。

701 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:39:54.17 ID:u7NjNSbC.net]
>>677
使ってるのはVisualStudioのようだけど、速度を測定する時には、ちゃんと
Release版にして最適化は有効にしてる?
DebugPrintを使っているなら最適化はOFFになってるのでは?

702 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:43:34.12 ID:0cli3R6k.net]
>>678
でも>>677の修正で速度が劇的に変化するのはなんでなんだろう?
>>679
Releaseで調べてるよ。OutputDebugStringはReleaseモードでも使えるので。

703 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:46:30.17 ID:0cli3R6k.net]
>>677の修正をしたあと、>>636のダミーコードを
追加したらなんと今度は遅くなったwwなんでだ?w

>>636のダミーコードだけ追加したら速くなって
ダミーコードを削除すると遅くなる
その遅くなった状態で>>677の修正をすると速くなる
その速くなった状態で>>636のダミーコードを入れると
今度は遅くなるww

704 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 02:43:12.80 ID:qV+SOSDm.net]
状況から察するに、おそらく君が見ている部分じゃない
どこかに根本的な問題がある、という気がする
なんとなくだけど、バッファオーバラン系のような気がする

705 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 05:25:14.56 ID:Vf/GSwOl.net]
>>682
どこかに問題がありそうですよね。
バッファオーバラン系は問題あっても動いてしまう事があるから怖いですね。
地道に調べて行くことにします。



706 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 11:47:32.64 ID:V9b4VlmB.net]
それより、12秒間も大量のメモリーを使う状態でCPUがフル

707 名前:パワー状態になっている
とすれば、フル・キャッシュ汚染してる可能性がある。
フル・キャッシュ汚染すると、その後しばらくの間、キャッシュを取り戻すために
速度が不安定になるから、説明可能。
[]
[ここ壊れてます]

708 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 12:52:21.01 ID:cPrICHbO.net]
Meltdowm や Spector 対策のパッチの影響とか?
特定のパターンのメモリアクセスに対して例えばなんかのトラップが働いてキャッシュをクリアし、ダミーコード入れるとそのパターンが崩れてそういう処理が入らないとか。

709 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 02:54:54.42 ID:XgRH6ChF.net]
>>684-685
みなさんありがとうございます。
色々な問題が考えられそうですね。参考になります。
もう少しコード弄りながら挙動を調べて行きたいと思います。

710 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 04:32:07.96 ID:v8E9sca8.net]
>>686
なお、y方向に関して、メモリーを上下逆さまに読んでいっているところがあるが、
本当はそういうのはDDR-Memoryやキャッシュと余り相性が良くない。
しょうがないけれども。
それでも、x方向には「順方向」に読んでいるからまだなんとかなっている。
完全にメモリーを逆方向に読んだりすると、低速化の原因になる。
この場合には難しいが、なるべくならメモリーは順方向にアクセスした方が
速くなる。DDR-MemoryはBurst転送が基本なので。
キャッシュに乗っていれば、逆方向でもなんとかなるが、キャッシュから
外れると、DDR-MemoryのBurst転送とは逆方向にアクセスするのは
速度低下の原因になる可能性が出てくる。絶対ではないが。

711 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 10:42:03.12 ID:XgRH6ChF.net]
>>687
そういう問題もあるんですね。とても詳しくて勉強になります。
ありがとうございます!

712 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 11:32:29.48 ID:oswWyFbg.net]
>>687
読み書き方向が逆になるなら、読む方を順方向にすると良さそうだと思うけどどう思う?

713 名前:デフォルトの名無しさん [2021/04/28(水) 13:14:16.90 ID:WdoV9Bq9.net]
>>689
コンパイラのくせに生意気だぞ

714 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 13:16:59.82 ID:jQpDsyge.net]
>>689
実は昨日の夜から、俺もそう思ってた。
今は、
読む方が逆方向で、書く方が順方向になってしまっているが
読む方を順方向に、書く方を逆方向にした方が DDR-SDRAM や キャッシュの
仕組みから行って速くなる可能性が高い。

715 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 14:04:09.00 ID:4fcF+gv5.net]
Windows の bitmap で ファイル中の配置や CreateDIBSection() で戻ってくるメモリの配置だな
デフォで bottom - up の方向 カメラのフレームとかは top - down な方向

ん?メモリ操作なコードだけど実はメモリマップドファイルだったりして



716 名前:デフォルトの名無しさん [2021/04/28(水) 15:30:36.23 ID:WdoV9Bq9.net]
走査線と描画が重なったらチラツキが激しくなるから下から描いていくんだよ

717 名前:デフォルトの名無しさん [2021/06/14(月) 15:32:51.34 ID:TE2ntQhj.net]
for(int a=0; ...; ...){...} とかはループ内だけのスコープで int a が使えるのに

int a;
while(a){...}
とか
int a;
do{...}while(a);
とかは
while(int a=...){...} ←これだけはOK?
とか
do{...}while(int a=...);
とか
do{int a; ...}while(a);
みたいに書けないのはなぜ?

718 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 15:40:36.46 ID:peg/OyGg.net]
do{...}while(int a=...);  宣言より前に変数を使用する
do{int a; ...}while(a);  スコープの外に変数を持ち出す

719 名前:はちみつ餃子 mailto:sage [2021/06/14(月) 17:56:57.54 ID:fvxG9/iR.net]
>>694
C/C++ の理屈では波括弧の部分は繰り返しの構文 (do や while) の一部ではない。
たとえば while の文法は
while ( expression ) statement
というように定義されていて、 statement ってのは要するに文をひとつ書けるってことね。
で、 statement として複文 (波括弧によって複数の文をひとつにまとめたブロック) もありうるってことになってる。
そんでもってブロックの先頭で宣言された変数のスコープに関するルールはブロックのほうに書かれていて、
繰り返しの構文のときだけ特別扱いということは出来んのだわ。

> while(int a=...){...} ←これだけはOK?

これは C++ では良いけど C では駄目

720 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 18:58:23.47 ID:HtMoZ8Hn.net]
小さいスコープの中だけで使う自動変数だってんで
特に if や for 等なく いきなりカラス括弧開いて変数宣言することがままある

721 名前:デフォルトの名無しさん [2021/06/14(月) 21:48:16.36 ID:OzvaLd6A.net]
C++ってOSレイヤで差異が有るファイルシステムの事を考慮せずにプログラムを書ける済む仕組みって組み込まれてるの?

722 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 21:53:52.73 ID:VOy4fGQR.net]
標準ライブラリに含まれるファイルシステムライブラリでできる範囲の操作なら差異は出にくいと思うけど

723 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 22:00:33.63 ID:eQ9/Z+Eb.net]
>>694,696
C++でもwhileの判定式中の宣言は毎回新しくなるんで、使いみち思いつかん。
while(int i=10) { i--; } は、無限ループになる。

できるとしたら、処理が終わったらすぐに始末したいobjに対して、
{ myclass obj(); while(obj) { obj.some_op(); } }
(obj は operator bool() とか実装してる前提)
が、
while(auto obj = myclass()) { obj.some_op(); }
こんな風にかけてちょっと{}がスッキリするくらい?(実際はobjが毎度構築される)

724 名前:デフォルトの名無しさん [2021/06/14(月) 23:04:55.36 ID:wv1U8ajF.net]
カラス括弧!
初めて見た!

725 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 08:13:38.32 ID:4rRZmg7L.net]
>>700
まあ while(...){} は for(; ...;){} で書けるしメリットないかな
ただ
do{ int a = …; }while(a); の方は書けたら嬉しいな
使用頻度は低いけど



726 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 10:57:08.11 ID:5dh+WKsO.net]
do は do .. while(0) のパターンしか使わないな。

727 名前:デフォルトの名無しさん mailto:sage [2021/06/17(木) 23:23:03.28 ID:Gx3mnqFH.net]
break用なら switch(0)default:{...} っしょ?

728 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 08:43:02.57 ID:R4m5mk7U.net]
それdoよりどういうメリットある?
わざわざdefault:書かないとならないしインデント深くなりそうだし。

729 名前:デフォルトの名無しさん [2021/06/18(金) 11:21:27.64 ID:FZUuAAIq.net]
マクロで展開するならインデントは無視できる

730 名前:デフォルトの名無しさん [2021/06/18(金) 11:50:10.76 ID:7Huy+AZL.net]
do{}while(0) は最後に ; 書く前提だし矛盾ないけど
switch(0)default:{...} は ; の扱いの困らない?

731 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 11:55:35.37 ID:AVf6Ht59.net]
for (int i = 0; i < 1; i++)

732 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 12:32:57.03 ID:6AzE04jr.net]
{ } 内スコープからの脱出で break; 使いたいってのと
マクロで見た目関数向けな #define foo(arg) do { なんちゃらかんちゃら } while(0)

do { } while(0) は両立できるけど switch(0)default:{} で後者は怪しげ

if (<condition>) foo(arg); else <elsecase>; とかが

733 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 13:25:48.49 ID:7Huy+AZL.net]
while(1){
...
break; // } の直前
}
で良いと思う

734 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 14:27:23.16 ID:tn5JYHw4.net]
それどういう意図があんの?
処理は結局1回
スコープだけじゃダメなん?

735 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 14:44:41.04 ID:tzOvIsZE.net]
>>710
お前が良いと思うなら使えばいいと思うが俺には無駄なbreakが必要なのはダ



736 名前:Tいと思うから do { ... } while(0); にするわ []
[ここ壊れてます]

737 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 20:29:59.97 ID:R4m5mk7U.net]
>>706
マクロはフォーマッタでの扱いが定まらんから制御構造では使いたくないのよな。
セミコロンで終端しておかないとインデントがおかしくなるとか、後続に開きブレースを置くと
やっぱりインデントが変になるとか。






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

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

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