C++相談室 part145at TECH
C++相談室 part145 - 暇つぶし2ch353:デフォルトの名無しさん
19/10/05 00:03:15.79 bnoeYdBm.net
行列の結合則なんて高校で習っただろ
線形代数わからないプログラマって生き残れないと思うわ

354:デフォルトの名無しさん
19/10/05 00:05:26.41 KADe2ROY.net
>>347
・そのコードは、完全に上記の通りですか?
例えば、ループ回数が1000回より遥かに多くなると、
誤差の都合でそうなることがあるかもしれませんが、1000回くらい
だと、正しい処理系ではその現象は起きないはずです。

355:デフォルトの名無しさん
19/10/05 01:17:38.13 d5aP5JOP.net
キャストする前にlround呼んだらええんちゃうん。

356:デフォルトの名無しさん
19/10/05 01:44:04.24 VkhEKreX.net
(0.2+0.3)+0.4 == 0.2+(0.3+0.4)の結果がfalseになるのは正しいの?

357:デフォルトの名無しさん
19/10/05 01:54:00.97 Lbi5NeET.net
浮動小数点を勉強しておいで

358:デフォルトの名無しさん
19/10/05 02:07:17.64 5hJZ4CgN.net
有効数字1桁の計算で誤差は生じない

359:デフォルトの名無しさん
19/10/05 07:04:22.03 UfPJq4d2.net
10進の0.1を2進表現すると循環小数定期
>>355
バカ乙

360:デフォルトの名無しさん
19/10/05 08:03:13.32 9T2eUTn8.net
>>336
本当、人って色々だな
俺はC++98は未完成感があまりに強くて続きはまだかと待ちかねていた
具体的には例えば右辺値参照だ
一時オブジェクトにいちいちconstがつくのがイヤでイヤで待望のやつがやっと来た

361:デフォルトの名無しさん
19/10/05 08:28:45.86 iS4eZEWC.net
>>337, >>340
ちょっと誤解招くのでやっぱ突っ込んでおくけど、
多数のベクトルを変換するのに行列をまとめておかないと無駄になるのはどっちの方式でも同じだよ
俺が言ったのは(少なくとも同一の行列が)一度限りしか出てこない場合の話
まぁそれを最適化する必要があるのか、またそういう処理を大量にループするなら最適化の方法は他にあるだろうけど
>>333
GL方式でも列優先だから結局d3dと同じ無駄はあるんやで
最近のは知らんけど

362:デフォルトの名無しさん
19/10/05 08:49:33.11 KADe2ROY.net
>>353
計算誤差です。
(0.2+0.3)+0.4 == 0.2+(0.3+0.4) が偽になっても
(0.2+0.3)+0.4 == (0.2+0.3)+0.4 や
0.2+(0.3+0.4) == 0.2+(0.3+0.4)
は必ず真になることが保障されています。

363:デフォルトの名無しさん
19/10/05 08:55:38.66 KADe2ROY.net
>>359
コンピュータにおける浮動小数点は、内部表現は10進数ではなく2進数
で表現されており、有効桁数は 10 進数で 8 桁や 15桁などではなく
2進数で xx BIT という風になっています。
0.2, 0.3, 0.4 は、10進数だと、有効桁数が1桁でも完全に区切れが
よく表現できていますが、2進数の表現だと厳密には無限小数になってしまい、
どんなに有効桁数を長くしても厳密には表現できません。そのため計算誤差
が生じるのです。0.5 や 0.25 や 0.125 は 2 進数でも区切れ良く表現できるため、
 (0.125+0.25)+0.5 == 0.125+(0.25+0.5)
は誤差が生じることがないため、必ず真になるはずです。

364:デフォルトの名無しさん
19/10/05 10:06:32.18 e1uvrqu3.net
>>360
浮動小数の計算誤差を考慮して比較する時にstd::abs(a-b) < std::numeric_limit<double>::epsilon()というふうにするのはどう思う?

365:デフォルトの名無しさん
19/10/05 11:34:20.93 KADe2ROY.net
>>361
誤差の量が計算の順序や書き方によって変わってくるので、
そのようなヘッダに書かれているような誤差定数を使うことは
余り意味がありません。

366:デフォルトの名無しさん
19/10/05 11:37:49.72 7pdQvekm.net
実用数学

367:デフォルトの名無しさん
19/10/05 11:43:08.23 rY1OpV0v.net
>>361
機械イプシロンはそういうふうに使うものじゃない

368:デフォルトの名無しさん
19/10/05 12:09:22.39 uol03Q2n.net
cpprefjpが>>361と全く同じ間違いしてたわ馬鹿が湧くのはこいつのせいか
cppreference.comは正しかったからそっち見れ

369:デフォルトの名無しさん
19/10/05 12:34:57.85 dFaPF8AB.net
>>365
x-yの元になっているxやyがどのような計算過程を経てきたかわからないのに
 std::abs(x-y) <= std::numeric_limits<T>::epsilon() * std::abs(x+y) * ulp
でxとyがalmost equalsと言い切ってよい根拠とは、
ちゅか常識的に考えて、x、yがそれぞれ±e、±gの誤差を有するなら
 std::abs(x-y) <= std::numeric_limits<T>::epsilon() * (std::abs(e) + std::abs(g))
