[過去ログ] C++相談室 part164 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
432: (ワッチョイ 0e79-p0MK) 2023/07/07(金)14:27 ID:tybFBPle0(1) AAS
まさに今20年前のコードメンテしてるからnew delete使ってるよ
C++のランタイムすらリンクしてないからこれnewした時Win32APIの何が呼ばれてるんだろう?HeapAllocだったかな?
433(1): (スプッッ Sd22-yGZL) 2023/07/07(金)14:38 ID:5UFmRPYBd(1/2) AAS
スタティックライブラリがリンクされてるんでしょ
ランダム使用時と完全に同じとは行かないけどほぼ同等の処理のはずだけど
434: (スプッッ Sd22-yGZL) 2023/07/07(金)14:38 ID:5UFmRPYBd(2/2) AAS
ランダムじゃなくてランタイム
435(1): (ワッチョイ ffb9-BMDt) 2023/07/08(土)09:03 ID:Iqj4gtss0(1/2) AAS
g++でVLAを使ってるんですが、宣言時に初期化リスト使うのって未定義ですか?
公式のドキュメントを漁ってるんですが見当たらないので(英語苦手なので見落としてたらすみません)
436(2): (スップ Sd3f-hfg2) 2023/07/08(土)09:37 ID:E0cUKLNxd(1/2) AAS
C++にはそもそもVLAないぞ
非標準で実装されるケースはありうるけどね
437(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f73e-kkOg) 2023/07/08(土)09:56 ID:svQTfB7/0(1/4) AAS
>>435-436
C と同等の VLA を使えるように拡張されている旨はちゃんとドキュメントに書かれてる。
しかし C の VLA では初期化子を書けないことになってる。
438(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f73e-kkOg) 2023/07/08(土)10:03 ID:svQTfB7/0(2/4) AAS
GCC の具体的なドキュメントとしてはここ。
外部リンク[html]:gcc.gnu.org
> Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++.
439: (ワッチョイ ffb9-BMDt) 2023/07/08(土)10:10 ID:Iqj4gtss0(2/2) AAS
>>436
はい、処理系依存ということは認識してます
>>437,438
ありがとうございます!
440(1): (ワッチョイ 9701-gR7n) 2023/07/08(土)11:40 ID:hU6KuhT00(1) AAS
コンテナ使えばVLAって最早必要ないような...
441: (オイコラミネオ MMeb-kkOg) 2023/07/08(土)12:00 ID:p+sO9/0DM(1) AAS
数年前にc++でありながらvectorすらない実装はあったけど
442: (スップ Sd3f-hfg2) 2023/07/08(土)13:06 ID:E0cUKLNxd(2/2) AAS
>>440
禿同
443: (ササクッテロラ Sp0b-/+4S) 2023/07/08(土)15:36 ID:lxagCGE0p(1) AAS
CのVLAってスタック使われることもあるんじゃなかったっけか
444: (ラクッペペ MM8f-VHD8) 2023/07/08(土)15:51 ID:Wmg0D33kM(1) AAS
コンパイラによる
445: はちみつ餃子◆8X2XSCHEME (ワッチョイ f73e-kkOg) 2023/07/08(土)18:03 ID:svQTfB7/0(3/4) AAS
どうしても VLA が必要だとしたら
そもそもヒープアロケーションのコードを書いてるときとか、
変則的なアーキテクチャで仕方がないとか、
C++ の言語機能が完全には使えない状況かな。
あるいはヒープアロケーションのコストを許容できないほど速度的に厳しいとか。
446: はちみつ餃子◆8X2XSCHEME (ワッチョイ f73e-kkOg) 2023/07/08(土)20:31 ID:svQTfB7/0(4/4) AAS
話をぶった切る上に去年の話でアレなんだがこの件。
2chスレ:tech
なんの気なしにログを見返してて思い出した。
unexec だ。
447: (ワッチョイ ff7c-DxV6) 2023/07/08(土)20:45 ID:wtJKE3gc0(1) AAS
もうアセンブラかVerilog使えって感じだな
448: (ワッチョイ 9ff0-STDj) 2023/07/08(土)21:25 ID:lX93SXsZ0(1) AAS
世の中には動的確保のコスト計算できない人が多すぎるんだ
449: (ワッチョイ bf79-CBkq) 2023/07/08(土)22:15 ID:gvv7KDv40(1) AAS
>>433
ちゃうちゃう、 new deleteのソースアセンブラに吐かせたの見たらGlobalAlloc GlobalFree使ってるわ
さすがにGMEM_FIXEDだったけど
450: (ワッチョイ d7f0-7EMH) 2023/07/09(日)04:19 ID:MkrAlSpi0(1/2) AAS
Windowsのメモリアロケータってクソだよな
451: (ラクッペペ MM8f-VHD8) 2023/07/09(日)05:38 ID:4tVwl4EYM(1) AAS
せやろか
452: (ワッチョイ ff7c-DxV6) 2023/07/09(日)05:40 ID:DZU7rHSU0(1/2) AAS
Win16からの色々を引きずってるってこと?
453: (ラクッペペ MM8f-VHD8) 2023/07/09(日)05:53 ID:xZgYfcZXM(1) AAS
引きずっているのはLocalAlloc
454: (オイコラミネオ MMeb-STDj) 2023/07/09(日)07:55 ID:wAJ5czLTM(1) AAS
なんとなくメジャーなものをけなして気持ちがよくなってるんだろ
楽だよなそういうので気持ちよくなれる人は
455: (ワッチョイ d7f0-7EMH) 2023/07/09(日)09:27 ID:MkrAlSpi0(2/2) AAS
メジャーだからって完璧に出来ているとは思わない方がいい
456: (ワッチョイ ff7c-DxV6) 2023/07/09(日)09:33 ID:DZU7rHSU0(2/2) AAS
反体制派な俺すげーだろって痛すぎる厨二病は昔からいるよね
457: (ワッチョイ f74e-STDj) 2023/07/09(日)09:36 ID:IdmutbDk0(1) AAS
具体的にどういう場面で問題があるのか、可能ならサンプルコードなどを添えて指摘してくれないと、同意しようがないよね
458: (ワッチョイ d7c0-SCup) 2023/07/09(日)10:14 ID:+WiQ27SB0(1) AAS
そりゃ様々な用途や優先すべき軸がある中で汎用的にあらゆる用途に高性能であれと言われたら
中庸にするか尖らせて特定用途で使い物にならなくなるかの二択になるよね
459: (ワッチョイ 9728-0TTi) 2023/07/09(日)10:40 ID:ihdHNtRI0(1/2) AAS
EXEで確保したしたメモリーブロックをdllで解放するときに(そんなことをするなというのはさておき
むしろmalloc()だとリンクするCRTのバージョン相違でトラブルになりかねないから
OSがmalloc()的なことまでしてくれるのは良い事な希ガス知らんけど
460: はちみつ餃子◆8X2XSCHEME (ワッチョイ f73e-kkOg) 2023/07/09(日)10:57 ID:6ZzBc/+b0(1/2) AAS
C++ なら operator new のオーバーロードなんかも出来るわけだし
コンテナ類もアロケータを差し込むことが出来るわけで
メモリアロケーションに関して過剰なほどのカスタマイズ性がある。
もちろん提供されるアロケータで性能が足りるならそれに越したことは無いが、
足りないときでもなんとかできる可能性があるってのは C++ のいいところだよ。
461: (ワッチョイ 9728-0TTi) 2023/07/09(日)11:09 ID:ihdHNtRI0(2/2) AAS
前なんかstd::vector<T>をdllに渡したら(コピー渡ししたら)クラッシュするトラブルに遭遇して
原因はC++のランタイムのバージョン相違やったorz
462: はちみつ餃子◆8X2XSCHEME (ワッチョイ f73e-kkOg) 2023/07/09(日)11:44 ID:6ZzBc/+b0(2/2) AAS
DLL を跨ぐときは生配列が結局は楽かなぁ。
他環境に移植する予定がないなら COM の流儀に従って SAFEARRAY とか。
463: (ワッチョイ d701-/+4S) 2023/07/09(日)21:30 ID:Y+7J8yUt0(1) AAS
アロケータを指定するときってのは性能どうこうではなく環境や設計上の理由が主だよ
それよりpolymorphic_allocatorはなんでコンテナのコピー時にget_default_resourceを返すんだマジで
464: (ワッチョイ 9701-gR7n) 2023/07/09(日)21:44 ID:r53YpIy/0(1) AAS
10年くらい前だけど6コア(12スレッド) x 双頭のマシンで
Debianのlibcのmallocをjemallocに置き換えたら
かなり速くなって感動したなぁ
いまのglibcのmallocはどうなんだろ?
465(1): (ワッチョイ 82f0-rqn1) 2023/07/15(土)10:34 ID:/MZbR2lO0(1) AAS
最近クラス作るのが面倒な時thread_localのstd::vectorよく使うんだけど
何か問題起きたりする?
466(1): (ワッチョイ e2f0-WYHp) 2023/07/15(土)11:05 ID:08dxROCJ0(1/2) AAS
問題を検証するコードを書いて実験してみれよ
一日で組めるだろ
467: (テテンテンテン MM34-Dvnh) 2023/07/15(土)12:21 ID:lF+Fe8GnM(1) AAS
>>466
それ悪魔の証明
468: (ワッチョイ 5cfb-cHdk) 2023/07/15(土)14:11 ID:bqZq+Kwu0(1) AAS
1日で組んだコードも合わせて技術ブログに記事を書くところまでがセット
469: (ワッチョイ 3279-EJzg) 2023/07/15(土)14:24 ID:V/XrAlYW0(1) AAS
よく使う割に問題が起きてないならそれは問題ないのでは
証明終わり
470: はちみつ餃子◆8X2XSCHEME (ワッチョイ bd32-2eqx) 2023/07/15(土)14:38 ID:e8BGem9r0(1/2) AAS
>>465
std::vector 型の変数がスレッドローカルとして定義されること自体は問題を引き起こさない。
スレッドローカルな変数はスレッドの生成・解放と同じタイミングで生成・解放される普通の変数。
それで問題が起こるなら単にプログラムのロジックに誤りがあるってだけ。
471: (ワッチョイ 915f-9/0y) 2023/07/15(土)15:24 ID:8R7I+TSs0(1) AAS
「クラス作るのが面倒な時」と「thread_localのstd::vector」の関連が見えないな。
472: はちみつ餃子◆8X2XSCHEME (ワッチョイ bd32-2eqx) 2023/07/15(土)16:45 ID:e8BGem9r0(2/2) AAS
>>741
std::thread は関数オブジェクトを受け取ることが出来る。
スレッドに固有、かつそのスレッド全体で使うようなデータは
その関数オブジェクトが所有するのが常道のひとつ。
しかしスレッドローカル変数もスレッドの寿命と一致する形でのデータ置き場になる。
そういう意味で代替品であると見做すことができる。
という話だと私は解釈したが、 std::vector がどこから出てきたかはわからん。
473: はちみつ餃子◆8X2XSCHEME (ワッチョイ 9832-2eqx) 2023/07/15(土)19:51 ID:jZQsWptc0(1) AAS
コードで言うなら
外部リンク:wandbox.org
みたいにするのは面倒だから
外部リンク:wandbox.org
でいいよね?
みたいな話だと思った。
474: (オイコラミネオ MM71-9/0y) 2023/07/15(土)20:03 ID:UiYhW/dJM(1/8) AAS
そもそもの知識がないからpythonみたいにリストにぶち込んで
インデックスですべてやろうとかそんな話かとオモタ
python界はすごいぞ
クラスに変数など作らずすべて辞書にぶち込んで使ってたりする
475: (オイコラミネオ MM71-9/0y) 2023/07/15(土)20:19 ID:UiYhW/dJM(2/8) AAS
a = {}
a['taro'] = {"name":"太郎","age":25, "sex":"男"}
a['hanako'] = {"name":"花子","age":18 ,six":"六"}
476: (ワッチョイ e2f0-WYHp) 2023/07/15(土)20:24 ID:08dxROCJ0(2/2) AAS
変数がすべてバリアントだからなw
477: (オイコラミネオ MM71-9/0y) 2023/07/15(土)20:27 ID:UiYhW/dJM(3/8) AAS
if a['taro']["age"] ==a['hanako']["age"]:
これって全然コード補完効かないから脳が死にかける
478(1): (オイコラミネオ MM71-9/0y) 2023/07/15(土)20:32 ID:UiYhW/dJM(4/8) AAS
name="name"
age="age"
sex="sex"
six="six"
とかしたらいいんか
if a['taro'][age] ==a['hanako'][age]:
嫌すぎる
479: はちみつ餃子◆8X2XSCHEME (ワッチョイ 163e-MI76) 2023/07/15(土)20:42 ID:oCSaktaG0(1/3) AAS
プログラマではない人間もユーザー層として存在するし
Python はそういう人間にもリーチしてしまったから
割合としてワヤなものもできやすいというのは理解できる。
480: (オイコラミネオ MM71-9/0y) 2023/07/15(土)20:45 ID:UiYhW/dJM(5/8) AAS
a['taro'] = {"name":"太郎","age":25, "sex":"男"}
だけ見るとjsonなのかとも思える
481(2): (JP 0H8a-PPvg) 2023/07/15(土)21:13 ID:2P0YU21lH(1/2) AAS
あるクラスにあるクラスのコレクションを抱かさせてるなんて良くあると思うけど
その際に外部からそのコレクションを参照したい場合、どうするのが定石なの?
class Datas
{private:std::vector<Data> _datas;};
publicにするとか、std::vector<Data>::iteratorをpublicにするとか
const Data& operator[](int index)をpublicにするとかいろいろあると思うけど
482: (オイコラミネオ MM71-9/0y) 2023/07/15(土)21:18 ID:UiYhW/dJM(6/8) AAS
ファーストクラスコレクションの話?
483: (ワッチョイ df01-L4gQ) 2023/07/15(土)21:22 ID:wfhnDtnz0(1/3) AAS
単数: datum
複数: data
484: (オイコラミネオ MM71-9/0y) 2023/07/15(土)21:24 ID:UiYhW/dJM(7/8) AAS
今日本屋で○○データムと言う本があった
DATAの単数形がdatumと言うことにこだわる大人って理系だけなんだろうなと感じたらこれだよ
即出て来た
485: (ワッチョイ df01-L4gQ) 2023/07/15(土)21:35 ID:wfhnDtnz0(2/3) AAS
datumに拘ってるのではなくdatasなんて言葉はない
486: (JP 0H8a-PPvg) 2023/07/15(土)21:43 ID:2P0YU21lH(2/2) AAS
そこか、英単語をぐぐったら解決しました。
ありがとうございました
487: はちみつ餃子◆8X2XSCHEME (ワッチョイ 163e-MI76) 2023/07/15(土)21:58 ID:oCSaktaG0(2/3) AAS
>>481
場合による。
見せる相手が最初から限定的であるような場合はフレンドを宣言すればいい。
コンテナ系クラスとかは内部的にはたぶんノードを表すクラスとか
も使ってると思うけどそういう感じで密接に関連がありつつ
他では使う可能性がないような強い関係性がある場合はフレンドにする。
データを保持するためだけの汎用クラスとして定義するならデータメンバは public にしてもかまわない。
省18
488: (ワッチョイ df01-L4gQ) 2023/07/15(土)22:04 ID:wfhnDtnz0(3/3) AAS
>>481
privateメンバなのだから
できるだけ外部からそのコレクションを参照しないように設計するべきだと思うよ
どうしてもってならiteratorではなくconst_iteratorにするとか
あなたが書いてるようにconst Data&を返すaccessorを実装するとか
489: (ワッチョイ 847c-zIhc) 2023/07/15(土)22:07 ID:BdK15TwX0(1) AAS
"HogehogeData"という名前で定義されたプログラム上の存在があったら
その複数形はHogehogeDatasと呼ぶしかない
気持ち悪くてもしょうがないんだよ
490: (オイコラミネオ MM71-9/0y) 2023/07/15(土)22:15 ID:UiYhW/dJM(8/8) AAS
ファーストクラスコレクションにしないならその実装は不要だ
基本的に存在意味がない
491: はちみつ餃子◆8X2XSCHEME (ワッチョイ 163e-MI76) 2023/07/15(土)22:20 ID:oCSaktaG0(3/3) AAS
ワイはプログラミング言語 Scheme を使ってるんやが Scheme の仕様には datum という語が出てくる。
シリアライズの単位に関する概念なのでリストひとつも datum と (つまり単数形で) 呼ばれるのが
ちょっとモニョッとする。
492: (JP 0H8a-PPvg) 2023/07/16(日)08:28 ID:PzNRrLhAH(1) AAS
どうでもいいことを突っ込んでる人いますけど
Datas=>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Data=>aaaaaaaaaaaaaaaa
と置換してください
493: (アウアウウー Sa3a-ZX0e) 2023/07/16(日)09:51 ID:Po24/3Vva(1) AAS
hogehogetoyukainanakamatati
で解決
494: (ワッチョイ 3279-EJzg) 2023/07/16(日)16:16 ID:z7qY/utw0(1/3) AAS
powershellはJSONやxmlをその構造のまま扱えたりオブジェクト(PSCustomObject)にも変換できてpythonなんかより小奇麗に書けますよっと
>>478だとif ($a.tsaro.age -eq $a.hanako.age) { ... という具合
495: (ワッチョイ 3279-EJzg) 2023/07/16(日)16:20 ID:z7qY/utw0(2/3) AAS
powershellはC#とシームレスに連携する手段もあってpowershellで苦手な再帰処理とかをC#コードに逃がしてpowershell機能を使いたい部分はActionやFuncから呼び出す事もできますよっと
496: (ワッチョイ 3279-EJzg) 2023/07/16(日)16:21 ID:z7qY/utw0(3/3) AAS
よく見たらここC++スレだね
俺の事は忘れてください
497(2): (ワッチョイ 0928-rP6O) 2023/07/17(月)18:33 ID:mG7BHGLy0(1/5) AAS
質問なのですがclass Datasというクラスがあってstd:::vector<Datas> vec((size_t)100); であるときに
vec[k]の場所にn個の場所を空けたい(値は初期化済Datasオブジェクトなら何でも良い)場合どう書くべき?
やっぱ手動でsz = vec.size(); vec.resize(sz + n);して既存要素vec[k..sz-1]を後ろ(vec[k+n..])にコピーする --- (1)
のが最速?
仮にstd::vector<T>::insertを使うと
Datas x; // (A)
vec.insert(std::next(vec.begin(), k), n, x); // (B)
省3
498: はちみつ餃子◆8X2XSCHEME (ワッチョイ 163e-MI76) 2023/07/17(月)20:23 ID:YifLUjyU0(1) AAS
>>497
resize だって再配置 (に付随するコピー) の可能性はあるんで
どっちでも大差ないんじゃないかな。
楽だと思うほうで書けばいいと思うよ。
499: (ワッチョイ 915f-9/0y) 2023/07/17(月)21:47 ID:I9Lq0d6Q0(1) AAS
>>497
無駄なデフォルトコンストラクタやコピーを削って極力ムーブで済ませようと思ったら
sz, k, n の大小関係ごとに場合分けして move_iterator 経由の insert とか使い分ければ
いけそうだけど、面倒なわりに見合うほど効率改善しそうな気はしない。
500: (ワッチョイ 82f0-rqn1) 2023/07/17(月)22:08 ID:kACYNrgv0(1/2) AAS
書き込みはそこまで遅くないから労力に見合わないだろうね
501: (スッップ Sd94-v8RM) 2023/07/17(月)22:54 ID:vqJJKRdWd(1) AAS
速度を気にするなら実測しないと始まらないよ。
502(3): (ワッチョイ ae7a-CYkg) 2023/07/17(月)23:18 ID:vGotTgNV0(1) AAS
リアルタイムOSのタスクのように無限ループが前提のとき
TASK Task1() {
while(1) {
Obj1 obj = Device::GetObj();
:
:
}
省3
503: (ワッチョイ df01-L4gQ) 2023/07/17(月)23:25 ID:CT+u9aWW0(1) AAS
>>502
自作でないクラスのメソッドは使う前には
メソッドが消費するメモリを見積もらなければなりません
不条理でも何でも無い
504: (ワッチョイ 0928-rP6O) 2023/07/17(月)23:34 ID:mG7BHGLy0(2/5) AAS
わかりました
505: (ワッチョイ 82f0-rqn1) 2023/07/17(月)23:42 ID:kACYNrgv0(2/2) AAS
自作でないクラスでも使う関数がメモリ動的確保するかどうか普通は確認するぞ
506(2): (ワッチョイ 0928-rP6O) 2023/07/17(月)23:46 ID:mG7BHGLy0(3/5) AAS
>>502
>GetObjが内部でnewされていると、この作りではいつかメモリ不足になってしまいます。
この懸念は普通の作りなら基本的に無用。基本的に問題無い
(1) Obj1という型がポインタやハンドルではなくクラスの場合:
objはwhile(1) { }のブロックの中で構築されるので
ループの終わりでデストラクタが呼ばれる(破棄される)から、
Device::GetObj()が真っ当な作りならnewしたポインタをObj1のインスタンスobjに引き渡し、
省5
507: (ワッチョイ 0928-rP6O) 2023/07/17(月)23:47 ID:mG7BHGLy0(4/5) AAS
基本的に、というのは(2)のケースで例外が生じたときクローズされずに抜けてしまう危険性があるのと、
(1)のケースにおいてもobj1の構築中に例外が生じた場合はきちんとデストラクトされない危険性がある。
Obj1のメンバがnewされるべき生ポインタの場合はこれは対処不能。生ポはやめてスマポにすればおk
詳しい話ははちみつ餃子氏に聞くと良い(マテ
508: (ワッチョイ 0928-rP6O) 2023/07/17(月)23:58 ID:mG7BHGLy0(5/5) AAS
訂正orz、
誤: ループの終わりでデストラクタが呼ばれる(破棄される)から、(>>506
正: ループが次の繰り返しに入る前かループを抜ける際にデストラクタが呼ばれる(破棄される)から
509: (ワッチョイ 847c-8c0A) 2023/07/18(火)00:04 ID:yoLqrsJ/0(1) AAS
>>502
必要ならそのGetObj()とやらのドキュメントにDevice::ReleaseXyz()とかDevice::ReleaseObj(obj1)とかobj1.release()とかを後で呼ぶように指示されてるはず
それを怠ってリークさせたならお前がタコ
そういう指示がないくせに勝手にリークするならそのライブラリがタコ
そんだけの話
510: はちみつ餃子◆8X2XSCHEME (ワッチョイ 163e-MI76) 2023/07/18(火)00:16 ID://OyAtPF0(1/2) AAS
そして使い方がドキュメント化されてないなら組織として問題がある。
が、そういう話はマ板で。
511(1): 502 (ワッチョイ ae7a-CYkg) 2023/07/18(火)00:38 ID:ibbV/iYr0(1) AAS
皆さんありがとう。
>>506
ブロックスコープは知りつつも、ループのブロックの場合はループ中は寿命が継続すると思っていました。
ループ時に毎度後始末されるなら安心です。
512: はちみつ餃子◆8X2XSCHEME (ワッチョイ 163e-MI76) 2023/07/18(火)01:05 ID://OyAtPF0(2/2) AAS
>>511
根拠。
外部リンク[auto]:timsong-cpp.github.io
上下前次1-新書関写板覧索設栞歴
あと 490 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.035s