C++相談室 part164

■ このスレッドは過去ログ倉庫に格納されています
2023/05/09(火) 11:50:52.06ID:EYc2I7oW0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part163
https://mevius.5ch.net/test/read.cgi/tech/1672409791/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/05/25(木) 01:41:17.05ID:WiPfB6bJ0
される
規格上はstdに含まれる値(オブジェクト)はユーザーコードで参照されたら(特別の規定がない限り)常に有効でなければならない
2023/05/25(木) 08:37:46.24ID:2LyQ/gAw0
>>101
rangesのviewだろ
2023/05/25(木) 09:32:15.13ID:G3dlC7U30
>>101
> stringView = {stringView.data () + 1, stringView.size () - 1};

↑これは↓こう書いた場合と同じ。

stringView = std::u16string_view(stringView.data () + 1, stringView.size () - 1);
2023/05/25(木) 11:13:48.89ID:vvIauVZOd
>>105
一見意味不明何だけど何て記法?
2023/05/25(木) 11:49:30.93ID:tfjCiJA40
勉強中なんだけど、クラスの相互参照って気持ち悪い
2023/05/25(木) 12:04:14.41ID:tfjCiJA40
もう、慣れた
2023/05/25(木) 12:08:58.16ID:G3dlC7U30
>>106
たぶん直接的に表す用語は定義されてないと思う。

型の情報がないときは波括弧で表されたリストは initializer_list に推論されるけど
代入のときは代入演算子のオーバーロード解決時候補に関数シグネチャとして T& operator=(T&,T); が加わるので
結果としてこのとき生成される一時オブジェクトの初期化子という解釈になる。
2023/05/25(木) 13:19:23.21ID:E3OVdEtKM
Uniform initialization 一様初期化とか統一初期化?
https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html

std::initializer_listも含んだ文法だね
std::initializer_listの方か他のコンストラクタの方になるかはけっこうルールがややこし
2023/05/25(木) 19:45:10.69ID:bX845kvIM
c++はその{}の中に書くとclassの中に書いた変数が順番に初期化される
いろいろ問題があるから他の言語で採用されていない

c++は実用面で利点があると判断されたのかそのまんま
2023/05/25(木) 19:47:55.97ID:bX845kvIM
Brace initialization
https://learn.microsoft.com/en-us/cpp/cpp/initializing-classes-and-structs-without-constructors-cpp?view=msvc-170
2023/05/26(金) 06:48:21.55ID:kRDoXd150
>>105
ありがとうございます。
DTMのプラグイン(VST3)を作ってみたくて、それにはC++をある程度分かってないといけないそうなので、
参考書読んだりしているのですが、これれまでC++に全く触れてこなかったので、かなり面食らってます・・・。
サンプルのソースを見ても、いろいろな応用が含まれていて、前提となる知識がそれなりにないと分からないのかなと・・・。
2023/05/26(金) 10:03:10.85ID:qewSmBpu0
>>113
C++ の仕様には未定義がたくさんあるので実際に動作させた結果から学ぶべきではないという事情がある。
ある程度は理屈で理解しておかないと簡単に破綻するよ。
実例を見ながら雰囲気で使うってのは出来ない言語だと思う。
2023/05/26(金) 10:55:39.45ID:Yaiov3bU0
しらない間に未定義踏んでて、コンパイラ変わったりしたときに挙動が変わるやつ
116デフォルトの名無しさん (ササクッテロラ Sp03-OHH9)
垢版 |
2023/05/26(金) 11:28:17.59ID:VVS6yE6rp
>ある程度は理屈で理解しておかないと
に対しての
>実際に動作させた結果から学ぶべきではない