あたりの判定に落ち着かねばおかしい(これで正解とは言っていない
なんでstd::abs(x+y)みたいな場合によっては莫大な値になりえる係数を掛けねばならないの?

370:デフォルトの名無しさん
19/10/05 13:04:02.75 rY1OpV0v.net
イプシロンに誤差を掛けても意味ない。
つか、許容誤差の絶対値が与えられているならイプシロン使う必要もない。
cppreference.comのは許容誤差をULP単位で与える場合のやりかたで、
abs(x+y)はxとyの指数のうち大きい方を意味するものだったはず。

371:デフォルトの名無しさん
19/10/05 13:12:59.71 uol03Q2n.net
>>366
なんか色々根本的に勘違いしてる
cppreference.comのalmost_equal関数の仕事はあくまで与えられたxとyがalmost equalかどうかの判定だよ
> x、yがそれぞれ±e、±gの誤差を有するなら
なにこれ?「誤差」って何に対する何の誤差?

372:デフォルトの名無しさん
19/10/05 13:28:00.03 dFaPF8AB.net
>>367
>イプシロンに誤差を掛けても意味ない。
>つか、許容誤差の絶対値が与えられているならイプシロン使う必要もない。
左様ですなスマンカッタorz
>>368
>なにこれ?「誤差」って何に対する何の誤差?
真の値に対する誤差じゃわパオーン
真の値に対する誤差に依存しないalmost equal判定とか、使いどころはきわめて限定されるはず、

373:デフォルトの名無しさん
19/10/05 14:05:34.77 dFaPF8AB.net
>abs(x+y)はxとyの指数のうち大きい方を意味するものだったはず。
xが (xの符号)×1.bbbb...×2^m
yが (yの符号)×1.cccc...×2^n
だとしたときに、m>nだとすると
 x + y =
 { (xの符号)×1.bbbb... + ((yの符号)×1.cccc...×2^-(m-n)) } ×2^m
として計算されるのでだいたい2^m(x≒yなら2^(m+1))という意味か左様か、

374:デフォルトの名無しさん
19/10/05 14:08:05.45 dFaPF8AB.net
んまーulpをxとyの来歴に応じて調整すべき量とするなら
cppreference.comのalmost_equal関数は理解してやらないでもない

375:デフォルトの名無しさん
19/10/05 16:03:17.50 NXndjuW4.net
だれか、俺に分数を教えてくれないか?
足し算と引き算がマジ解らなくなってるんだ。
URLリンク(ideone.com)
一番のネックはネガフラグの扱い。
マイナスとプラスの反転演算でどうかくとスマートだろうか。
だれか教えてプリーズ。

376:デフォルトの名無しさん
19/10/05 16:21:25.21 bnoeYdBm.net
分子に符号もたせりゃいいだろ

377:デフォルトの名無しさん
19/10/05 16:25:36.94 NXndjuW4.net
>>373
え、それでよかったっけ?

378:デフォルトの名無しさん
19/10/05 16:34:31.54 hwiNAqBO.net
>>350
今習わないよ
俺の時でも選択

379:デフォルトの名無しさん
19/10/05 17:18:56.47 NXndjuW4.net
一応以下のような感じになった。Thx!
URLリンク(coliru.stacked-crooked.com)

380:デフォルトの名無しさん
19/10/05 17:19:54.63 NXndjuW4.net
URLリンク(coliru.stacked-crooked.com)
こっちだった。Orz
んじゃ。

381:デフォルトの名無しさん
19/10/05 17:28:26.58 QHD8CUaF.net
>>377
1. constexprにしてもいいんじゃない?
2. 出力関数作成しよう
template<typename Char>
std::basic_ostream<Char>& operator<<(std::basic_ostream<Char>& os, const Fraction& frac){
return os << frac.GetNumerator() <<'/'<<frac.GetDenominator();
}

382:デフォルトの名無しさん
19/10/05 19:08:43.36 NXndjuW4.net
>>378
1.できなくはない。機械的に接頭語つけるだけでいいよね。
2.暇だから作るわ。
行ってきまーす。

383:デフォルトの名無しさん
19/10/05 19:46:54.47 NXndjuW4.net
URLリンク(ideone.com)
ただいまー。イデオンで動かせるようにした。Gcdがバグってないといいなぁ。
あとvc2019では意味不明なエラーで動かない。

384:デフォルトの名無しさん
19/10/05 19:58:28.51 NXndjuW4.net
フィードバックハブに投げておいた。

385:デフォルトの名無しさん
19/10/06 10:28:58.03 yc9LKsYB.net
>>380
マルチ禁止

386:デフォルトの名無しさん
19/10/06 13:42:53.69 bPt7YQEe.net
>>382
ソーリー。

387:デフォルトの名無しさん
19/10/07 19:17:43.20 PHxdOQnu.net
C++ってなんでヘッダファイルいるんですか
最近マシン早いんだし
全部ソースに書いてインポートすればいいのに

388:デフォルトの名無しさん
19/10/07 19:38:58.27 Xs+XlBV4.net
やれば?(クレヨンしんちゃん風に)

389:デフォルトの名無しさん
19/10/07 19:52:54.51 9pxPpXZa.net
来年まで待ってね

390:デフォルトの名無しさん
19/10/07 20:58:42.59 A3KSW75p.net
>>384
むしろソースがいらなくて全部ヘッダに書けばいい
inline変数とかもできるようになったことだし

391:デフォルトの名無しさん
19/10/07 21:05:07.29 8FnUNDHt.net
>>387
たまに趣味で何でもかんでもtemplateでゴリゴリ実装してるとガチでそれになるww

392:デフォルトの名無しさん
19/10/07 21:26:10.24 YMM6HSZT.net
>>385
ヤレばデキるは魔法の言葉

393:デフォルトの名無しさん
19/10/08 09:06:39.07 xr4jQIWZ.net
プリコンパイルヘッダーって使ってます?
使っているプロジェクト見たことないですわ。

394:デフォルトの名無しさん
19/10/08 20:03:58.69 kGAGzuS0.net
>>387
こういう馬鹿野郎が出てくるからメタプロとかテンプレ好き連中ってのは嫌いなんだよ。

395:デフォルトの名無しさん
19/10/08 21:04:41.31 OCfPMe68.net
C++なんて趣味でやってるんだからテンプレ好きでもええやん

396:デフォルトの名無しさん
19/10/08 21:16:41.69 /kdim2Vo.net
出てくることの何が嫌なんだろうか
はっきり言って病気だ

397:デフォルトの名無しさん
19/10/08 21:42:59.95 lGNioH0G.net
headerオンリーってのは可搬性に優れた良いものだろ
特にテンプレート多用している奴は、一部関数だけソースファイル分離する意味が薄い

398:デフォルトの名無しさん
19/10/08 21:43:38.32 asJ1ctJB.net
>>391
どんなものにだって馬鹿は出てくるだろうに

399:デフォルトの名無しさん
19/10/08 21:54:07.26 J87hrB1p.net
「全部ヘッダ」と言われると、そのときの「ヘッダ」の定義がどういうものなのか気になる。

400:デフォルトの名無しさん
19/10/08 21:57:19.52 EwyBASw5.net
趣味でやってる人は全部ヘッダでいいと思う

401:デフォルトの名無しさん
19/10/08 22:09:52.63 tSj7di+z.net
>>390
VCのやつは使いまくり
依存するライブラリのヘッダファイルを標準のやつもソリューション内のやつも全部まとめて
stdafx.hの中でインクルードしたらことのほか便利
ただし同じプロジェクトのヘッダファイルを入れだしたら目的を見失って氏ぬ

402:デフォルトの名無しさん
19/10/08 22:10:50.35 hpLG4xMo.net
テンプレート関数は便利だしconstexpr関数は市民の義務だし
結局ほとんどヘッダファイルに書くことになるでしょ

403:デフォルトの名無しさん
19/10/08 22:30:34.35 X4FGjRpd.net
初心者ですが質問させてください
print(1, 3.14, "abc");とやると引数の中身を順番にスペース区切りで出力してくれるような関数は
可変引数テンプレートの再帰呼出しを使うと便利にできることを知りました。
そこで引数の型に応じて出力の見た目を少し変えたいのですが、
関数の特殊化をすればいいですか?
typeidだと動的な評価になってしまうんですよね?

404:デフォルトの名無しさん
19/10/08 22:33:59.15 kGAGzuS0.net
予想通りの馬鹿回答で笑ってしまった。
やっぱいい判別になるわテンプレバカ。

405:蟻人間
19/10/08 22:37:33.87 jfG+k1ni.net
>>400
引数一つに対するテンプレート関数を作って特殊化してそれに少しずつ渡せばできるよ。

406:デフォルトの名無しさん
19/10/08 22:42:38.66 /kdim2Vo.net
C++嫌いなのにいつまで居座るんだろうなこのガイジ

407:デフォルトの名無しさん
19/10/08 22:57:34.25 HxNAD6ah.net
好き嫌いの問題じゃねーんだわ

408:デフォルトの名無しさん
19/10/08 23:04:05.43 /kdim2Vo.net
こんな雑談スレ好きな奴以外に需要ないだろ
こんな辺境別に見なくて良いんだよ?

409:デフォルトの名無しさん
19/10/08 23:08:13.69 hpLG4xMo.net
>>400
c++17以降ならif constexprとstd::is_same_vの使用を検討してみるのもいいかも

410:デフォルトの名無しさん
19/10/09 04:08:22.18 NmoqHfbB.net
400です。頑張ってみましたがどうにもコンパイルエラーが出ます
難しいですねC++は...
void print() {}
template<class... Args>
void print(const char* c, Args... args) {
cout << "[" << c << "]" << endl;
print(args...);
}
template<class First, class... Args>
void print(First first, Args... args) {
cout << first << endl;
print(args...);
}
int main() {
print(1, 3.14, "abc");
return 0;
}

411:デフォルトの名無しさん
19/10/09 04:17:51.46 NmoqHfbB.net
あ、こういうふうにするとコンパイルできました。引数2個の関数を特殊化したからエラーになった?
テンプレートの展開のされ方がよくわからないけど、とりあえず目的のことはできました
ありがとうございました
void print(const char* c) {
cout << "[" << c << "]" << endl;
}
template<class T>
void print(T t) {
cout << t << endl;
}
template<class First, class... Args>
void print(First first, Args... args) {
print(first);
print(args...);
}

412:デフォルトの名無しさん
19/10/09 04:21:52.30 NmoqHfbB.net
>>406
いわゆる型特性というやつでしょうか?enable_ifを使うのかと思い試したもののうまくいかず、
ネットで調べるとenable_ifと可変引数テンプレートは相性が悪いという意見を見つけたり...

413:デフォルトの名無しさん
19/10/09 07:02:07.47 8qv563yz.net
>>409
if constexprを使った例はこんな感じ
template<class First, class... Args>
void print(First first, Args... args) {
if constexpr(std::is_same_v<First, const char*>){
std::cout << "[" << first << "]" << std::endl;
} else {
std::cout << first << std::endl;
}
if constexpr(sizeof...(args)>0){
print(args...);
}
}

414:デフォルトの名無しさん
19/10/09 10:59:59.89 RbUf+g7C.net
const char * 自体も class First や class Args と一致するんじゃね

415:デフォルトの名無しさん
19/10/09 21:59:58.44 8qv563yz.net
First と Argsの二つがあるのがややこしい場合は畳み込み式でもできるぞ
template<class... Args>
void print(Args... args){
  ([](auto t){
    if constexpr(std::is_same_v<decltype(t), const char*>){
      std::cout << "[" << t << "]" << std::endl;
    } else {
      std::cout << t << std::endl;
    }
  }(args), ...);
}

416:デフォルトの名無しさん
19/10/09 22:42:32.58 J+0BhmRu.net
win系のOSの画面に1.txt~5.txtがあります。1.txtと2.txtをドラッグして選択したとします。
この状態で3.txt~5.txtを選択したことにするにはどのようなコードを書けば良いですか?

417:蟻人間
19/10/09 22:52:59.82 bPxMjWa1.net
>>413
ListView_SetItemState

418:デフォルトの名無しさん
19/10/10 00:29:05.87 uUO69neG.net
エクスプローラにdll注入とか?

419:蟻人間
19/10/10 01:32:41.34 VnnXeZwz.net
前にやったことがある。
URLリンク(github.com)

420:デフォルトの名無しさん
19/10/11 01:40:25.90 n351RXRL.net
std::shared_ptrを構築後に(カスタム)デリータを変更するのは無理?
既にどっかで作成済みのshared_ptrについて、破棄タイミングを後から見れないかなと

421:デフォルトの名無しさん
19/10/11 02:44:16.61 uKeO6WuZ.net
別のstd::shared_ptrをカスタムデリータ付きで構築してswapすれば

422:デフォルトの名無しさん
19/10/11 04:06:16.56 RvdWaBLb.net
shared_ptrとunique_ptrでdeleterの指定方法が違うってのが興味深いね。

423:デフォルトの名無しさん
19/10/11 12:29:56.77 w5dDNHMJ.net
VCのlatestでchar8_tが入ってたわ
やっとC++erが文字コード問題から解放されるんだな

424:デフォルトの名無しさん
19/10/11 14:00:32.34 XWYiG0pn.net
やったぜ。

425:デフォルトの名無しさん
19/10/11 15:19:50.16 iqVlf+4W.net
>>418
デリータごとswapされたわ
stackoverflowにも似たような質問があったけど結論としては出来ないっぽい
たぶん

426:デフォルトの名無しさん
19/10/11 23:12:48.13 WXWRLB/C.net
>>392
別にテンプレ好きでも構わんが、C++ユーザー全員が趣味だと思ってんの?

427:デフォルトの名無しさん
19/10/11 23:15:04.89 WXWRLB/C.net
>>405
雑談以外に役に立つ書き込み出来なくてすみません、ってことか

428:
19/10/12 08:08:31 vgsPsMOm.net
>>423
C++ユーザが全員趣味なんてどこにも書いてないし、あるプログラミング言語が趣味でしか使われてない状況なら、委員会なんていらないわwww

429:
19/10/12 08:48:46 fl5cgmi7.net
衣食住の確保以外の仕事なんてみんな趣味みたいなもんだよ
なくたって構わんのだから

430:
19/10/12 08:58:25 rY+KRAa3.net
農業以外は遊びってことか!

431:デフォルトの名無しさん
19/10/12 09:03:04.22 tzOo7sle.net
原始人から見たら1次産業以外は遊びだしそうだろ

432:デフォルトの名無しさん
19/10/12 09:06:03.19 w6XAfbR5.net
委員会なんて何の役にもたってねーだろ。
構文解析もまともに理解できてないバカが俺様仕様の理想に突っ走ってるだけのクソ組織で、
仕様の実装、デバッグの手間なんてこれっぽっちも考えてないのがよくわかる。

433:デフォルトの名無しさん
19/10/12 09:14:16.17 Fi90LVHu.net
デバッグできねえのを人のせいにするクズがよく言うぜ

434:
19/10/12 09:54:19 DT43rpFP.net
近年は新機能は三大コンパイラ(GCC,MSVC,Clang)での試験実装が入ってから仕様入りするのが普通になってるし
コンセプトなんてまさにデバッグの手間の軽減を第一目的に苦心して作られた機能なんだけど
どのへんを見てよくわかったのか教えて

435:
19/10/12 10:00:51 w6XAfbR5.net
>>431
実装したことないやつは黙っててね。
で、そのコンセプトを実際のコードでコンパイルした時間がどれくらいになるかわかってる?
そういう有用なベンチマークもほとんど出さずに無理やり入れようとするから
信頼を無くしてるんだよ。

436:
19/10/12 10:19:47 Nq/Z/R6A.net
経験したことは全て正しいっていう日本特有のアホ理論だろそれ
経験してないお前に発言権は無い、っていう
その理屈を持ち出すヤツは大抵はアホ

437:
19/10/12 10:24:58 69fBrMS4.net
コンパイル時間は、コンパイラの出力する最適化されたバイナリの実行速度に比べたら問題ではないだろ

しかも構文解析にかかる時間なんて最適化時間に比べりゃ屁みたいなもの

438:
19/10/12 10:26:15 mYzO26Pi.net
似たようなものを複数書いてもバグ修正時に一部見落としなんて馬鹿げたことになるわけで
マクロでもテンプレートでもまとめられるものはまとめたほうがいいわな

439:
19/10/12 10:27:43 69fBrMS4.net
c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、テンプレート時の記述でtypename やらtemplateやらで、識別子の種類自体を指定する羽目になっているのはあるよね

440:
19/10/12 11:23:13 zNYGVDyE.net
>>434
テンプレートふんだんに使ったライブラリ実用してるとひどいことにはなる
アプリ自体は数万行なのにコンパイル10分以上とか

441:デフォルトの名無しさん
19/10/12 11:27:59.19 KmpqQhzT.net
>>432
お前が信用しないのは勝手だが、みんなの総意みたいに言うなよ

442:
19/10/12 12:09:52 73DoxmjF.net
数万行で10分が早いのか遅いのかよくわからない

443:デフォルトの名無しさん
19/10/12 12:15:22.09 69fBrMS4.net
それは本当にパースの複雑さのせいなのかは疑問だな
templateだと、プログラマは簡単にコンパイラの仕事をあまり意図せず増やしてしまいがちだからね。
std visitで引数増やすとコンパイル時間は簡単に増やせるよ。
5つくらいでもうコンパイラが落ちたりする
やらせていることの面倒くささ、それを手書きすることを考えれば妥当なのだけど

444:
19/10/12 12:41:57 Tqr7IA/6.net
最近C++触ってないけど数万程度で10分もかかるの?
10万行程度なら5分以内に終わってほしいところだけど…

445:
19/10/12 13:13:02 trzfpzAc.net
>>439
かなり遅いです。
ヘッダファイル *.h とソース本体のファイル *.c では事情が違いますが、
OSのバージョンによりますが、Win32の標準ヘッダファイルの windows.h などだけでも
コメントを除外しても2万行弱くらいあります。
これのパースは、VC++で1秒~数秒くらいです。
通常は、precompiled header を使うので、一つのプロジェクトで一度だけ
パースされることが多いです。
ただし、プロトタイプ宣言やマクロ定義、構造体定義、inline関数定義
などだけで、実際のコード生成は伴わないので、*.c の数万行とは
また事情が違います。*.c はコード生成を伴うので、同じ行数であれば*.hよりも
遅くなる傾向があります。
しかし、それでも、C++98 の場合、数万行だと3秒~10秒以下でコンパイルできます。

446:デフォルトの名無しさん
19/10/12 13:23:47.19 UpKv7BB3.net
↑こいつはVSスレで有名なキチガイなので放置で

447:デフォルトの名無しさん
19/10/12 13:24:45.74 69fBrMS4.net
c++の文法のせいでパースが遅いってレベルの話じゃないような

448:デフォルトの名無しさん
19/10/12 15:33:32.46 UCFxfzGx.net
ヘッダオンリーのライブラリがポータブルとか言われてもてはやされるのがc++だからね
生産性の意識が間違った方向に向いてる
コンセプトでどうなることやら

449:
19/10/12 15:52:13 K75UXpIa.net
俺の10万行程度のアプリは1分以内にコンパイル終わるが・・・
10分てどこの世界だ

450:
19/10/12 19:26:26 8VsKOlOD.net
「参照の配列」を作りたいときって現状 reference_wrapper を使う以外ないですか?

451:デフォルトの名無しさん
19/10/12 20:29:07.16 iehpkqJW.net
ポインタやスマポじゃいかんのか

452:
19/10/12 20:55:57 cS98TRHZ.net
>>437
プリコンパイルヘッダー使え…!

>>446
VC++2010の場合配列要素のアドレスの配列というのを
それぞれ1万行ぐらい書いてリリースビルドすると10分かかる

453:デフォルトの名無しさん
19/10/12 23:18:34.83 zNYGVDyE.net
spiritで構文解析させてたコード(その上et使った自作ライブラリあり)だから�


454:痰ニして極端だったかもしれんけどね プリコンパイルドヘッダは使ってたよ 効いてるときは数分かからなかったと思う というか5年以上そのコード使ってないんで今のマシンならまだマシになるとは思う



455:デフォルトの名無しさん
19/10/13 01:04:01.79 2Ilco01g.net
boostを多用した10数万行のソースでprecompileありでreleaseビルドしたら10分くらいかかってたけど、debugビルドでは1,2分くらいだった気がする。パースだけなら大したことないけど最適化がかなり遅いと思われる。

456:デフォルトの名無しさん
19/10/13 01:06:42.02 uORMYh+w.net
翻訳単位が増えると単純に遅くなるし
リンク時最適化でもさらに遅くなる

457:
19/10/13 01:16:58 Fwjkj11x.net
LTOは本当のリリース時や速度検証の時以外は外しても問題ないよね

458:デフォルトの名無しさん
19/10/13 09:37:54.86 kfwaB+Y7.net
ここの話で出ている
>296
>>294
clangさんが教えてくれた
std::string hogehoge() { return A<_T3>::template get<std::string>();}
>436
c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、
テンプレート時の記述でtypename やらtemplateやらで、
識別子の種類自体を指定する羽目になっているのはあるよね
<_T3>::templateやtypenameをどの様な場合に書かないといけないのか?
この辺を解説した初心者向けか入門者向けの解説サイトみたいな所が
何処かに有りませんか?
サイトが無さそうなら検索に向いている単語みたいなのでも有れば助かる
::templateとかで検索しても上手く引っ掛からないみたい(有るには有るけど少ない)

459:デフォルトの名無しさん
19/10/13 10:06:17.74 zTi0Tc1S.net
コンパイラが出すメッセージで検索してみれば?

460:デフォルトの名無しさん
19/10/13 11:14:46.72 Fwjkj11x.net
>>454
URLリンク(ja.cppreference.com)

461:デフォルトの名無しさん
19/10/13 17:23:21 Y0ptPfKA.net
他の言語で書かれたコードをスクリプトの要領で
C++から呼び出して実行したいのですが、
そういった事をするのに適した言語ってどういった物があるのでしょうか?

462:
19/10/13 17:23:50 Y5pFrXym.net
>>457
パイソン

463:
19/10/13 17:31:01 9auzzyVZ.net
言語間のABIの違いを透過的にしたいのならアセンブラの出番だね

464:
19/10/13 17:36:26 1+8oai62.net
まさにそういう用途で作られたluaとか

465:デフォルトの名無しさん
19/10/13 17:44:25.71 j3fG3YC6.net
>>457
今ならluaかjs(V8/ChakraCore/SpiderMonkey)だな。
【Lua】組み込み系言語総合 その7【Squirrel】 [無断転載禁止]©2ch.net
スレリンク(tech板)
pythonもできなくはないけど手軽とは言えない。
pythonを使いたい理由がなければやめておくのが吉。

466:
19/10/13 18:10:48 pJwii1Hg.net
pythonは呼ぶ方で、呼ばれる方としてはほとんど想定されてないわな。

467:
19/10/13 19:05:43 m8H1BiEu.net
lua以外無い

468:
19/10/13 19:35:48 rjz838Ki.net
>>457
tcl

469:デフォルトの名無しさん
19/10/13 20:24:22.36 kfwaB+Y7.net
>455,456さんどうもです
エラーが出たらそうしてみます
リンク先を読んで見ましたが
自分には難しいのでそのページを手がかりに検索して(依存名で探してみた)
漸く理解出来た気がします
前にstd::を付ける付けないって話を何処かでしてい
自分的にはどうしたものだろうか?
って感じだったんですけど
adlやtwophasenameとかの解説と合わせて書いて有るのを呼んでいて
std::を付けるのはかなり重要なんだと思えてきた
今までnamespaceって単なるグループ名を付けている
くらいの感覚だったんですけど
意外と重要なんですね
どうもでした

470:デフォルトの名無しさん
19/10/14 15:05:53.73 rfaLGQBa.net
template<size_t N>
class Test{
public:
private:
int m[N];
};
上の様なクラスでコンストラクタでmを値を指定して初期化したいんだけどNの数は未定ではないですか。
こういう場合のコンストラクタの書き方ってどうすればいいのでしよう?
可変引数?

471:デフォルトの名無しさん
19/10/14 15:12:05.32 BPBGG2nS.net
コンパイル時に決まってないならvectorかなんかにするしかない

472:デフォルトの名無しさん
19/10/14 15:18:08.00 P81x9Tjl.net
templateパラメータの整数にはコンパイル時に決まらない数値は入れられない

473:デフォルトの名無しさん
19/10/14 15:28:00.19 qN7fFVrS.net
>>466
そもそも、そのような生配列は、デフォルトでは0初期化もされないので、
メンバ初期化子リストを使わなくても効率は落ちないので、
コンストラクタ内部で普通に代入演算子を使って初期化すればいい。
すると、単に任意個数の引数をコンストラクタに渡す問題になる。
それには、昔ながらの va_list を使って渡す方法と、
関数テンプレートやテンプレートクラスを使って、自分自身を一つずつ引数を
減らしながら呼び出していく方法の二通りある。

474:デフォルトの名無しさん
19/10/14 15:28:52.79 Y7o3BEyU.net
>>466
Test(std::initializer_list<int>&& arg)
{
std::copy_n(std::begin(arg), N, std::begin(m));
}

475:デフォルトの名無しさん
19/10/14 15:30:45.59 rfaLGQBa.net
>>469
一度考えたのはテンプレートの可変引数なんですが
//Testのコンストラクタ
template<typename... T>
Test(T... args):m{args...}{
}
templateの可変引数の為にどんな型でも一致してしまい、そのくせにdoubleからintなどの変換をしてくれないのでinitializer_listを引数に出来たり、もしくはもっといい初期化方法があるのかなと思った次第です。

476:デフォルトの名無しさん
19/10/14 16:18:31.70 1VO4fG6M.net
URLリンク(ideone.com)

477:
19/10/14 16:48:34 REdvl5Gt.net
>>471
>そのくせにdoubleからintなどの変換をしてくれないので
この点に関しては、以下の拡張展開でいけるはず。
template<typename... T>
 Test(T... args):m{((int)args)...}{
}

478:
19/10/14 16:55:25 REdvl5Gt.net
templateの「非型引数」を使えば、理論上は、
template<int...args>
Test(int...args):m{args...}{
}
と書ける可能性はあるかもしれないけど、試してみてないので分からない。

479:
19/10/14 17:04:44 REdvl5Gt.net
C++11 から、template 仮引数(パラメーター)に非型パラメーターパックが使える。
分かっているとは思うけど、このパックとは可変長引数をまとめて入れる容器の様な意味。
実際にやってみてないのでわからない。

URLリンク(en.cppreference.com)

【Non-type template parameter】
type ... name(optional) (3) (since C++11)
3) A non-type template parameter pack with an optional name.

