エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/
探検
【初心者歓迎】C/C++室 Ver.106【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
2020/07/13(月) 13:51:48.09ID:WBkWHxcT
632デフォルトの名無しさん
2021/04/24(土) 08:36:31.23ID:LUJ0Utr0 >>631
Lib自体は作れるし、アンマネージクラスなら公開もできるんですが、マネージクラスだと参照側でメンバーが参照できず、LNK2020が発生してしまうんですよね。
ビルドオプションでなんとかできるものなのかな、と。
Lib自体は作れるし、アンマネージクラスなら公開もできるんですが、マネージクラスだと参照側でメンバーが参照できず、LNK2020が発生してしまうんですよね。
ビルドオプションでなんとかできるものなのかな、と。
633デフォルトの名無しさん
2021/04/24(土) 09:53:24.75ID:K4uxnQki LNK2020ってそれnativeのC++からリンクしようとしてる?
634デフォルトの名無しさん
2021/04/24(土) 14:56:57.93ID:LUJ0Utr0 >>633
libなのでクライアントはC++です
libなのでクライアントはC++です
635デフォルトの名無しさん
2021/04/24(土) 15:16:56.42ID:K4uxnQki そりゃ無理。その仲立ちをするためにC++/CLIがあるのに。
一応nativeのC++からでも自分でCLRを立ち上げたりしてマネージドクラスにアクセスする方法は
あるらしいが、リンクしてそのまま呼ぶという形にはならない。
一応nativeのC++からでも自分でCLRを立ち上げたりしてマネージドクラスにアクセスする方法は
あるらしいが、リンクしてそのまま呼ぶという形にはならない。
636デフォルトの名無しさん
2021/04/24(土) 15:41:46.62ID:at4cvaWV 自作のプログラム、起動時の読み込み処理の前に以下を入れると
for(int i = 0; i < 100; ++i){
OutputDebugString("dummy!!!!\n");
}
起動時に行っている外部データの読み込みが凄く速くて
これを無くすと凄く遅くなるんですが怖い…
3分くらい違いが出るので明らかにおかしい
どっかでメモリでもぶっ壊れてますかね?
どういう理由が考えられるでしょうか?
for(int i = 0; i < 100; ++i){
OutputDebugString("dummy!!!!\n");
}
起動時に行っている外部データの読み込みが凄く速くて
これを無くすと凄く遅くなるんですが怖い…
3分くらい違いが出るので明らかにおかしい
どっかでメモリでもぶっ壊れてますかね?
どういう理由が考えられるでしょうか?
637636
2021/04/24(土) 15:43:36.70ID:at4cvaWV さっきのダミーを入れなくても
普通にコードを追加したりしてても遅くなったり速くなったりする
別に読み込み処理の部分とは関係ないところでも。
なんでだろう?
普通にコードを追加したりしてても遅くなったり速くなったりする
別に読み込み処理の部分とは関係ないところでも。
なんでだろう?
638デフォルトの名無しさん
2021/04/24(土) 15:54:20.61ID:hc4SaSPr639デフォルトの名無しさん
2021/04/24(土) 16:03:17.28ID:lkpB631F コンパイラはほんと何してるのか分からんから、問題の部分だけ切り出したのを.sへ吐かせて読みなさい
10行程度のcコードなら、edxとか変な名前のは取り敢えず変数だなって思って追えば、アセンブリ知らずとも大体分かるよ
10行程度のcコードなら、edxとか変な名前のは取り敢えず変数だなって思って追えば、アセンブリ知らずとも大体分かるよ
640デフォルトの名無しさん
2021/04/24(土) 20:39:49.92ID:LUJ0Utr0 >>635
いや、
C++ライブラリ内にマネージクラスを作って
マネージのC++プロジェクトから
呼び出したいだけ
DLLだったら、C#のDLLからマネージクラスを呼び出すのと
理屈上同じだからできそうな気がするのだけれど
以前実装した時はInterfaceだけ公開して
呼び出されるとそのインスタンスを返す、みたいなことをしたんだけれど
いや、
C++ライブラリ内にマネージクラスを作って
マネージのC++プロジェクトから
呼び出したいだけ
DLLだったら、C#のDLLからマネージクラスを呼び出すのと
理屈上同じだからできそうな気がするのだけれど
以前実装した時はInterfaceだけ公開して
呼び出されるとそのインスタンスを返す、みたいなことをしたんだけれど
641デフォルトの名無しさん
2021/04/24(土) 21:31:19.65ID:+v1plSJo642デフォルトの名無しさん
2021/04/25(日) 00:05:51.07ID:Oojm0ZzH >>641
結局そういうことだよね
なんか普通にlibのクラスを呼び出せますみたいなのをサンプル付きで出してた記事があってさ…。
まあstaticメソッドしかないクラスばかりだから、アンマネージクラスで公開するか、namespaceでまとめます。
ありがとうございました。
結局そういうことだよね
なんか普通にlibのクラスを呼び出せますみたいなのをサンプル付きで出してた記事があってさ…。
まあstaticメソッドしかないクラスばかりだから、アンマネージクラスで公開するか、namespaceでまとめます。
ありがとうございました。
643636
2021/04/25(日) 00:07:18.69ID:sRfn5IZk644デフォルトの名無しさん
2021/04/25(日) 03:40:15.50ID:vJWG11Gh645デフォルトの名無しさん
2021/04/25(日) 03:43:25.25ID:vJWG11Gh646デフォルトの名無しさん
2021/04/25(日) 03:49:56.55ID:vJWG11Gh >>645
もし、他のアプリやファイルマネージャーも遅くなることがあるなら、
CrystalDiskInfoなどで診断してみて欲しい。
そのアプリだけ遅くなるが、アプリの動作は正常、というなら、
メモリーやスレッドやOSリソースの使いすぎなども考えられなくは無いが。
何か極端に変わったことしてたりしない?
もし、他のアプリやファイルマネージャーも遅くなることがあるなら、
CrystalDiskInfoなどで診断してみて欲しい。
そのアプリだけ遅くなるが、アプリの動作は正常、というなら、
メモリーやスレッドやOSリソースの使いすぎなども考えられなくは無いが。
何か極端に変わったことしてたりしない?
647デフォルトの名無しさん
2021/04/25(日) 09:07:00.47ID:x26Nnfhp OutPutDegugなんちゃらの関数がファイル出力してるなら、単純にそのドライブのアクセス準備が整ってないとか。
以前、SSDに同じファイル名で一時ファイルの作成と削除を繰り返したら、SSDの仕組み上めっちゃ遅くなったことがある。
以前、SSDに同じファイル名で一時ファイルの作成と削除を繰り返したら、SSDの仕組み上めっちゃ遅くなったことがある。
648デフォルトの名無しさん
2021/04/25(日) 09:59:46.07ID:j6IXZwA/649636
2021/04/25(日) 10:38:16.68ID:sRfn5IZk >>645-647
遅くなる原因の個所が分かった!
画像を読み込む時にメモリを操作して
16bitで読み込む部分があるんだけど
これを32bitで読み込むようにすると
どんなコードでもまったく遅くならない。
メモリの操作の部分がおかしかったみたい。
自分で書いたコードじゃないのでよくわからない。
32bitのやつと16bitのやつを載せるのでおかしい所あったら教えて。
遅くなる原因の個所が分かった!
画像を読み込む時にメモリを操作して
16bitで読み込む部分があるんだけど
これを32bitで読み込むようにすると
どんなコードでもまったく遅くならない。
メモリの操作の部分がおかしかったみたい。
自分で書いたコードじゃないのでよくわからない。
32bitのやつと16bitのやつを載せるのでおかしい所あったら教えて。
650636
2021/04/25(日) 10:39:18.00ID:sRfn5IZk これは遅くならないコード
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;
}
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;
}
651636
2021/04/25(日) 10:42:37.48ID:sRfn5IZk これが遅くなる場合があるコード
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;
}
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;
}
652636
2021/04/25(日) 10:46:22.20ID:sRfn5IZk pPxは、32bitの時はDWORD*で、16bitの時はWORD*になってた。
全て載せると長くなるので変更すると速度が変わる部分だけ載せたよ。
16bitの方でも>>636のダミーを入れれば遅くならないんだよね。
やっぱメモリが壊れてるのかな?
全て載せると長くなるので変更すると速度が変わる部分だけ載せたよ。
16bitの方でも>>636のダミーを入れれば遅くならないんだよね。
やっぱメモリが壊れてるのかな?
653デフォルトの名無しさん
2021/04/25(日) 11:02:40.44ID:vJWG11Gh654デフォルトの名無しさん
2021/04/25(日) 11:04:39.40ID:vJWG11Gh >>653
「初期化しているコード」を載せる際、ImageWidth, ImageHeightとの
値の関係が分かるようにしてほしい。
要は、ちゃんとバッファの範囲内に読み書きが収まっているかどうかが知りたい。
「初期化しているコード」を載せる際、ImageWidth, ImageHeightとの
値の関係が分かるようにしてほしい。
要は、ちゃんとバッファの範囲内に読み書きが収まっているかどうかが知りたい。
655デフォルトの名無しさん
2021/04/25(日) 11:19:47.09ID:vJWG11Gh >>652
例えば、pPxの指しているメモリーブロックのバイトサイズが、
Pitch * ImageHeight * (pPx の 1 要素当りのバイト数)
以上に、pSrcBufの指しているメモリーブロックのバイトサイズが、
ImageWidth * ImageHeight * 4
以上になっていることが重要。
例えば、pPxの指しているメモリーブロックのバイトサイズが、
Pitch * ImageHeight * (pPx の 1 要素当りのバイト数)
以上に、pSrcBufの指しているメモリーブロックのバイトサイズが、
ImageWidth * ImageHeight * 4
以上になっていることが重要。
656デフォルトの名無しさん
2021/04/25(日) 11:46:51.84ID:vJWG11Gh そういえば、pSrcBufを((DWORD *)pSrcBuf)のようにキャストしてから使っている
ことも気になる。
pSrcBuf = new DWORD [ImageWidth * ImageHeight]
ではなく、
pSrcBuf = new BYTE [ImageWidth * ImageHeight * 4]
などとしているのだろうか。
ことも気になる。
pSrcBuf = new DWORD [ImageWidth * ImageHeight]
ではなく、
pSrcBuf = new BYTE [ImageWidth * ImageHeight * 4]
などとしているのだろうか。
657636
2021/04/25(日) 12:16:02.68ID:sRfn5IZk658デフォルトの名無しさん
2021/04/25(日) 13:26:15.86ID:QOuShU0Z そもそも遅くなるって何分が何分になるん?
100分が103分ならそんなもんじゃね?
としか思えないし
100分が103分ならそんなもんじゃね?
としか思えないし
659デフォルトの名無しさん
2021/04/25(日) 13:48:46.76ID:sRfn5IZk >>658
それが30秒が2分とか3分とかになっちゃって。
それが30秒が2分とか3分とかになっちゃって。
660デフォルトの名無しさん
2021/04/25(日) 14:01:13.96ID:9Nm1id/y661デフォルトの名無しさん
2021/04/25(日) 14:37:31.77ID:sRfn5IZk662デフォルトの名無しさん
2021/04/25(日) 14:41:04.92ID:9Nm1id/y663デフォルトの名無しさん
2021/04/25(日) 14:41:34.25ID:QOuShU0Z664デフォルトの名無しさん
2021/04/25(日) 14:45:29.68ID:9Nm1id/y665デフォルトの名無しさん
2021/04/25(日) 14:57:01.28ID:sRfn5IZk666デフォルトの名無しさん
2021/04/25(日) 15:04:55.13ID:9Nm1id/y667デフォルトの名無しさん
2021/04/25(日) 15:13:30.56ID:CFgRAQQ/ 読込とか細かいメモリー確保とかコードに無いこと言われてもエスパーじゃないのでどうしょうもないな
悪いけど情報出せないなら他でやってくれ
悪いけど情報出せないなら他でやってくれ
668デフォルトの名無しさん
2021/04/25(日) 15:19:48.04ID:sRfn5IZk669デフォルトの名無しさん
2021/04/25(日) 15:45:51.96ID:S2tV53BX >>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全体としての処理時間が如実に変わる現象が起きることがある。
これが、今回の奇妙な現象が起きている原因かも知れない。
>今チェックしたら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全体としての処理時間が如実に変わる現象が起きることがある。
これが、今回の奇妙な現象が起きている原因かも知れない。
670デフォルトの名無しさん
2021/04/25(日) 16:25:58.61ID:sRfn5IZk671デフォルトの名無しさん
2021/04/25(日) 16:32:43.41ID:S2tV53BX672デフォルトの名無しさん
2021/04/25(日) 17:04:17.68ID:/0G3TNx0 650は最適化で X も x も同じ値で遷移していくし内側のループは
memcpy 相当のブロック転送におきかわりそうだけど
memcpy 相当のブロック転送におきかわりそうだけど
673デフォルトの名無しさん
2021/04/25(日) 20:18:48.31ID:j6IXZwA/ 650使えば遅くならないならいったん解決?
674デフォルトの名無しさん
2021/04/26(月) 01:18:20.13ID:0cli3R6k675デフォルトの名無しさん
2021/04/26(月) 01:51:09.48ID:u7NjNSbC676デフォルトの名無しさん
2021/04/26(月) 02:03:22.38ID:+l9LtKe6 ファイル読み込みの部分でHDDキャッシュがかかってるかどうかだったり
よくある話
よくある話
677636
2021/04/26(月) 02:36:05.57ID:0cli3R6k 色々と試行錯誤してたら
>>651のコードのこの部分を
for(int x = 0; x < ImageWidth; ++x){
このように書き換えたら普通に速くなったw
for(int x = 0; x < ImageWidth / 1.0f; ++x){
なんか最適化が効いたり効かなかったりみたいな差に感じてしまう。
そういう原因なのかな?
>>651のコードのこの部分を
for(int x = 0; x < ImageWidth; ++x){
このように書き換えたら普通に速くなったw
for(int x = 0; x < ImageWidth / 1.0f; ++x){
なんか最適化が効いたり効かなかったりみたいな差に感じてしまう。
そういう原因なのかな?
678デフォルトの名無しさん
2021/04/26(月) 02:37:06.08ID:u7NjNSbC >>674
2048 * 2048 ドットの画像だとベタデータにしたとき16MBになってしまうので、
それを沢山読み込むとメモリー不足になり仮想記憶が働いてしまっている可能性も
有るかも知れない。どれくらいの枚数読んでいるか知らないのでなんとも
言えないけど。
2048 * 2048 ドットの画像だとベタデータにしたとき16MBになってしまうので、
それを沢山読み込むとメモリー不足になり仮想記憶が働いてしまっている可能性も
有るかも知れない。どれくらいの枚数読んでいるか知らないのでなんとも
言えないけど。
679デフォルトの名無しさん
2021/04/26(月) 02:39:54.17ID:u7NjNSbC >>677
使ってるのはVisualStudioのようだけど、速度を測定する時には、ちゃんと
Release版にして最適化は有効にしてる?
DebugPrintを使っているなら最適化はOFFになってるのでは?
使ってるのはVisualStudioのようだけど、速度を測定する時には、ちゃんと
Release版にして最適化は有効にしてる?
DebugPrintを使っているなら最適化はOFFになってるのでは?
680デフォルトの名無しさん
2021/04/26(月) 02:43:34.12ID:0cli3R6k681デフォルトの名無しさん
2021/04/26(月) 02:46:30.17ID:0cli3R6k682デフォルトの名無しさん
2021/04/27(火) 02:43:12.80ID:qV+SOSDm 状況から察するに、おそらく君が見ている部分じゃない
どこかに根本的な問題がある、という気がする
なんとなくだけど、バッファオーバラン系のような気がする
どこかに根本的な問題がある、という気がする
なんとなくだけど、バッファオーバラン系のような気がする
683デフォルトの名無しさん
2021/04/27(火) 05:25:14.56ID:Vf/GSwOl684デフォルトの名無しさん
2021/04/27(火) 11:47:32.64ID:V9b4VlmB それより、12秒間も大量のメモリーを使う状態でCPUがフルパワー状態になっている
とすれば、フル・キャッシュ汚染してる可能性がある。
フル・キャッシュ汚染すると、その後しばらくの間、キャッシュを取り戻すために
速度が不安定になるから、説明可能。
とすれば、フル・キャッシュ汚染してる可能性がある。
フル・キャッシュ汚染すると、その後しばらくの間、キャッシュを取り戻すために
速度が不安定になるから、説明可能。
685デフォルトの名無しさん
2021/04/27(火) 12:52:21.01ID:cPrICHbO Meltdowm や Spector 対策のパッチの影響とか?
特定のパターンのメモリアクセスに対して例えばなんかのトラップが働いてキャッシュをクリアし、ダミーコード入れるとそのパターンが崩れてそういう処理が入らないとか。
特定のパターンのメモリアクセスに対して例えばなんかのトラップが働いてキャッシュをクリアし、ダミーコード入れるとそのパターンが崩れてそういう処理が入らないとか。
686デフォルトの名無しさん
2021/04/28(水) 02:54:54.42ID:XgRH6ChF687デフォルトの名無しさん
2021/04/28(水) 04:32:07.96ID:v8E9sca8 >>686
なお、y方向に関して、メモリーを上下逆さまに読んでいっているところがあるが、
本当はそういうのはDDR-Memoryやキャッシュと余り相性が良くない。
しょうがないけれども。
それでも、x方向には「順方向」に読んでいるからまだなんとかなっている。
完全にメモリーを逆方向に読んだりすると、低速化の原因になる。
この場合には難しいが、なるべくならメモリーは順方向にアクセスした方が
速くなる。DDR-MemoryはBurst転送が基本なので。
キャッシュに乗っていれば、逆方向でもなんとかなるが、キャッシュから
外れると、DDR-MemoryのBurst転送とは逆方向にアクセスするのは
速度低下の原因になる可能性が出てくる。絶対ではないが。
なお、y方向に関して、メモリーを上下逆さまに読んでいっているところがあるが、
本当はそういうのはDDR-Memoryやキャッシュと余り相性が良くない。
しょうがないけれども。
それでも、x方向には「順方向」に読んでいるからまだなんとかなっている。
完全にメモリーを逆方向に読んだりすると、低速化の原因になる。
この場合には難しいが、なるべくならメモリーは順方向にアクセスした方が
速くなる。DDR-MemoryはBurst転送が基本なので。
キャッシュに乗っていれば、逆方向でもなんとかなるが、キャッシュから
外れると、DDR-MemoryのBurst転送とは逆方向にアクセスするのは
速度低下の原因になる可能性が出てくる。絶対ではないが。
688デフォルトの名無しさん
2021/04/28(水) 10:42:03.12ID:XgRH6ChF689デフォルトの名無しさん
2021/04/28(水) 11:32:29.48ID:oswWyFbg >>687
読み書き方向が逆になるなら、読む方を順方向にすると良さそうだと思うけどどう思う?
読み書き方向が逆になるなら、読む方を順方向にすると良さそうだと思うけどどう思う?
690デフォルトの名無しさん
2021/04/28(水) 13:14:16.90ID:WdoV9Bq9 >>689
コンパイラのくせに生意気だぞ
コンパイラのくせに生意気だぞ
691デフォルトの名無しさん
2021/04/28(水) 13:16:59.82ID:jQpDsyge >>689
実は昨日の夜から、俺もそう思ってた。
今は、
読む方が逆方向で、書く方が順方向になってしまっているが
読む方を順方向に、書く方を逆方向にした方が DDR-SDRAM や キャッシュの
仕組みから行って速くなる可能性が高い。
実は昨日の夜から、俺もそう思ってた。
今は、
読む方が逆方向で、書く方が順方向になってしまっているが
読む方を順方向に、書く方を逆方向にした方が DDR-SDRAM や キャッシュの
仕組みから行って速くなる可能性が高い。
692デフォルトの名無しさん
2021/04/28(水) 14:04:09.00ID:4fcF+gv5 Windows の bitmap で ファイル中の配置や CreateDIBSection() で戻ってくるメモリの配置だな
デフォで bottom - up の方向 カメラのフレームとかは top - down な方向
ん?メモリ操作なコードだけど実はメモリマップドファイルだったりして
デフォで bottom - up の方向 カメラのフレームとかは top - down な方向
ん?メモリ操作なコードだけど実はメモリマップドファイルだったりして
693デフォルトの名無しさん
2021/04/28(水) 15:30:36.23ID:WdoV9Bq9 走査線と描画が重なったらチラツキが激しくなるから下から描いていくんだよ
694デフォルトの名無しさん
2021/06/14(月) 15:32:51.34ID:TE2ntQhj 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);
みたいに書けないのはなぜ?
int a;
while(a){...}
とか
int a;
do{...}while(a);
とかは
while(int a=...){...} ←これだけはOK?
とか
do{...}while(int a=...);
とか
do{int a; ...}while(a);
みたいに書けないのはなぜ?
695デフォルトの名無しさん
2021/06/14(月) 15:40:36.46ID:peg/OyGg do{...}while(int a=...); 宣言より前に変数を使用する
do{int a; ...}while(a); スコープの外に変数を持ち出す
do{int a; ...}while(a); スコープの外に変数を持ち出す
696はちみつ餃子 ◆8X2XSCHEME
2021/06/14(月) 17:56:57.54ID:fvxG9/iR >>694
C/C++ の理屈では波括弧の部分は繰り返しの構文 (do や while) の一部ではない。
たとえば while の文法は
while ( expression ) statement
というように定義されていて、 statement ってのは要するに文をひとつ書けるってことね。
で、 statement として複文 (波括弧によって複数の文をひとつにまとめたブロック) もありうるってことになってる。
そんでもってブロックの先頭で宣言された変数のスコープに関するルールはブロックのほうに書かれていて、
繰り返しの構文のときだけ特別扱いということは出来んのだわ。
> while(int a=...){...} ←これだけはOK?
これは C++ では良いけど C では駄目
C/C++ の理屈では波括弧の部分は繰り返しの構文 (do や while) の一部ではない。
たとえば while の文法は
while ( expression ) statement
というように定義されていて、 statement ってのは要するに文をひとつ書けるってことね。
で、 statement として複文 (波括弧によって複数の文をひとつにまとめたブロック) もありうるってことになってる。
そんでもってブロックの先頭で宣言された変数のスコープに関するルールはブロックのほうに書かれていて、
繰り返しの構文のときだけ特別扱いということは出来んのだわ。
> while(int a=...){...} ←これだけはOK?
これは C++ では良いけど C では駄目
697デフォルトの名無しさん
2021/06/14(月) 18:58:23.47ID:HtMoZ8Hn 小さいスコープの中だけで使う自動変数だってんで
特に if や for 等なく いきなりカラス括弧開いて変数宣言することがままある
特に if や for 等なく いきなりカラス括弧開いて変数宣言することがままある
698デフォルトの名無しさん
2021/06/14(月) 21:48:16.36ID:OzvaLd6A C++ってOSレイヤで差異が有るファイルシステムの事を考慮せずにプログラムを書ける済む仕組みって組み込まれてるの?
699デフォルトの名無しさん
2021/06/14(月) 21:53:52.73ID:VOy4fGQR 標準ライブラリに含まれるファイルシステムライブラリでできる範囲の操作なら差異は出にくいと思うけど
700デフォルトの名無しさん
2021/06/14(月) 22:00:33.63ID:eQ9/Z+Eb >>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が毎度構築される)
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が毎度構築される)
701デフォルトの名無しさん
2021/06/14(月) 23:04:55.36ID:wv1U8ajF カラス括弧!
初めて見た!
初めて見た!
702デフォルトの名無しさん
2021/06/15(火) 08:13:38.32ID:4rRZmg7L >>700
まあ while(...){} は for(; ...;){} で書けるしメリットないかな
ただ
do{ int a = …; }while(a); の方は書けたら嬉しいな
使用頻度は低いけど
まあ while(...){} は for(; ...;){} で書けるしメリットないかな
ただ
do{ int a = …; }while(a); の方は書けたら嬉しいな
使用頻度は低いけど
703デフォルトの名無しさん
2021/06/15(火) 10:57:08.11ID:5dh+WKsO do は do .. while(0) のパターンしか使わないな。
704デフォルトの名無しさん
2021/06/17(木) 23:23:03.28ID:Gx3mnqFH break用なら switch(0)default:{...} っしょ?
705デフォルトの名無しさん
2021/06/18(金) 08:43:02.57ID:R4m5mk7U それdoよりどういうメリットある?
わざわざdefault:書かないとならないしインデント深くなりそうだし。
わざわざdefault:書かないとならないしインデント深くなりそうだし。
706デフォルトの名無しさん
2021/06/18(金) 11:21:27.64ID:FZUuAAIq マクロで展開するならインデントは無視できる
707デフォルトの名無しさん
2021/06/18(金) 11:50:10.76ID:7Huy+AZL do{}while(0) は最後に ; 書く前提だし矛盾ないけど
switch(0)default:{...} は ; の扱いの困らない?
switch(0)default:{...} は ; の扱いの困らない?
708デフォルトの名無しさん
2021/06/18(金) 11:55:35.37ID:AVf6Ht59 for (int i = 0; i < 1; i++)
709デフォルトの名無しさん
2021/06/18(金) 12:32:57.03ID:6AzE04jr { } 内スコープからの脱出で break; 使いたいってのと
マクロで見た目関数向けな #define foo(arg) do { なんちゃらかんちゃら } while(0)
do { } while(0) は両立できるけど switch(0)default:{} で後者は怪しげ
if (<condition>) foo(arg); else <elsecase>; とかが
マクロで見た目関数向けな #define foo(arg) do { なんちゃらかんちゃら } while(0)
do { } while(0) は両立できるけど switch(0)default:{} で後者は怪しげ
if (<condition>) foo(arg); else <elsecase>; とかが
710デフォルトの名無しさん
2021/06/18(金) 13:25:48.49ID:7Huy+AZL while(1){
...
break; // } の直前
}
で良いと思う
...
break; // } の直前
}
で良いと思う
711デフォルトの名無しさん
2021/06/18(金) 14:27:23.16ID:tn5JYHw4 それどういう意図があんの?
処理は結局1回
スコープだけじゃダメなん?
処理は結局1回
スコープだけじゃダメなん?
712デフォルトの名無しさん
2021/06/18(金) 14:44:41.04ID:tzOvIsZE >>710
お前が良いと思うなら使えばいいと思うが俺には無駄なbreakが必要なのはダサいと思うから do { ... } while(0); にするわ
お前が良いと思うなら使えばいいと思うが俺には無駄なbreakが必要なのはダサいと思うから do { ... } while(0); にするわ
713デフォルトの名無しさん
2021/06/18(金) 20:29:59.97ID:R4m5mk7U >>706
マクロはフォーマッタでの扱いが定まらんから制御構造では使いたくないのよな。
セミコロンで終端しておかないとインデントがおかしくなるとか、後続に開きブレースを置くと
やっぱりインデントが変になるとか。
マクロはフォーマッタでの扱いが定まらんから制御構造では使いたくないのよな。
セミコロンで終端しておかないとインデントがおかしくなるとか、後続に開きブレースを置くと
やっぱりインデントが変になるとか。
714デフォルトの名無しさん
2021/06/19(土) 12:53:56.96ID:EDF+B3Dq #define breakblock switch(0)defalut:
でいいやん
できないとか怪しげとか意味不明
マクロ化する必然性がそもそもわかんないけど
でいいやん
できないとか怪しげとか意味不明
マクロ化する必然性がそもそもわかんないけど
715デフォルトの名無しさん
2021/06/19(土) 13:08:34.87ID:AhXAE8oj そこまでして switch(0) 使う理由がよくわからん。
do while(0) と比べてどういうところが良いの?
do while(0) と比べてどういうところが良いの?
716デフォルトの名無しさん
2021/06/19(土) 13:21:09.67ID:ylfkd6bV マクロの例でもわかるように波括弧を単独で使える
変な処理が始まってんの一目瞭然
continueもgotoで(goto使わない別ルーチン探せよw
等
#define breakblock(a) uniqelonglongprefix##a:switch(0)default:
#define bbcontinue(a) goto uniqlonglongprefix##a
変な処理が始まってんの一目瞭然
continueもgotoで(goto使わない別ルーチン探せよw
等
#define breakblock(a) uniqelonglongprefix##a:switch(0)default:
#define bbcontinue(a) goto uniqlonglongprefix##a
717デフォルトの名無しさん
2021/06/19(土) 14:04:38.18ID:AhXAE8oj >マクロの例でもわかるように波括弧を単独で使える
ようは末尾に while(0); を書かなきゃならないのが嫌ってことかな。
わからんでもないが、自分はマクロや default: より気にならないからいいや。
ようは末尾に while(0); を書かなきゃならないのが嫌ってことかな。
わからんでもないが、自分はマクロや default: より気にならないからいいや。
718デフォルトの名無しさん
2021/06/19(土) 16:30:22.52ID:8gjebq3e #define foo(arg) switch(0)default:{ なんとかかんとか }
これはキモイ
これはキモイ
719デフォルトの名無しさん
2021/06/20(日) 18:26:02.94ID:3hmKhJNO でもその構文はdefineで置き換え前提で使ってるとしか思えない
720デフォルトの名無しさん
2021/06/20(日) 19:15:11.97ID:XoXh1cqB goto書くと死んじゃう人は大変だなぁ
Dijkstraもそこまでは言ってないらしいぞ
Dijkstraもそこまでは言ってないらしいぞ
721デフォルトの名無しさん
2021/06/20(日) 22:56:11.58ID:R7oo70Ox ナンチャラカンチャラの人のdefine使用意図が無意味すぎてどうもc言語エアプなんじゃないかと疑う
722デフォルトの名無しさん
2021/06/21(月) 16:42:57.66ID:iJjBc6fp switchのやつは最後にbreakかfall throughってコメント書いとかないと文句言うチェッカとかありそう
723デフォルトの名無しさん
2021/06/29(火) 11:07:55.25ID:HA4DrIsJ do {
int a;
:
} while(a);
↓
for(int a;;) {
:
if(!a) break;
}
でいいんじゃない?
int a;
:
} while(a);
↓
for(int a;;) {
:
if(!a) break;
}
でいいんじゃない?
724デフォルトの名無しさん
2021/07/05(月) 16:13:31.07ID:3/iVgePD 別のところで質問したのですが、初心者歓迎スレのほうがいいと思いこちらで質問し直します。
Macのclang++でコンパイルしています。
cstdlibをインクルードしなくてもrand()が使えてしまうのですが、これはなぜでしょうか?
Macのclang++でコンパイルしています。
cstdlibをインクルードしなくてもrand()が使えてしまうのですが、これはなぜでしょうか?
725デフォルトの名無しさん
2021/07/06(火) 01:49:57.37ID:w3zU8vH7 >>724
手元のM1のでやったら普通にエラーになるけど?
printf("%d",rand());
だけ書いたやつ。
clangでもデフォはエラーだったような。C言語の方はコンパイルオプションで通せる。暗黙の関数宣言。
すまん、役に立てなくて。
手元のM1のでやったら普通にエラーになるけど?
printf("%d",rand());
だけ書いたやつ。
clangでもデフォはエラーだったような。C言語の方はコンパイルオプションで通せる。暗黙の関数宣言。
すまん、役に立てなくて。
726はちみつ餃子 ◆8X2XSCHEME
2021/07/06(火) 05:58:16.49ID:kwaneL8R >>724
ヘッダファイルが他のヘッダファイルを内部で include している場合は有りうる。
たとえば iostream を include したら自動的に ios や istream なども include されることは保証された動作。
ただ、 cstdlib を (間接的に) include すると仕様で明言している標準ヘッダはないと思うので
rand がどこかで勝手に宣言されているのだとしたら処理系の固有の動作だと思う。
-M オプションで (間接的に include されているものも含めて) 依存関係があるヘッダファイルを
抽出できるからそれで確認できるよ。
ヘッダファイルが他のヘッダファイルを内部で include している場合は有りうる。
たとえば iostream を include したら自動的に ios や istream なども include されることは保証された動作。
ただ、 cstdlib を (間接的に) include すると仕様で明言している標準ヘッダはないと思うので
rand がどこかで勝手に宣言されているのだとしたら処理系の固有の動作だと思う。
-M オプションで (間接的に include されているものも含めて) 依存関係があるヘッダファイルを
抽出できるからそれで確認できるよ。
727724
2021/07/06(火) 08:23:42.24ID:9fUGxcs8728はちみつ餃子 ◆8X2XSCHEME
2021/07/06(火) 08:56:08.30ID:kwaneL8R >>727
処理系依存だと思う。
iostream が暗黙に include すると仕様に明記しているのは
ios, streambuf, istream, ostream の 4 つ。
https://timsong-cpp.github.io/cppwp/n3337/iostream.objects.overview
あえていうなら cstdio の機能と結び付けるのが役割であるようにほのめかされている
ので普通の実装なら cstdio も include することになると考えてもいいと思うけど、
それ以上のことについてはっきりしたことは書かれてない。
rand が必要なら (たとえ実態として間接的に cstdlib が include されていても)
プログラマは明示的に cstdlib を include するほうがいい。
というか、そもそも論としてはいまどき rand を使うのは避けるほうが賢明な考えだと思うけどね。
処理系依存だと思う。
iostream が暗黙に include すると仕様に明記しているのは
ios, streambuf, istream, ostream の 4 つ。
https://timsong-cpp.github.io/cppwp/n3337/iostream.objects.overview
あえていうなら cstdio の機能と結び付けるのが役割であるようにほのめかされている
ので普通の実装なら cstdio も include することになると考えてもいいと思うけど、
それ以上のことについてはっきりしたことは書かれてない。
rand が必要なら (たとえ実態として間接的に cstdlib が include されていても)
プログラマは明示的に cstdlib を include するほうがいい。
というか、そもそも論としてはいまどき rand を使うのは避けるほうが賢明な考えだと思うけどね。
730デフォルトの名無しさん
2021/07/09(金) 19:37:14.99ID:We+HIKc2 C言語にpthreadを使ってマルチスレッドにするときの初歩的な質問をしたいのですが、
大域変数を複数のスレッドが読み書きする部分はミューテックスでロックしないとマズい、という
説明はわかった気がします。
では読むだけの部分はどうでしょうか。単にスレッドが変数の値を読みに行った瞬間の値を
知りたいだけならば、別にロックはしなくても害はないような気もしますが.... プログラム内の
別の箇所で書き込む部分はロックして、おかしなことが起こらないようにするとして。
それとも読むだけの場合もロック(書き込む場合に使うじミューテックスでロック)は必要でしょうか。
大域変数を複数のスレッドが読み書きする部分はミューテックスでロックしないとマズい、という
説明はわかった気がします。
では読むだけの部分はどうでしょうか。単にスレッドが変数の値を読みに行った瞬間の値を
知りたいだけならば、別にロックはしなくても害はないような気もしますが.... プログラム内の
別の箇所で書き込む部分はロックして、おかしなことが起こらないようにするとして。
それとも読むだけの場合もロック(書き込む場合に使うじミューテックスでロック)は必要でしょうか。
731デフォルトの名無しさん
2021/07/09(金) 19:46:28.14ID:TIX9j1Dy 必要ないぞ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 【STARTO ENTERTAINMENT】timelesz篠塚大輝『大きな古時計』替え歌一発ギャグ「今はもう動かない おじいさんにトドメ~♪」が波紋 [Ailuropoda melanoleuca★]
- 【朗報】外務省局長、中国側の要求を断固拒否。「高市さんの答弁は日本政府の立場を変えるものではないし、撤回しない」 [519511584]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 外務省局長、よくわからないまま帰国へ [834922174]
- 【実況】博衣こよりのえちえち歌枠🧪
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- たまにaカップの女いるけど何を楽しめばいいの?