極端じゃね?
2023/05/26(金) 11:37:41.87ID:jtoHc2Cr0
>>113
chatgptにサンプルコードを解説させたら?
2023/05/26(金) 13:02:36.82ID:qewSmBpu0
>>116
「ちゃんとした資料を読まずに動作から何かを読み取ろうとするな」という話なので、
資料を読んだうえで手を動かして確認することまで否定してるわけじゃないよ。
少なくとも初手は入門書くらい読まんといかんという程度のことを言ってる。
2023/05/26(金) 21:10:27.73ID:u5i01UPgd
解脱させたらに見えたし
2023/05/26(金) 21:19:24.77ID:cuJor+ml0
「ワイのコードではこう動いてるからいいの!」「ワイが試したらこう動いたからこうなの!」
で突っ走った結果大爆発する事例が後を絶たない
121デフォルトの名無しさん (スプッッ Sd13-Cz+X)
垢版 |
2023/05/26(金) 21:27:57.62ID:TE50P/kBd
未定義まで行かなくても処理系依存とか未規定動作もあるからほんとにややこしい
知らず知らずのうちにコンパイラの拡張機能使ってたりもあるし

「動けばいいんだよ!」としか考えてないとどこで足元掬われるかわからん
2023/05/26(金) 22:54:23.75ID:C+URTl/Qa
んちんちんちんちんちんち
123デフォルトの名無しさん (ワッチョイ cb01-OHH9)
垢版 |
2023/05/26(金) 23:25:57.70ID:Rw5xxtFh0
>>120-121
そんな低レベルな奴見たことないけどな
居るには居るんだろうけど

あと逆にそういうのを「手を動かさない」「実用コードで試しもせずに机上の空論でマウント取る」ことの言い訳にしてる奴を最近よく見かけるのでな
2023/05/26(金) 23:42:19.49ID:mzi7SNrwM
実際VS2005ぐらいに演算の順番が決まってなくて実装依存だった
それでコードを書いてた
それがVS2007には演算順序が2005と変わってた
GCCでも別の順で計算された