480:
19/10/14 17:48:47 DdI7aqm2.net
>>466
要素数がコンパイル時に決まってるなら std::array 使って Test<3> x{{1,2,3}} とすることは簡単にできそう。

481:デフォルトの名無しさん
19/10/14 20:20:29 ljIrzJ7B.net
>>464 >>457
tcl + 1

482:デフォルトの名無しさん
19/10/16 00:49:52 4OT/K/L6.net
>>473 Thank you!!

483:
19/10/18 03:20:02 kbBE7aSe.net
他クラスのメンバ関数テンプレートを呼び出すときってtemplateキーワードを関数名の前に付けないと
operator<と間違われてエラーになりますですよね?具体的に例をあげてみますと

URLリンク(wandbox.org)

これの t.template func<T2>(); のところですが、実はこのtemplateキーワードを外しても
WindowsのVisualStudioだとコンパイルが通ってしまいます。
これってVisualStudioが規約違反しているという理解で合っていますか?

484:デフォルトの名無しさん
19/10/18 03:32:35.18 L8qU11hp.net
vsのバージョンは?
2017の途中からtwo phaseに対応しだしてtemplate周りの怪しい挙動は大分改善された

485:
19/10/18 11:35:03 kGqx1xn0.net
>>480
Express 2017 for Windows DesktopとProfessional 2019で確認しています
準拠モードを「はい」にしたら標準の規約に従うのかと思ったんですが変化なしでした

開発はWindowsでしつつもWindowsとLinuxどちらでもコンパイルできるようにしたいんですが
もしかしてそう簡単な話ではないんですかね

486:
19/10/18 12:11:07 8CoI4J3v.net
>>481
visual studio cmakeプロジェクトでググる

487:デフォルトの名無しさん
19/10/18 15:49:49.04 /qIwU54Z.net
effective modern c++のnoexceptの項読んで思ったんだが、
C++の関数内でCの関数(具体的にはOpenGLとか)を呼び出した時に
C++側でcatchできる例外って具体的にどんなものがあるの?
試したことないけどmalloc失敗でbad_allocは飛ばないよね?

488:デフォルトの名無しさん
19/10/18 18:57:22.15 eJANlQqR.net
Windowsなら構造化例外とか

489:デフォルトの名無しさん
19/10/18 19:16:01.68 rTjJuJDg.net
>>482
cmakeってビルドに関するものだったような?
ソース自体はWindowsとLinuxで完全同一にしたいんですが
あれなんか自分勘違いしてるかな
とりあえずcmakeくぐります、有難う

490:デフォルトの名無しさん
19/10/18 19:19:00.58 5559SrY6.net
VCコンパイラがWindows専用だからcmakeだけでは解決しない
clangオプション使えばいけるんじゃね

491:デフォルトの名無しさん
19/10/18 19:27:02.65 BPo3Wxa0.net
cmakeってなんとなくしか使ってないんですけど何なんですか
OpenCVのソースをビルドするときに使いましたけど、cmakeした後にまたVisual Studioでコンパイルする必要があるのはなぜですか

492:デフォルトの名無しさん
19/10/18 21:38:24.25 1VxWd/yq.net
>>487
cmakeってmakeの代用じゃなくてmakefileとかxxx.slnとかを作るソフト
なのでcmake実行後に各々の環境にあったビルドを行う

493:デフォルトの名無しさん
19/10/18 22:32:33.72 HsDKWWc7.net
>>487
ビルドするためのスクリプトを作るツール、みたいに考えるといいよ
linux環境ならLinux用のものを作ってくれる
makeだと基本はlinux専用だし、.slnや.vcxprojはwindows専用だから、両方を面倒見るのは大変でしょ

494:デフォルトの名無しさん
19/10/18 22:48:18.41 f2FG8XiO.net
ビルドするためのスクリプトを作るためのスクリプトを作るためのスクリプトなんてよくある話だよ。

495:デフォルトの名無しさん
19/10/18 22:49:57.04 a3uRi/Ig.net
秘伝のタレな

496:デフォルトの名無しさん
19/10/18 23:06:23.18 liCy40EB.net
GNU autotoolsをまともにいじる輩は消え去ったという現実をcmakeも味わうことになる。
バカは同じ間違いをする。歴史も見ずに。

497:デフォルトの名無しさん
19/10/19 00:19:02.04 JKxr+RAJ.net
CMakeってKitwareっていう大学発ベンチャーから出てきたやつだよな
もとはVTKとか可視化用ライブラリ開発してるしがないベンチャーだったのに
CMakeのおかげでやたら顔が知られるようになった

498:デフォルトの名無しさん
19/10/19 00:40:35.72 kiA3Djjo.net
VTKとparaviewの方が有名じゃなかったのか

499:デフォルトの名無しさん
19/10/19 00:44:42.31 JKxr+RAJ.net
ParaViewは最近になって有名になってるけど所詮はVTKのラッパーでしょ
CMakeのほうが影響度はでかいと思う
ベンチャーでここまでやれたなら大成功な事例だね

500:デフォルトの名無しさん
19/10/19 00:58:43.11 kiA3Djjo.net
cmakeより前から有名じゃね?

501:デフォルトの名無しさん
19/10/19 01:00:35.87 4XSJxZBk.net
cmake邪魔くさい
Makefile.am, configure.acからautoreconfしてconfigure作る方が楽。
windows用もmingwでクロスビルドしちゃえば楽だし。
WSLでwindowsからも見えるパスでビルドすると作ったwindows用binaryをすぐに起動できるしいうことなし

502:デフォルトの名無しさん
19/10/19 01:28:27.26 kDntEbbb.net
mingw使わずに標準のwindowsの環境で使えるようになってから出直してきて

503:デフォルトの名無しさん
19/10/19 01:36:12.28 +xsHXYvs.net
mesonいいぞー

504:デフォルトの名無しさん
19/10/19 01:37:16.21 JKxr+RAJ.net
makeとかのビルドツールって超重要なはずなのにおざなりな状況になってるのは不思議だ
なんとかしてくれ

505:
19/10/19 01:49:35 kiA3Djjo.net
クロスプラットフォームなソフト作るにしても、成果物が対象の環境で動けば良い訳で、ビルドをどの環境でも出来ることにそれほど意味はないからね
てかunix系でgccやclang使って開発しているものをVCに入れても謎の独自仕様でコンパイルできないとかザラだしね

506:デフォルトの名無しさん
19/10/19 04:05:50.65 kDntEbbb.net
>>500
そう言って立ち上がった人は100億人くらいいたが誰一人として帰ってくる者はいなかった

507:デフォルトの名無しさん
19/10/19 04:25:19.36 Qviva8VV.net
>>502
ほんとこれw

508:
19/10/19 07:26:21 4XSJxZBk.net
>>498
wslでmingwクロス環境はマクソ提供だけど

509:
19/10/19 09:24:58 wYu0/eCZ.net
あらゆるビルドツールは怪獣化して、怪獣を飼いならすためのラッパーが必要になり、そしてそのラッパーももれなく怪獣化する
歴史が証明しており例外はない

510:
19/10/19 09:25:25 WQwZNfDO.net
会社でifstreamのファイルオープンがエラーになるのはなぜなのか不明。assert()で引っかかる。
Visual Studio 2008コマンドプロンプトでコンパイルしたプログラムで、コードは単純化
して示したものが下記のようなもの。
std::ifstream ifs1;
for (n = 0; n < 8; ++n) {
ifs1.open(s[n].c_str());
assert(ifs1); // もしくはassert(ifs1.is_open());
関数(ifs1);
ifs1.close();
ifs1.clear();
}
コーディング上に間違いがあるのかいな。ファイルが使用中のためにエラー
でもないようだし。
よくわからんからCのFILE *に変更して対処したけどコンパイラの欠陥か。
ifstreamを宣言した後に ifs1.clear(); が必要なのか。

511:デフォルトの名無しさん
19/10/19 09:50:39.86 wYu0/eCZ.net
ifsreamってcloseの後に再使用できる保証あったっけ?
ifs1の宣言をfor文の中に入れて毎回オブジェクト作り直す方が無難に見える

512:デフォルトの名無しさん
19/10/19 09:51:32.93 wYu0/eCZ.net
宣言じゃないや定義

513:デフォルトの名無しさん
19/10/19 09:54:59.18 Xn59Im0u.net
makeが複雑なんじゃなくて
多様な環境すべてに対応するように書くことが複雑なわけで。
だったらdockerなり使って一つの環境だけでの提供を考える方が楽。

514:デフォルトの名無しさん
19/10/19 11:50:11.90 Xq/UOX2V.net
>>506
まずファイル開く権限あるのかな
最近それで引っかかった

515:デフォルトの名無しさん
19/10/19 12:33:25.60 IyvFodwr.net
>>484
あれ、Winの構造化例外ってそもそもtry..catchには引っかからなかったような……

516:デフォルトの名無しさん
19/10/19 12:41:43.65 IyvFodwr.net
Rakefileを使っている俺は小数派。
>>506
古いVCの場合ifstreamのclear()後再使用はできなかった記憶がある。

517:デフォルトの名無しさん
19/10/19 13:51:45.42 2wK0PqU+.net
C++でv8のjavascriptを使うために
インストールしようと色々やってるんだけどどうにもうまく行かない。
URLリンク(qiita.com)
このサイトを参考にしながら進めてるんだけど
「depot-toolsインストール」の環境変数を通す項目で
C:\v8\depot_tools\win_tools-2_7_6_bin\python\bin
このパスがダウンロードしてきたdepot-toolsにはないんだけど、
どこにあるか誰か知りませんか?
スレチだったらごめんなさい。

518:デフォルトの名無しさん
19/10/19 14:48:33.14 g7gJ/kc1.net
おま環
何をダウソしたかくらいは書け

519:デフォルトの名無しさん
19/10/19 15:03:15.21 g7gJ/kc1.net
python2.7 が既に入ってるなら
その bin に path 通しとけば良いんかな

520:デフォルトの名無しさん
19/10/19 15:14:23.88 Q3nSZoDU.net
>>483
C の関数が呼び出すコールバックを C++ で書いた場合、環境によってはコールバックからの例外が
C の関数を通過してくる。環境によっては通過できずに terminate() するけど。
厳密に「Cの関数」じゃなくなるけど qsort(), bsearch() については例外が通過できるものと規定されている。
あとは未定義動作となる場合の反応として例外が飛んでくることはあるかもしれない。

521:デフォルトの名無しさん
19/10/19 15:22:29.09 2wK0PqU+.net
>>514
忘れてた。スマヌ。
Windows10 X64
Visual Studio Community 2019
Python 3.7.4(64-bit)
Git version 2.23.0.windows.1
ダウンロードしたのは
URLリンク(chromium.googlesource.com)
ここから「x64 Native Tools Command Prompt for VS 2019」
で「git clone」を使ってダウンロードしました。
>>515
python自体のbinフォルダは試してませんでした。
ちょっとやってみます。

522:デフォルトの名無しさん
19/10/19 15:27:23.69 g7gJ/kc1.net
OS とかツールは全部違うけど
URLリンク(chromium.googlesource.com)
これ clone しても確かに win_tools-2_7_6_bin は無かった

523:デフォルトの名無しさん
19/10/19 15:29:04.62 ydKYIai+.net
何故公式のインストール手順を読まないのか

524:デフォルトの名無しさん
19/10/19 19:15:58.17 fDUUZQql.net
Node.js じゃ、ダメなのか?

525:デフォルトの名無しさん
19/10/19 20:05:28.35 +xsHXYvs.net
>>511
なんか設定次第で引っかかるようにならなかったっけ・・・

526:517です
19/10/20 17:45:24.74 njFFTJVf.net
>>519
インストール手順自体は試したんだけど、
あまりに訳わからんちんで途中で断念して
他のサイトを見ながら入れようとしています。
>>520
Node.jsってv8の上に乗っかったjavascriptというイメージなんだけど、
C++から呼び出せるのでしょうか?

527:
19/10/20 20:19:16 hyX4MvIl.net
今、YappyCamという録画ソフトを作っています。以下のソースをご覧下さい。