どうしたらいいかわからんから多分ここに聞きにきたら未定義動作だからどうしようもない
実装依存で仕方がないと返答あり
125デフォルトの名無しさん (ワッチョイ 4b01-nxBO)
垢版 |
2023/05/27(土) 00:10:57.47ID:U8Vd2x100
自分もVCから別環境のclangに数万行のコード移したら未定義踏んでた部分あるけど、試さずにそれを最初から予知出来てたかというと無理がある
どちらかのコンパイラのバグで通らなかったりおかしな動作する場合もあるんだし(特にテンプレート周りは多い)
書いてる最中でも疑問に思ったらすぐ調べる癖がついてりゃいいんじゃないかな
2023/05/27(土) 00:12:11.79ID:ne0x12BC0
>>124 いや、文を分けて順序付けするなり、やりようはあっただろ。
2023/05/27(土) 00:24:40.55ID:bsq21T/IM
>>126
上にも書かれてるけど既存のコードのどこで問題が発生してるか全てを特定できないんだよ
2023/05/27(土) 00:41:28.44ID:LEdjjvJrd
最近のVisual C++なら「コード分析」機能でコードの改良点を教えてくれるかも知れない。
2023/05/27(土) 00:45:08.14ID:JrAUAXG20
AIが他人が書いたクソコードのリファクタリングやってくれると助かるな
2023/05/27(土) 01:23:22.98ID:D5N3c6HOa
超すごい!人間を越えた!とかワイワイさわがしいAIだが
実際にそういう感じの「マジに困ってる、やってくれたら本気で助かる」
ような事案は結局できない、という地獄
2023/05/27(土) 04:58:22.78ID:wRHxWgs90
言われたとおりやるだけ、なやつの極端な例だからな
132デフォルトの名無しさん (ワッチョイ 3bf0-TYVD)
垢版 |
2023/05/27(土) 08:03:41.82ID:hUTpNjv00
AIが人間並みの知性を持てば人間並みにエンバグしてくれるはず
2023/05/27(土) 08:08:34.97ID:ap1zYrbma
すごい!まさに人間そのもののAIじゃないか!
2023/05/29(月) 16:30:05.50ID:AteM0zCG0
責任転嫁するようになるまで人間に並んだとは認めない
2023/05/29(月) 17:54:13.71ID:I9NccWA+0
会社で嫌われるイヤな奴の特徴を全てプログラミングされたAIとか?
2023/05/29(月) 18:33:58.19ID:IrTtCTAo0
AIに相談したせいで鬱になって辞める社員が続出しそうだな
AIポイゾニングは新手のリモート攻撃として流行るかもね
2023/05/29(月) 20:15:39.44ID:I9NccWA+0
ヘイテトリスみたいな社員AI
2023/06/04(日) 08:29:54.68ID:5jvZ+YKl0
質問ですがstd::stringに格納された数値文字列を数値にしたい、
しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい、と言う場合どうす
れば良いの?
ダチャい書き方ならできうるけど人類はいつまでstrtod()や&(str[0])……
std::string str;
str ← なんか文字列入る
char* end;
double d = std::strtod(&(str[0]), &end);
if (end == &(str[0])) { エラー }
while (*end != '\0') {
 if (!std::isspace(*end)) { エラー }
 end++;
}
2023/06/04(日) 08:38:19.14ID:Wo5LOckB0
>>138 まず、こちらへ
0からの、超初心者C++相談室
https://mevius.5ch.net/test/read.cgi/tech/1542002113/
2023/06/04(日) 09:23:46.19ID:5jvZ+YKl0
誘導されたので誘導先に建てたはサーセン、
2023/06/04(日) 11:01:36.99ID:/SPLhkOjM
文字列(char配列)とstringの仕組みはダサいけど他も大体これ
さらにspanもいれる
どこも大体同じ
142デフォルトの名無しさん (ワッチョイ edf0-+LPJ)
垢版 |
2023/06/04(日) 18:06:29.89ID:HhL1J/ge0
しかしstodの「文字列が数値で始まる場合、数値化不可能な文字があっても例外は投げずに数値化出来るところまでの部分で数値化する」ってむしろ不便だよな。
2023/06/04(日) 18:43:24.19ID:XolxJINE0
charに変換して文字コード比較して範囲内外で変換分ける処理がシンプルじゃね
2023/06/04(日) 18:44:47.92ID:XolxJINE0
速度気になるなら二分探索の処理に追加してやればいいし
2023/06/04(日) 18:45:10.55ID:XolxJINE0
再帰処理でやってもいいかな
2023/06/04(日) 18:45:59.18ID:XolxJINE0
順序保証したいならリンクリストもありか
2023/06/04(日) 18:46:48.29ID:XolxJINE0
ちんこ痒い
148デフォルトの名無しさん (ワッチョイ a101-tVFH)
垢版 |
2023/06/04(日) 18:58:47.70ID:ym4W3arT0
リンクトリストな
2023/06/04(日) 19:08:45.19ID:XolxJINE0
内挿探索でも良さそう
2023/06/04(日) 20:01:40.57ID:0KyMklrL0
STLへの多重配列クラス追加まだ?
2023/06/04(日) 22:37:10.94ID:MHoxWKtY0
>>142
トークナイズするときに便利。
文字列が数値表現だけになっている状態を扱うことってそんなになくない?
なんらかの文字列から取り出す操作になることは多いし、
それを前提として考えたら自然な設計だと思う。
2023/06/04(日) 22:54:17.16ID:5jvZ+YKl0
>>151
>なんらかの文字列から取り出す操作になることは多いし、
まさにそれやが
std::stod()ではどこまで読んだのかわからないから取り出せない……
2023/06/04(日) 23:07:59.65ID:MHoxWKtY0
>>152
わかるが。
2023/06/04(日) 23:16:49.21ID:bxWaSYac0
仕様も確認できない奴が仕様に文句付けるとかお笑いだわ
2023/06/04(日) 23:21:12.95ID:QWRuQk/m0
勉強になるなぁ
boost::lexical_cast
ばっか使ってきた
2023/06/05(月) 01:56:30.15ID:yTJt/rkc0
>>154
仕様を確認して文句つけているのだから無問題
2023/06/05(月) 02:01:37.37ID:yTJt/rkc0
つか自分のスキルに合わせて仕様を変えてしまう香具師よりはマシ
2023/06/05(月) 02:39:23.25ID:yTJt/rkc0
つか初心者スレで今教えてもらったわサーセン;;;
std::stod()の第2引数でどこまで読んだのかわかるのかそうか、、、
159デフォルトの名無しさん (アウアウウー Sac5-Rr/m)
垢版 |
2023/06/05(月) 09:40:21.73ID:ejs/048Ga
1e-3
0.4E+5