URLリンク(github.com)
URLリンク(github.com)
URLリンク(github.com)

このSoundが音声を扱うクラスになっております。
スレッド関数Sound::ThreadProcで録音処理を行っています。
std::vector<BYTE> m_wave_dataがサウンドバッファです。
Sound::FlushDataがバッファを吐き出す関数です。

現在、SSDが主流になりつつありますが、ハードディスクでもトラブルなく使えるようにしたいです。いくつか質問します。

1.m_wave_dataをstaticな固定バッファにすべきか。するとすればどれぐらいの容量か。
2.もっといいバッファリングの方法はないか。

お願いします。

528:蟻人間
19/10/20 21:02:47.12 hyX4MvIl.net
スピード命です。フレーム落ちは絶対にダメだそうです。

529:デフォルトの名無しさん
19/10/20 21:06:32.98 I/H74RW7.net
古臭いスタイルはさておき・・・
(別にそれでいいと思うよ)
なぜバッファリングしてる?
vectorにためずにwriteしたらいいじゃん
readとwriteの単位が合わないとか?
バッファリングするならreader/writerで別スレッドにした方がいいかもね
オーディオの処理なんだからおれなら動的メモリ確保の走るvectorは使わないね
最悪システムコールだから音が途切れる可能性が高まる
一瞬かもしれないが音は少しでも途切れるとノイズになる
最適なバッファ量はそのルーチンがどれぐらいのジッターで駆動してか計測して決めればいい
あとバッファリングすればそれだけ遅延が発生するから注意
本来ビデオ側と同期をとる必要あるけどPCだと適当だよな
CE機器だと完璧に合わせるけど

530:
19/10/20 21:15:47 PJrfugKB.net
COBOLのWRITE命令みたいに非同期書き込み&バッファローテーションてか?
あの当時のアホOSならともかく今どきアプリでそんなことせにゃならんか?
ベアメタルなら面白そうだけど

531:
19/10/20 21:16:42 Vt7fKSBc.net
遅延の原因は、vector::insert()でしょ。

532:
19/10/20 21:24:56 akKR2ina.net
ズらすの?

533:
19/10/20 21:27:13 peAHiKUT.net
誰がハゲやねん

534:
19/10/20 22:12:11 2g822Cxo.net
ああそうか。std::FILE/CreateFileそのものがバッファリングしてるんだ。ならば下手なバッファリングは必要ないと。

普通にI/Oすることにします。ありがとうございます。

535:
19/10/20 22:21:50 2g822Cxo.net
std::vectorのメモリー動的確保は音声処理では不味いと。

ハードディスク環境でジッターを測定して見ないと。わかりました。

536:
19/10/20 22:32:55 I/H74RW7.net
>>530
ただそのスレッドでwriteするのが問題ないかはよく確認した方がいいよ
writeでブロックされることで音声のソース側の処理が滞る可能性がある
その場合はやっぱり別スレッドにすべきだね

537:
19/10/20 22:59:16 2g822Cxo.net
プログラム高速化の禁術
URLリンク(qiita.com)

538:
19/10/20 23:12:22 2g822Cxo.net
setvbufって便利な関数を見つけた。これ使うか。

539:
19/10/20 23:13:52 fVQAzz8M.net
音声のバッファリングには普通はリングバッファを使う

540:
19/10/20 23:28:56 2g822Cxo.net
ここまでのまとめ。

リングバッファを使う。
十分大きなバッファサイズでsetvbufを使う。
リングバッファへの読み書きは別スレッドにする。
バッファが空のときはイベント待ちで休ませる。

541:デフォルトの名無しさん
19/10/20 23:44:50 Vt7fKSBc.net
別スレッドにキューイングするのに適したC++標準クラスは何かな?

542:デフォルトの名無しさん
19/10/21 06:50:33.92 iwcvXj42.net
ゴチャゴチャ言うならビルトイン配列使っとけ

543:デフォルトの名無しさん
19/10/21 15:01:03 c9dhXgWB.net
C++から呼べるし
C++を呼べる

544:デフォルトの名無しさん
19/10/21 15:43:44 M4XH2/Bk.net
>>537
Queue への読み書きは、1要素当たりは短時間で済むことが多いので、
Queueを読み書きする場所で、必ず Critical Section などで囲むと良い。
一度に沢山の要素をまとめて書き込みたい場合は、原則的には、
1要素を書き込む処理をこまめに、Critical Section で囲むようにする。
必ずしも1要素ずつ囲む必要は無いが、こまめに囲った方が、
別スレッドの待ち時間が減ることが期待できるが、その意味が有る場合と
無い場合とが有る。
Critical Section の代わりに、Mutex や Semaphore などを使うことも出来る。

545:デフォルトの名無しさん
19/10/21 17:


546:20:19.00 ID:Yxovtd3S.net



547:デフォルトの名無しさん
19/10/21 18:19:39.76 iwcvXj42.net
タイミングで問題が出てるのにvectorにこだわるのはアホだよな

548:デフォルトの名無しさん
19/10/21 18:33:52.73 K8Ck/3Ch.net
実行時のパラメータでバッファサイズ可変にするならvectorで始めにresizeしておくのが楽
size使える分配列のunique_ptrより取り回しも楽だし

549:デフォルトの名無しさん
19/10/21 18:43:04.52 Kc9FjQwr.net
boostにリングバッファのクラスあるよ

550:蟻人間 ◆T6xkBnTXz7B0
19/10/21 18:50:23 LVq8IpRv.net
天才だから自分でリングバッファ作った。
URLリンク(github.com)

551:蟻人間 ◆T6xkBnTXz7B0
19/10/21 19:22:51 ICV7tWge.net
バッファがいっぱいになったらどうしよう?

552:537
19/10/21 19:27:27 iqf1snDW.net
>>540
それらの同期機能って標準C++のクラスだけで実現できるもんなの?

553:デフォルトの名無しさん
19/10/21 19:30:51 Kc9FjQwr.net
>>546
捨てるしかないだろ

554:デフォルトの名無しさん
19/10/21 20:56:31 NgTxqwl+.net
>>547
どこまでを標準と言ってるのか知らんけどお前の考える標準でスレッドをサポートしてるならたいてい同期機構もあるはず

555:蟻人間 ◆T6xkBnTXz7B0
19/10/21 21:02:21 LVq8IpRv.net
>>547
WindowsではCriticalSection, CreateMutexなどがあったからC++11以前でも使えた。
C++11からstd::mutex, std::lock_guardなどが使えるぞ。

556:デフォルトの名無しさん
19/10/22 00:25:01 IM/z9Y8P.net
ロックフリー的ななんか無かったっけ?

557:蟻人間
19/10/22 16:18:00.26 QN5InCe0.net
リングバッファの排他制御どうするか?
push/popごとにロックかけたら遅くなりそう。

558:デフォルトの名無しさん
19/10/22 16:36:38.23 LzjGZCpL.net
>>545
stlライクにしてる割にコピーやムーブが内部の値ベースなのおかしくない?

559:デフォルトの名無しさん
19/10/22 17:03:31.86 mzkWHCb9.net
用途的に
reader 1
wrtier 1
だと思うけどそれならwait freeな実装が可能
read pointer/writer pointerで制御するやつね
かつかつに最適化するならこれ
しかしその前にどれだけの頻度と長さで排他の衝突するか見た方がいい
リアルタイムのオーディオなら短くても5msec周期とかじゃないか
かつlock中に多少のメモリの読み書きやってるだけなら排他が必要な時間は短い
なら素朴にmutex1個でのロックで十分な可能性も高い
同期のミスはデバッグがつらいから不用意に難しいことしない方がいい
もしくはある程度のバッファリング(遅延)が許容できるとか、固定長の処理であるなら
ならバッファを複数用意してダブル、トリプルバッファ的な制御でもいいだろう
つまりwriter側でバッファに全部書き終わったらそのバッファをreader側のキューにいれる
reader側は全部読み終わったらwriter側のキューに戻す
っての
とにかく原則どおりまずシンプルにミスなく作って計測して最適化ね

560:デフォルトの名無しさん
19/10/22 17:19:01.36 mzkWHCb9.net
ringのソース見たけど
おれはm_full なしでやるのが好みだな
つまりm_front_indexとm_back_indexが一致するのはemptyのときのみ
full時には実際は1個空きがある状態
これを推し進めればwait freeの実装に近づけるぞ
車輪の再発明だが勉強にはなる

561:デフォルトの名無しさん
19/10/22 17:21:45.79 2ZhQSHmS.net
>>551
std::atomicとかあるね
原理的に競合が起きないやつ

562:蟻人間
19/10/22 17:29:01.30 QN5InCe0.net
まずは記憶媒体の性能を計測してみた。
URLリンク(github.com)
URLリンク(twitter.com)
これはSSDの場合だ。HDDでも同様に計測しないといけない。
(deleted an unsolicited ad)

563:蟻人間
19/10/22 17:43:23.84 QN5InCe0.net
static DWORD s_dwTick;
printf("write: %ld, %ld\n", cbToWrite, GetTickCount() - s_dwTick);
s_dwTick = GetTickCount();
// 最高の音質での出力。
write: 3900, 15
write: 3900, 0
write: 3900, 16
write: 3904, 16
write: 3900, 0
10msecごとに音声データがおよそ3900バイトあるようだ。

564:デフォルトの名無しさん
19/10/22 18:28:33.04 HSQTG8Jj.net
>>558
Win32APIや音声仕様はC++じゃないのでよそでどうぞ。>蟻人間

565:蟻人間
19/10/22 19:41:50.02 +0Lq2R8m.net
>>553
具体的にどうやればいい?

566:蟻人間
19/10/22 20:08:29.90 +0Lq2R8m.net
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
スレリンク(tech板)
こっちに移動します。回答者に感謝します。

567:デフォルトの名無しさん
19/10/22 21:35:58.70 SC+tqfVH.net
Win32APIって何だよ
20年前からタイムスリップでもしてきたか?

568:
19/10/22 21:43:35.88 afWm6mlf.net
>>562
win32api(64bit版)で書くのが正義、という価値観もまだまだ存在するようです

569:デフォルトの名無しさん
19/10/22 23:33:30.81 QUuuj0zF.net
C++11からできた属性構文あるけどこの属性は宣言にだけつければOK?
定義にも同じ属性を記載するべき?

570:デフォルトの名無しさん
19/10/23 00:34:15.61 kAyiuXKe.net
>>563
それはお前だけの価値観だろハゲ

571:デフォルトの名無しさん
19/10/23 00:50:12.41 /s0IRa9G.net
>>563,565
Mozilla Firefoxなどサードパーティ大手は今もWin32APIをネイティブに使っており.NETを使ってない。

572:はちみつ餃子
19/10/23 01:51:47.45 GER+FSVM.net
>>562 は .NET より WinRT とかを想定している気がするが。

573:デフォルトの名無しさん
19/10/23 02:03:48.66 my1FePPi.net
単に64bitのWindows APIもなぜかwin32と呼ばれ続けてること知らないんだろ

574:デフォルトの名無しさん
19/10/23 06:28:47.24 /lpUBik0.net
それこそ20年前からタイムスリップしたのかって話だなw

575:デフォルトの名無しさん
19/10/23 18:08:41.93 bvZ5IXVl.net
速度重視な場面ならWin32APIは今でも普通に使う

576:デフォルトの名無しさん
19/10/23 20:43:18.87 R0F6kh0V.net
うわぁ・・・

577:デフォルトの名無しさん
19/10/23 21:15:01.42 kC3TvNwV.net
正直なところWin32APIで速度でるの?

578:デフォルトの名無しさん
19/10/23 21:30:55.10 /s0IRa9G.net
>>572
「Linuxシステムコールで速度でるの?」という質問と同じくらい矛盾に満ちた質問。
Win32APIも含めシステムコールはOSが提供するAPIなので、プログラマは他の手段で代替しようない。

579:デフォルトの名無しさん
19/10/23 21:35:56.58 H9cLmi0l.net
Native APIがあるじゃろ

580:デフォルトの名無しさん
19/10/23 22:12:26.70 B7dtMHRy.net
Visual C++ 2015なんですが、
goto文でERRORというラベルに飛ばそうとしたら、コンパイルエラーが出ました。
ERRにしたらコンパイルできるようになったんですが、
なぜERRORのラベルはダメなんでしょうか?

581:蟻人間
19/10/23 22:22:13.25 bxABcYeD.net
>>575
<wingdi.h>に#define ERROR 0がある。

582:デフォルトの名無しさん
19/10/23 22:22:30.17 R0F6kh0V.net
#undef ERROR

583:デフォルトの名無しさん
19/10/23 22:24:20.08 H9cLmi0l.net
単語1つのラベルなんか使うなってこった

584:デフォルトの名無しさん
19/10/23 22:28:23.69 R0F6kh0V.net
いやC++ではマクロが悪だ

585:575
19/10/23 22:32:44.87 B7dtMHRy.net
ERRORのdefineがあるんですね・・・!
ありがとうございました!

586:デフォルトの名無しさん
19/10/24 09:12:01.73 m57JSwXI.net
クソみたいなマクロにsmallもある
他にもwindows.hには地雷が入念に仕込まれてる
普通の神経の人間が爆死して厭らしい人間だけが生き残るように整えられている厭らしい環境がwindows.hだよ
マトモな人間にはまず耐えられない
頭のオカシイ厭らしい人間だけが残るように設計されているのがwindows.h
このヘッダは頭がおかしい

587:デフォルトの名無しさん
19/10/24 13:45:08.38 VURCQr2T.net
>>581
お前の頭がおかしいだけだと思う

588:デフォルトの名無しさん
19/10/24 13:57:45.03 SfEmAS3k.net
林檎だってcheckマクロでBoostに大迷惑かけてるしお互い様

589:デフォルトの名無しさん
19/10/24 17:59:23.36 0EVcBOG9.net
>>582
そこは
ヘッダだけにな
と言ってやるところだろ

590:デフォルトの名無しさん
19/10/24 18:05:45.17 pgieaG2c.net
ヘッダ「嫌ならincludeするな」

591:デフォルトの名無しさん
19/10/24 19:57:40.06 WiWlXxwu.net
このスレはみんなWindows嫌いなのかな

592:デフォルトの名無しさん
19/10/24 20:17:56.94 TRYJth0S.net
んなわけない

593:デフォルトの名無しさん
19/10/24 21:28:21.53 hxYU3Lux.net
たしかmaxとかもマクロ定義されてたよね
初心者のころはどハマリして殺意がわいたわ

594:デフォルトの名無しさん
19/10/24 21:49:18.24 omM/Gkq5.net
いまはIDEが色変えてくれるからすぐわかるから別にいいけどね

595:デフォルトの名無しさん
19/10/24 23:20:19.58 M5uvwdA8.net
マクロがあればなんでもできる

596:デフォルトの名無しさん
19/10/24 23:40:29.47 PIyGP0m1.net
最近ちょいちょい思うことだが、ある言語のここがどうであーだこうだと議論する場合
テキストエディタでコーディング作業してる連中と IDE でコーディング作業してる連中では
わりと大きな認識の違いがあることが多い

597:デフォルトの名無しさん
19/10/24 23:44:34.75 8Fri6DgZ.net
windows.hのマクロ回りでトラブル起こしているのは、殆んどvisual studio使用者だと思うのだが

598:デフォルトの名無しさん
19/10/25 00:24:04.41 AZBzSxe6.net
認識の違いはコンパイラによるものであってコードエディタは関係ない。

599:デフォルトの名無しさん
19/10/25 00:39:26.61 ghRRxqDU.net
モジュールでマクロとか気にしなくて良くなる(なるといいなぁ...)

600:デフォルトの名無しさん
19/10/25 07:52:28.01 51G3P59H.net
コンパイラ変えてもマクロは変わらんでしょ
せいぜいエラーメッセージ変わるぐらいじゃ

601:デフォルトの名無しさん
19/10/25 09:14:30.39 AZBzSxe6.net
>>595
何言ってるのか意味がわかりにくいエラーメッセージを吐くのはコンパイラでしょ。

602:デフォルトの名無しさん
19/10/25 12:19:38.16 51G3P59H.net
マクロは影響範囲わからんからなんとも
vcでマクロがテンプレートに影響したらマジでわからん
clangはテンプレートのエラーメッセージわかりやすいとかみたな

603:デフォルトの名無しさん
19/10/25 12:45:17.61 yKAgzXLG.net
>>593
お前はまず日本語を正しく認識できるようになれよ…
>>591は連中(=人間)の認識の話な

604:デフォルトの名無しさん
19/10/25 17:33:51.00 AZBzSxe6.net
初心者であればあるほど親切なエラーメッセージが必要なのだけど、VCのエラーメッセージはgccに比べて不親切な印象がある。
STL関連のエラーメッセージは、わかりにくい代表格。かたやgccはprintf系の書式ミスを指摘してくれるなど初心者に優しい。

605:デフォルトの名無しさん
19/10/25 18:03:22.82 AZBzSxe6.net
C#が使いやすいと思っている人は、Visual Studioの入力補完に救われていることに気づいていない。
Visual Studioがなければヘッダーファイル相当のgrep検索もままならない不便な言語であると感じるだろう。

606:デフォルトの名無しさん
19/10/25 18:50:41.74 StYWqeWG.net
VS込みでいいじゃん
どうせC#なんて大半がWindows向けなんだしVS使える環境で開発してるでしょ
って変なこと言うと思ったらADSLか

607:デフォルトの名無しさん
19/10/25 19:00:26.80 r/2esNbS.net
referencesource.microsoft.comみたいなありがたいものがあるのに

608:デフォルトの名無しさん
19/10/25 19:58:41.60 q2iK2L4t.net
基本的には MSDN こそ C++ である。

609:デフォルトの名無しさん
19/10/26 00:56:44.62 7AoWPXY8.net
class A{};
namespace N
{
class B{
friend class A;
int i;
};
class A{
A(){b.i = 0;}
B b;
};
};
これをコンパイルできるようにするにはどうすればいいですか?
・クラスAを名前空間Nの下に書く
・名前空間NのクラスAを別の名前にする
・最初のクラスAを別の名前にする
これ以外でできますか?

610:デフォルトの名無しさん
19/10/26 00:59:53.57 SyjizfQh.net
全部消す

611:デフォルトの名無しさん
19/10/26 01:35:09.91 dcsgYCXg.net
>>604
「コンパイルできるようにする」
というだけであれば、何も修正しない元のままでもコンパイルできるはずだし、
最初の class A {} の行をコメントアウトする、消す。
Nの中のAを消す、namespace N {・・・} の部分を全部消す、
などなどいくらでも有りえる。

612:デフォルトの名無しさん
19/10/26 06:20:26 3CUGZWDU.net
BのfriendをN::AにしたいってことであればNとBの間にclass A;とAの宣言を入れる
これ以上のエスパーは無理

613:デフォルトの名無しさん
19/10/26 08:16:08.08 kGqH5EJJ.net
>>604
g++だと、現状のままでok
vs2019は、friend宣言の対象が::AになっていてC2248
::Aをコメントアウトするとok
正しいのはg++
N4713 6.4.1. Unqualified name lookup (7.4)
Note: When looking for a prior declaration of a class or function
introduced by a friend declaration, scopes outside of the innermost
enclosing namespace scope are not considered; see 10.3.1.2.

614:デフォルトの名無しさん
19/10/26 21:50:06.24 JNlbd3QN.net
投稿テスト
N3337 3.4.1 Unqualified name lookup
Note: When looking for a prior declaration of a class or function
introduced by a friend declaration, scopes outside of the innermost
enclosing namespace scope are not considered; see 7.3.1.2.

615:デフォルトの名無しさん
19/10/26 22:03:59.61 JNlbd3QN.net
vs2019で::Aをコメントアウトするとokの意味がわからんorz

616:デフォルトの名無しさん
19/10/27 08:17:56.25 /F19lavA.net
試してないが、理論上はこれでいけるはず :
namespace N
{
class A;
class B{
int i;
friend class A;
};
class A{
B b;
A(){b.i = 0;}
};
};

617:デフォルトの名無しさん
19/10/27 08:27:09.91 C3DsRDjK.net
N::Aを前方宣言するなら、宣言を名前空間Nの中に入れるかN::Aで宣言する必要があるってのはC++の規約通りじゃないのか?
>>608が意味わからん

618:デフォルトの名無しさん
19/10/27 09:08:16.09 M7FyKfzv.net
friend宣言は、当該宣言を含むクラスが属するスコープを対象とし
なおかつ、対象スコープに識別子を導入しない
class G
{
friend class A; //::A
};
namespace H
{
class I
{
friend class A; //H::A
};
}

619:デフォルトの名無しさん
19/10/27 12:21:23.69 C3DsRDjK.net
>>604はfriend宣言ではなく前方宣言の問題なんだが?

620:デフォルトの名無しさん
19/10/27 14:03:45.40 M7FyKfzv.net
いや前方宣言は関係ない
「もし」::Aがあったら、H::Aがあったら
と言っているだけのものだ

621:デフォルトの名無しさん
19/10/27 14:25:39.88 vcUKQgsd.net
>>614
前方参照をfriendがどう解釈するかの問題だろ

622:デフォルトの名無しさん
19/10/27 15:28:12.27 itfBjV2c.net
>>616なのは明白だが
>>604のコードのどこにコメントアウトすべき::Aがあるのかわからん…
ひょっとして、>>604が禁じていないのを良いことに、
最も外側のclass A{};を丸ごとコメントアウトしようとしている?

623:デフォルトの名無しさん
19/10/27 15:53:16.22 ho9vIROt.net
>>617
???
>>608はVisual Studio 2019(2017でも同じだったが)の話だと言うことは理解できてるか?

624:デフォルトの名無しさん
19/10/27 15:56:22.52 M7FyKfzv.net
>>617
そのとおりだが?
//class A{};
namespace N
{
class B{
friend class A;
int i;
};
class A{
A(){b.i = 0;}
B b;
};
};
friend宣言が識別子を導入したり
関係ないはずのグローバルに干渉するなど
vcはfriendにクセがある