どうせ . とか + とか - とか e とか E が数字の後ろに来たらエラーにする糞オレオレ関数の出来上がり
160デフォルトの名無しさん (アウアウウー Sac5-+LPJ)
垢版 |
2023/06/05(月) 18:46:42.35ID:QlKvcf+ua
fortran爺が1e-3を1-3と書いて送ってくるの辛い
2023/06/05(月) 22:24:29.81ID:yTJt/rkc0
charやwchar_tのうちは文字数くれたら別段間違うことは無いはず……
162デフォルトの名無しさん (ワッチョイ 916e-UlWg)
垢版 |
2023/06/06(火) 05:24:35.89ID:sRXlIYgz0
0xe5a3ec05p-10
2023/06/07(水) 18:16:46.44ID:yJ6NJbScM
regex 使って、全角半角タブはreplace
しつつも、正規表現で、数字だけ残して
ってしたらいいのでは
2023/06/07(水) 19:51:43.45ID:Y1IkEaDo0
ファイル名で並び替えるとき数字を文字列じゃなく数として判断して並び替えるの便利だよね。StrCmpLogicalWみたいなの
2023/06/07(水) 20:17:49.58ID:Wtu+kJ5G0
digitntegerみたいな関数なかったっけ
javaと混同してるかもしれん
2023/06/07(水) 20:48:56.87ID:DVJV7mYE0
大文字小文字とか小数とか半角全角とか漢数字とかあるから闇が深い
2023/06/07(水) 21:25:16.49ID:nzVrXgF60
アンダーバーの位置関係も結構罠だよね
文字コード的には 大文字<アンダーバー<小文字 だから
2023/06/07(水) 23:13:43.57ID:ZHL7BfYmM
言語+コンパイラの仕様が拡張してるのにライブラリは貧弱なまま
自己流に実装してしょうもないバグが紛れ込む

関係ないけどstd::stodはC言語版と微妙に仕様が違うのだろうけどそんなの調べてない
2023/06/08(木) 00:14:20.61ID:mm4FKY9+0
例えばstodが解釈できる数値表現を正規表現でも解釈したいと思ったらどうしたら
170デフォルトの名無しさん (アウアウウー Sac5-tVFH)
垢版 |
2023/06/08(木) 11:09:51.53ID:rxjbLVG0a
仕様の不備は運用でカバー
2023/06/09(金) 00:34:29.94ID:Y9bb1A2p0
std::sort (std::execution::par, v.begin(), v.end());
上記で並列ソートできるとのことですが何並列なんでしょうか?
もし環境に合わせて良きに計らってくれるのなら
その良き並列数を取得する関数などありますか?
2023/06/09(金) 01:32:53.73ID:vjFKJkM00
>>171
詳細は言語仕様では規定されていない。
リソースが不足していれば並列化されないこともあり得る。
並列化は大抵の場合に OS のサポートが必要だし
どういうサポートがあるかわからんので言語として明瞭な規定を決められない。

並列化される保証はないのにデータ競合が発生しないように実装するのは
プログラマの責任なので若干の理不尽さを感じなくもないが
C++ ってのはそういうもんなので……。
2023/06/09(金) 07:16:14.12ID:bBOCrSG+0
週末のレイトレーシングで1-17あたりをマルチスレッドにしてみたんだけど、ubuntu上でg++やインテルコンパイラだとスレッド数を増やすと逆におそくなるんです。windows上でvisualstudioでコンパイルすると、望み通りスレッド数を増やすほど速くなりました。何でなんでしょう?
2023/06/09(金) 08:07:59.94ID:e2G6/2re0
>>173
>週末のレイトレーシングで1-17
全く意味がわからないんだが?
>何でなんでしょう?
お前のコーティングのせいじゃないか?
2023/06/09(金) 08:18:32.57ID:m5f79nsG0
gccはね・・・どうも平行/並列処理には本気じゃないところがある
たとえばstd::execution::parなんか真面目にやらんかこらって言いたくなる
2023/06/09(金) 08:19:05.88ID:m5f79nsG0
無料なので強く出られないけどね
2023/06/09(金) 11:49:37.37ID:Y9bb1A2p0
皆さんレスを有り難うござます
うちはstd::execution::parで効果絶大です
$ g++ --version
g++ (Debian 10.2.1-6) 10.2.1 20210110
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2023/06/09(金) 22:45:32.96ID:uysUozYZ0
なるほどなあ
2023/06/10(土) 02:07:59.33ID:oiDhCbH60
EASTLが久しぶりにバージョンアップしたね
2023/06/10(土) 07:02:46.03ID:kaZ6v5kb0
ほう!いいね
2023/06/14(水) 07:54:14.73ID:/jeWb7sY0
time コマンドで調べたメモリの使用量 (max resident set size) が理論値よりも多くて、原因を特定するためにコード内の各箇所でその時点でのメモリ使用量を出力できたら良いなと思います。
実行環境は Linux なのですが、どのようにするべきでしょうか?
2023/06/14(水) 08:43:22.06ID:/jeWb7sY0
あとメモリに関連した質問で、例えばめちゃデカい std::vector を要素数 1 に resize しても capacity はめちゃデカいままですよね?
STL コンテナ以外にも、大きいメモリが割り当てられてるオブジェクトを使用後に破棄したいというケースがよくあります。
最も簡単なやり方は関数とか局所的なスコープとして切り出すことかと思いますが、他に、オブジェクトに割り当てられているメモリを手動で解放する方法があったら教えてください。
183デフォルトの名無しさん (スプッッ Sd33-5Oyn)
垢版 |
2023/06/14(水) 08:49:33.85ID:Xd2fVcpxd
/proc/self/stat というファイルを覗きに行くか、
getrusage というシステムコールで取得することになるかな
2023/06/14(水) 09:19:31.16ID:O3itrano0
>>182
そのために shrink_to_fit がある。
詳細は実装依存なので何もしない関数であっても仕様に反しないけど
常識的には各実行環境で効率的に動くように実装されるので
まずは試してみても損はないと思う。

アロケータを自作してもあまり制御できないんよね。
アロケーションが必要になったらコンテナからアロケータが呼ばれるという
受動的な構造なのでコンテナによるメモリ管理戦略にそれほど関与できるわけではない。

本当にどうしても標準ライブラリの挙動の詳細が不満なら
自分で同等のものを実装する (または望ましいものをどこかから見つける) しかないよ。
2023/06/14(水) 10:15:22.04ID:iWYHYN4ra
>>182
new で造って delete (または delete []) で解放
2023/06/14(水) 12:28:17.37ID:XWt8afSz0
更にいうと、deleteはgccでは推奨されないのでptrを使うよりはstaticもしくはvirtualを使いましょうね。
2023/06/14(水) 12:29:45.65ID:XEzvAdInM
>>182
>>185とほとんど同じだけどunique ptrで管理。
ヒープの確保時間が問題になるならアロケーター使ってヒープを予約する。
2023/06/14(水) 13:12:37.90ID:9CAXVpD30
>>182
vector<空にしたいオブジェの要素の型>().swap(空にしたいオブジェ)
2023/06/14(水) 13:33:02.07ID:iWYHYN4ra
>>188
vector<空にしたいオブジェの要素の型> hoge;
が既にあったとしたら
vector<空にしたいオブジェの要素の型>(hoge).swap(hoge);
で良いらしいけど副作用の心配無い?
2023/06/14(水) 14:03:16.39ID:0kIiqVrM0
>>183
ありがとうございます
> getrusage
を試してみようと思います

>>185-187
STL コンテナを使うとしても自作クラスを使うとしても、オブジェクトを unique_ptr で持つことにして要らなくなったら reset() すれば確保していた分のメモリを捨てられるということでしょうか
依存関係が絡み合っていて簡単に小さいスコープに分割できないときは試してみようと思います
2023/06/14(水) 14:16:54.18ID:iWYHYN4ra
reset()は違うと思う
2023/06/14(水) 14:26:34.51ID:HNZbb8Sq0
>>189
その場合はメモリアクセス領域が変わるのでswapする前に取得済みだったイテレータは再取得する必要あり
2023/06/14(水) 15:52:59.34ID:K9MvWtl90
>186 が何を言ってるのか意味不明でこわい。
2023/06/14(水) 15:54:13.97ID:K9MvWtl90
>>191
「reset() すれば確保していた分のメモリを捨てられる」で間違いないでしょ。
2023/06/14(水) 18:26:24.05ID:9LyNOs9uM
>>190
resetする必要は無いよ。

コンテナから普通に要素を削除すれば、後はコンテナクラスがよろしくやってくれる。効率は実装次第だけど。
2023/06/14(水) 18:51:34.14ID:0kIiqVrM0
>>195
コンテナクラスがよろしくやってくれるのに任せるのであれば、スマートポインタで持たずに単にコンテナとして持つのと変わらないように思うのですが、違うのでしょうか。
ちゃんと理解していなかったら申し訳ありません。
2023/06/14(水) 18:58:01.98ID:vjajEcDc0
vectorを信頼するなら単にclear()してshrink_to_fit()すればいい
信用できないならスマポで持っといていらなくなったら手動でブチ消せばいい
それすら信用できないならイチから自分で作れ
お前がどれだけ心配消化による
2023/06/14(水) 19:18:20.42ID:YeSwNDrrM
>>196
どのコンテナを使うかによる。

vectorとかdequeはまだ確保していない要素用の領域をしばしば予約するから、>>182のような状況を回避するのは面倒臭い。

listとかmapは(これも実装次第だけど)まだ確保していない要素のための領域を予約したりしないから、他のデメリットを許容するなら>>182対策の選択肢になる可能性はある。

いずれにしても、そこまで気にするならまずベンチマークを取って実態を調査すべきだし、そもそも巨大なメモリを頻繁に確保・解放するのは設計に問題があることが多いから、メモリを解放しないで済む方法を検討してみる。
2023/06/15(木) 03:20:48.20ID:J1cG0ikp0
>>198
そもそもvectorのスマートポインタ (あるいはより一般的にサイズが動的なクラスのスマートポインタ) を作り、そのvectorやクラスのサイズを変えたときって確保されてる領域のサイズも変わるんでしたっけ?
手動で変えなきゃいけないと思っていました
(また、vectorのポインタとvectorの先頭要素のポインタは意味が違うのでよりわけが分からなくなりました)
2023/06/15(木) 06:50:20.05ID:usfnoco+0
std::vectorはshrink_to_fit()呼ばない限り勝手にcapacity縮めたりしないはずだけど
2023/06/15(木) 08:48:34.83ID:hMmgKiSo0
>>199
コンテナ内のポインタの予約は避けられないよ。

ただ、ポインタのサイズを気にするようなシビアな状況なら、そもそもc++じゃなくてcで実装することを検討すべき。
2023/06/15(木) 09:00:49.34ID:K4jCDX8M0
シビアな状況でC++が使えないやつがCならOKなはずはない
2023/06/15(木) 10:11:47.24ID:dLjlwX4ma
>>199
何が判ってないのかが判ってないパターンだな
まともな解答もらってても何が正しいのか(なぜ正しいのか)
すら判断出来なさそうなレベル
解答者に失礼
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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