625:デフォルトの名無しさん
19/10/27 16:07:13.81 6193c9It.net
規格的にはどうなるのが正しいの?
むしろ、もとの話がどうしたいのかに依る気がしないでもない

626:デフォルトの名無しさん
19/10/27 16:13:20.11 rrcAfXPk.net
>>620
規格の話は>>608じゃねーの?
コンパイルできるようにするにはg++にするかVisual Studioなら>>619みたいにするってことでしょ
それ以外なら環境を提示してねってことかと

627:デフォルトの名無しさん
19/10/27 16:22:22.30 itfBjV2c.net
>Visual Studioなら>>619みたいにするってことでしょ
URLリンク(festy.jp)
>>604
>・最初のクラスAを別の名前にする
と何が違うんだそれ

628:デフォルトの名無しさん
19/10/27 16:55:17.47 rrcAfXPk.net
>>622
一緒だよ
だからそれができないならg++(とか他のちゃんと規格準拠して処理系)にしろって書いてあるだ
まあVisual Studioが規格準拠するのを待つとかMSにねじ込むか金払って対応してもらうとかでもいいけどw

629:デフォルトの名無しさん
19/10/27 20:50:09.77 5FCyBaq0.net
トンチンカンな質問かもしれませんが許して。
<Base>のコンテナを巡回しながら
Base派生の多態性を引数で実現、みたいなことがやりたいのです。
URLリンク(ideone.com)
これのManager::update()が、このままだと当然
func(shared_ptr<Base>,shared_ptr<Base>)を呼ぼうとしてしまう訳ですが
宣言してあるfunc(A,A)とかfunc(A,B)とかfunc(B,B)とかが
呼ばれるようにするにはどうしたらいいですかね?
あるいは、ガラっとコード変わってもだいたい似たようなことを実現するとしたら
どう書きますか?

630:デフォルトの名無しさん
19/10/27 20:52:12.38 oi2VB0wA.net
シェアポの配列を作って添え字で切り替え。

631:デフォルトの名無しさん
19/10/27 20:54:15.22 oi2VB0wA.net
あ、すまん。誤読していた。
>>宣言してあるfunc(A,A)とかfunc(A,B)とかfunc(B,B)とか
多態やってる意味を潰しに来てないか?

632:蟻人間
19/10/27 20:54:19.69 irXhIBVc.net
>>624
funcを仮想化すれば?

633:蟻人間
19/10/27 20:59:49.33 cNZwDfUU.net
もしくはfuncでは仮想化された関数しか使わないとか。

634:デフォルトの名無しさん
19/10/27 21:09:28.45 aWGByvYb.net
>>624
visitorパターン

635:642
19/10/27 21:09:54.33 5FCyBaq0.net
>>627
func(Base,Base)だけをvirtualってこと…ですよね?
え、こういうときにもvirtualて使えるの?と思って試したけどダメですね。
>>628
もうちょっと考えてみますけどたぶん難しいです

636:624
19/10/27 21:14:40.36 5FCyBaq0.net
名前欄間違えてた…
>>629
あー…それかも
なんとなく知ってるだけで
まだ実装したことはないですが
それ正解かもしれません
調べつつやってみます

637:デフォルトの名無しさん
19/10/27 21:34:36.36 4WtkkchW.net
>>624
愚直に dynamic_cast で N*N 分岐からはじめたら?

638:デフォルトの名無しさん
19/10/27 22:12:39.30 5au4GxkL.net
2引数ならdouble dispatchとか

639:デフォルトの名無しさん
19/10/27 22:14:23.71 SYtHJPpD.net
派生クラスの種類が決まっているなら
variantに置き換えたらvisit使えるから簡単

640:デフォルトの名無しさん
19/10/28 05:15:43.29 VJWcm+Z+.net
>>624
こうゆうことやのうて?
URLリンク(ideone.com)

641:デフォルトの名無しさん
19/10/29 01:15:36.46 Vnr+WSpj.net
C++でCOM扱うの苦痛すぎる
何が正攻法なのかさっぱりわからん

642:蟻人間
19/10/29 01:32:18.86 CdNgVa0z.net
>>636
ATL
CComPtr

643:デフォルトの名無しさん
19/10/29 01:41:40.05 Vnr+WSpj.net
別にCOMは作るんじゃないんだよ。
参照するだけなんだよ。
それでもATLなんーーーーーーーーー?

644:デフォルトの名無しさん
19/10/29 01:43:16.61 Vnr+WSpj.net
そもそも文字コードどうなってるんやーーーー
コマンドプロンプトに出す時、どうするんやーー
現在のchcpの設定に従って変換線といかんのカーーーーーー

645:蟻人間
19/10/29 02:28:13.51 OOQqvLIR.net
変換なんてWideCharToMultiByte使って一つ変換関数作ってその関数を使い回せばいいやん。

646:デフォルトの名無しさん
19/10/29 02:42:32.11 /DWax9vx.net
WriteConsoleW

647:デフォルトの名無しさん
19/10/29 04:01:15.69 ymnLB/52.net
>>640
Unicode文字列(絵文字とか)が文字化けするんだよー!
フォントの問題でないことは確認済み

648:デフォルトの名無しさん
19/10/29 04:07:41.50 ymnLB/52.net
例えばググって見つけた、こことか
URLリンク(www.t-net.ne.jp)
wchar_t を const wchar_t にするのはまあいいとして、
日本語はOKだけど絵文字とか化けるじゃねーか
わーけわかねなんdfっrね;jk

649:デフォルトの名無しさん
19/10/29 04:13:15.89 ymnLB/52.net
ん?WideCharToMultiByteってShiftJISに戻すやつじゃねーのか?
俺はUnicode文字すべてを表示したいだけだぞ

650:デフォルトの名無しさん
19/10/29 04:20:56.50 xS90z6YC.net
chcpくらい使えよ

651:デフォルトの名無しさん
19/10/29 04:26:03.90 /DWax9vx.net
windowsのコマンドプロンプトはまだ絵文字とかに対応してないよ

652:デフォルトの名無しさん
19/10/29 04:29:31.79 YQKoC2Uo.net
>>646
全てではないだろうけど対応してる。

↑文字化けしそうだけど、横向きのハートとか
❤ とか

653:デフォルトの名無しさん
19/10/29 04:29:44.12 YQKoC2Uo.net
お、文字化けしなかったw

654:デフォルトの名無しさん
19/10/29 04:30:10.10 YQKoC2Uo.net
?????
Jane経由だとだめだろうな

655:デフォルトの名無しさん
19/10/29 04:31:42.98 YQKoC2Uo.net
>>645
chcp 65001にしてもムダだったぞ

656:デフォルトの名無しさん
19/10/29 04:54:41.95 pnjVF+Pb.net
コマンドプロンプトよりJaneは早く絵文字に対応しろ

657:デフォルトの名無しさん
19/10/29 05:06:04.44 xS90z6YC.net
>>650
それutf8じゃねーか

658:デフォルトの名無しさん
19/10/29 05:14:54.35 YQKoC2Uo.net
>>652
ぐぐってからいえwww

659:デフォルトの名無しさん
19/10/29 05:19:50.17 YQKoC2Uo.net
なんでコードページ932なのに、NSimSunにすると
日本語以外もちゃんと表示できるのかわからない

660:デフォルトの名無しさん
19/10/29 05:26:40.69 xS90z6YC.net
wcharがutf8なのか?あほか?

661:デフォルトの名無しさん
19/10/29 05:36:55.26 YQKoC2Uo.net
Visual StudioのソースコードのデフォルトはBOM付きUTF8なんだな

662:デフォルトの名無しさん
19/10/29 06:38:53.94 d5obkYRE.net
Windows依存の話は、以下すれでどうぞ。
Win32API質問箱 Build125
スレリンク(tech板)

663:デフォルトの名無しさん
19/10/29 12:08:17.89 HlsBbRfa.net
自分の理解と違ってたので教えてください。
class hoge{
hoge(){}
hoge(const hoge& h){}
~hoge(){}
}
hoge func(){
hoge h;
return h;
}
main(){
hoge h = func();
}

この時、引数なしコンストラクタとコピーコンストラクタ、デストラクタが2回呼ばれると理解してたんだけど、実際動かすとコンストラクタとデストラクタが1回づつしか呼ばれない。
理由ってなんですか?
ちなみにgccで、c++03、c++11でも同様の結果でした。

664:はちみつ餃子
19/10/29 12:09:55.91 0JV7MfqT.net
>>658
RVO でググって

665:デフォルトの名無しさん
19/10/29 12:10:21.23 gvGgQxyJ.net
最適化で消された

666:デフォルトの名無しさん
19/10/29 12:14:30.49 HlsBbRfa.net
>>659
まさにピンポイントでした。
ありがとうございます。

667:デフォルトの名無しさん
19/10/29 13:58:53.43 cpD/FVFn.net
>>636
node.js

668:はちみつ餃子
19/10/29 13:59:57.20 0JV7MfqT.net
>>636
マイクロソフトのコンパイラならまあまあ補助があったりするでしょ。
それでも面倒くさいことにかわりないけど。

669:デフォルトの名無しさん
19/10/29 15:55:18.54 VnX4qZP9.net
失礼します。テストです:
ハート:❤
横向きハート:❥

670:はちみつ餃子
19/10/29 16:08:16.15 0JV7MfqT.net
>>664
失礼な奴だな!

671:デフォルトの名無しさん
19/10/29 18:43:54.18 NclFvQSb.net
>>663
補助なんてあったっけ?
まあ俺の知識はもう5年以上前の知識だから最近はちょっとはマシになったのかな

672:デフォルトの名無しさん
19/10/29 21:55:11.67 daQRKG1l.net
typedef const struct {
int i;
int j;
} X;
X arr[2] = {
{1,3},
{2,4}
};
int main() {
X *ptr = arr;
printf("%d %d %d <- always zero", ptr->i, (ptr+1)->i, (ptr-1)->i);
return 0;
}
グローバル const struct の配列のアドレスを上に行ったら、常に0が入ってるんだけど、
これは、どのハードウェアでもこうなると仕様と決まってるの?

673:デフォルトの名無しさん
19/10/29 22:07:48.92 VnX4qZP9.net
>>667
決まってない。
範囲外のアクセスなので、本来は絶対にやってはいけない。
読むだけでも不法例外が起きてしまう可能性もあるが、
書くのはもっとダメ。
たまたま、コンパイラシステムが何らかの目的で使っている
グローバル変数が arr 配列の直前にい配置されていて、
それが0になっているか、padding領域がたまたまそこにある
だけだと考えられる。

674:デフォルトの名無しさん
19/10/29 23:33:23.00 B0gwdLKJ.net
.bssは0初期化されてる

675:デフォルトの名無しさん
19/10/30 04:47:43 oMdYt0Tq.net
オブジェクトがスタックに作られてるかヒープに作られてるかってどうやって調べるの

具体的にはboostのmulti_arrayがどっちに作られてるか知りたい

676:デフォルトの名無しさん
19/10/30 06:54:34.02 2wpdugOW.net
>>668
そりゃそうか。0で埋まってりゃコードが少し短くなって助かるんだが、まあやめとこう。

677:デフォルトの名無しさん
19/10/30 07:31:59.85 yREk150+.net
>>670
アドレスでわかる
正しくはリンカからロケーションを取得だが
簡易的には自動変数のアドレスと上の方の桁が同じかどうかでも見当はつく

678:デフォルトの名無しさん
19/10/30 09:19:14.69 C/RG5q83.net
>>670
アドレスでも分かるが、それはスタック領域のアドレス範囲をマップファイル
やEXEヘッダなどから読み解かないといけないので、boostのソースを読むのが
一番楽。
もう一つは、
1. auto local変数でint a; printf( "%08X", &a );としたもの
2. global 変数で、int g_b; printf( "%08X", &g_b );としたもの
3.ヒープの先頭アドレスを調べるため、int *p_c = new int[16];
 printf( "%08X", p_c );としたもの
で表示されたアドレスと boost の multi_arrayのアドレスとを比較して、
上位アドレスが近いかどうかで判別できる。1,2,3のそれぞれはまとまった
領域のアドレスを使っているので、推定ではなく断定できる。

679:デフォルトの名無しさん
19/10/30 09:33:17.69 scNMtFri.net
どう考えてもヒープだろ

680:デフォルトの名無しさん
19/10/30 09:45:24.54 vMK+Q7lg.net
>>670
ローカルスコープだけがスタック。
newしたものはヒープ。

681:デフォルトの名無しさん
19/10/30 11:38:54.67 M6J6raPE.net
コンテナの場合はスタックに置いたつもりでも、コンテナがデータ部分を内部でnewするとかそういう話だろ

682:はちみつ餃子
19/10/30 12:07:14.45 qu4eF7c5.net
>>667-668
仕様上は配列の範囲外を指すポインタを作るのさえも未定義。
たとえアクセスしなくても。
なので、 ptr-1 という式の時点で未定義動作になる。
ただし、アクセスしないなら配列の最後の要素より一個うしろを指すポインタを作るのは許される。
つまりこの例で言えば ptr+2 や &ptr[2] は有りだけど ptr[2] は駄目。
&ptr[2] は ptr[2] に対して & を付けているので一見すると途中で ptr[2] を評価しているように見えるけど、
・ ptr[2] は (*(ptr+2)) の構文糖である
・ * の結果に & を適用している場合には * も & も評価されず、両方とも取り除いたのと同じことになる
というルールの合わせ技によって &ptr[2] は ptr+2 と同じ意味になる。
ちなみに、配列ではないオブジェクトは要素が一個の配列と同じレイアウトを持つことは保証される。

683:デフォルトの名無しさん
19/10/30 12:14:10.66 pPHw66rS.net
>>677
&*p を p とみなす特別ルールは C の規格にあるけど C++ には無かったりする。
もう10年以上審議中。 URLリンク(wg21.cmeerw.net)

684:デフォルトの名無しさん
19/10/30 12:21:16.92 C/RG5q83.net
>>677
>ちなみに、配列ではないオブジェクトは要素が一個の配列と同じレイアウトを持つこと>は保証される。
しかも、TYPE arr[N] の場合、それぞれの要素間隔であるところの
&arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
struct TXxx { BYTE a[3] }; のように中途半端な内容を持っている場合、
標準的には、sizeof(TXxx)は最後のpaddingまで含めた4になる。
その結果、古くからCの仕様書に載っている通り、
 &arr[k] = (TYPE *)(((BYTE *)arr) + sizeof(TYPE) * k)
の式が常に厳密に成り立つことが保証される。

685:デフォルトの名無しさん
19/10/30 12:25:41.94 C/RG5q83.net
>>678
operator&(), operator*() をユーザーが定義した場合には、それに従うが、
定義しなかった場合、&*pX == pX が どんなポインタ pX についても
成り立つことは保証されるはず。

686:デフォルトの名無しさん
19/10/30 13:28:14.72 JDSjHFuf.net
>>670
一般的なPC環境なら、
適当に用意した別の関数を呼び出して(multi_arrayのインスタンスがまだ有効で、インスタンス生成したスレッドと同一スレッドからなら、どこから呼び出してもよい)、
その関数のローカル変数のアドレスよりも&multi_array[0]の値のほうが大きければ、multi_arrayのデータ領域はスタックに確保されたと判断できるのでは

687:デフォルトの名無しさん
19/10/30 13:38:23.28 C/RG5q83.net
>>681
自分も最初、同じような勘違いをしていたが、
シングルスレッドの場合に限定すれば、
スタックの構造からすれば、最初に確保したローカル変数のアドレスが、
そのごろのローカル変数のアドレスよりも必ず大きい。
そして、ヒープから確保したオブジェクトのアドレスは、必ずそれらよりも大きい。
なので、後から別の関数を呼び出す必要はない。
main()関数の中で最初に定義したローカル変数のアドレスが分かればそれで十分。

688:デフォルトの名無しさん
19/10/30 13:39:27.23 C/RG5q83.net
>>682
誤:そのごろのローカル変数のアドレスよりも必ず大きい。
正:その後のローカル変数のアドレスよりも必ず大きい。
早い話が、スタックは、上下逆になっていることが味噌。

689:デフォルトの名無しさん
19/10/30 16:43:27.90 iACLsVPd.net
0 埋め勝手に期待してると
Debug build と Release build の変化ではまるんじゃね

690:デフォルトの名無しさん
19/10/30 18:21:24.13 sLIKMMS8.net
未定義動作に頼って幸せになった人間はいない

691:デフォルトの名無しさん
19/10/30 18:25:45.90 PFJwOjFS.net
問題は未定義動作が多すぎることだ

692:デフォルトの名無しさん
19/10/30 19:14:52.52 NnKRxbK9.net
>>682
> そして、ヒープから確保したオブジェクトのアドレスは、必ずそれらよりも大きい。
スタックエリアとヒープエリアの前後関係なんて決まってたっけ?

693:デフォルトの名無しさん
19/10/30 19:53:22.92 /8g3afGg.net
c++なら暗黙に0で初期化するところでcだと死ぬ

694:はちみつ餃子
19/10/30 20:10:37.29 qu4eF7c5.net
Boehm GC にスタック・ヒープの範囲を判定する部分があったはず。

695:デフォルトの名無しさん
19/10/30 20:42:33.17 MNbPntdA.net
>>682
ヒープから確保したアドレスがスタックより大きいっていうのはかなり特殊な環境では?

696:デフォルトの名無しさん
19/10/30 20:46:40.08 7FaQcqiv.net
>>682
スタックとヒープのアドレスに前後関係の縛りなんかねえよ
互いに全く別個のデータ構造で相互に依存関係はない

697:デフォルトの名無しさん
19/10/30 21:02:17.94 xN/ut28D.net
お前ら甘いぞ
ヒープから確保したメモリをスタックにすることもできるんやで
逆にいうとスタックの情報もとれる
pthread_attr_getstackな

698:デフォルトの名無しさん
19/10/30 21:28:56.04 KWwo/1iW.net
URLリンク(ideone.com)
デストラクタを後から書き換えるってできなかったっけ?

699:デフォルトの名無しさん
19/10/30 21:37:47.50 scNMtFri.net
なんで出来ると思ったのか

700:デフォルトの名無しさん
19/10/30 21:41:50.59 /8g3afGg.net
おまえらはなんですぐ破壊的なメモリアクセスしようとするんだよ。

701:デフォルトの名無しさん
19/10/30 21:44:55.49 KWwo/1iW.net
>>694
なんでだろ・・・。
できなそうだな。さんきゅー。

702:デフォルトの名無しさん
19/10/30 21:47:25.90 M6J6raPE.net
変にトリッキーなことをせず普通に書けば平和なのに

703:デフォルトの名無しさん
19/10/30 21:51:21.63 Z1e8Gfkt.net
平和を求めるならc++使わないことだな

704:デフォルトの名無しさん
19/10/30 21:56:38.45 Z1e8Gfkt.net
>>696
virtualでないと子のデストラクタは呼ばれないってのとごっちゃになってるとか?

705:デフォルトの名無しさん
19/10/30 21:57:32.16 /8g3afGg.net
>>698
平和は求めるが性能も求めるから仕方なく使うのがc++だよ、馬鹿。

706:デフォルトの名無しさん
19/10/30 22:07:52.76 KWwo/1iW.net
>>699
多分それだ。もやもや取れたわ。ありがとう。

707:デフォルトの名無しさん
19/10/30 22:15:48.21 Z1e8Gfkt.net
>>700
お前moveだからコピーコストゼロ!カロリーゼロとか言ってるだろ

708:デフォルトの名無しさん
19/10/30 22:18:45.46 T2yRPHdv.net
>>693
正直何をしたいのかさっぱりわからん

709:デフォルトの名無しさん
19/10/31 00:30:04 Mfb82uAb.net
>>687
なるほど、想定していたのは、Windows環境限定だった。

710:デフォルトの名無しさん
19/10/31 01:11:19 Z73hoFPo.net
>>679
> &arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
いや、 &arr[k + 1] - &arr[k] は 1 でしょ。

> その結果、古くからCの仕様書に載っている通り、
>  &arr[k] = (TYPE *)(((BYTE *)arr) + sizeof(TYPE) * k)
> の式が常に厳密に成り立つことが保証される。
少なくとも C++ の規格にもそんな保証は載ってないよ。
逆に、 TYPE が BYTE と一致するような場合を除いて、動作は未定義になると明記されてる。
URLリンク(timsong-cpp.github.io)

たぶん C の規格にも無かったと思うんだけど、「Cの仕様書」って何のこと言ってるの?

>>680 も、規格で保証されると言ってるなら誤り。
特定の実装(特に C もサポートしてる実装)では保証されているとか、
保証されてないと困るという話ならそうなんだろうとは思うけど。

711:デフォルトの名無しさん
19/10/31 07:54:20 CWgnmwch.net
保証は知らんけどアドレス計算だから1じゃなくてsizeofの値じゃないのそれ
あとだめならベクタで&v[x]みたいのも未定義になっちゃうけども

712:はちみつ餃子
19/10/31 12:29:41.78 /W+zTx1p.net
>>705
俺も仕様としての保証はないと思う。
C の規格を見て関連しそうな項目として
- ポインタを型変換して変換後のアライン (処理系定義) が正しければそれを元の型に再変換したものは変換前と等しい
- ポインタを別のポインタに型変換した後のアラインが正しくなければ未定義
- ポインタを文字を指すポインタに型変換した場合、オブジェクトの最も低位のアドレスを指す
- 文字を指すポインタに変換されたポインタは元のオブジェクトの大きさまで連続して増分すると
  そのオブジェクトの残りのバイトへのポインタを順次生成できる
(注:ここで言うポインタには関数ポインタを含まない)
という保証は見つけられたので
(((BYTE *)arr) + sizeof(TYPE) * k)
までは妥当な式と言えると思うんだけど、 (TYPE *) というキャストが出来る根拠は見つけられなかった。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch