X



C++相談室 part157
レス数が1000を超えています。これ以上書き込みはできません。
0002デフォルトの名無しさん
垢版 |
2021/08/09(月) 11:24:40.26ID:M3I2CbwW
前スレの >>997
キューが溢れないようにするのなら
スレッドが実行中かどうかを確認するのではなく
キューサイズを見るほうが確実じゃないですか?
0003デフォルトの名無しさん
垢版 |
2021/08/09(月) 11:43:30.76ID:GC6B710d
>スレッドが実行中か確認したいってどんなときなのかな?
たとえばゲームでセーブするとき、
メインの処理はブロックしたくないので別スレッドで実行しつつ「セーブ中です」みたいな表示を出し、終了したら消す
みたいな時かな
0004デフォルトの名無しさん
垢版 |
2021/08/09(月) 11:48:24.98ID:OWI9S7jW
>>3
それはセーブするスレッドのほうが開始と終了を通知すればよくない?
そうデザインするもんじゃないの?

できないときもあるのかもしれんが。
0005デフォルトの名無しさん
垢版 |
2021/08/09(月) 11:56:53.44ID:GC6B710d
>>4
もちろん方法ならいくらでもあると思うけど、別スレッドのインスタンス1つで全部済むなら、そっちの方がすっきりするし楽でしょ
0006デフォルトの名無しさん
垢版 |
2021/08/09(月) 12:12:57.14ID:GC6B710d
>>4,5
あぁ、いやそうじゃないか
ゲームのあらゆる部分をスレッドセーフで設計すれば良いのかもしれないけど、
ゲームのメインの状態遷移なんてわざわざマルチスレッド化するような重い処理でもないので、
その辺の表示とかはシングルスレッド前提で書いてるわけよ、もちろんそのほうが楽だからw
0007デフォルトの名無しさん
垢版 |
2021/08/09(月) 12:17:21.54ID:qYrd5+ip
この「実行中」が実際にタイムスライスが割り当てられている状態を意味しているんであれば
OSにもよるが実装が大変な割に実際に役立つシーンは限られるような。
>>4であればjoinableで十分だろうし。
0008デフォルトの名無しさん
垢版 |
2021/08/09(月) 12:25:08.93ID:DVzh2mox
別スレッド処理の進捗を他スレッドから閲覧するためのパラメータを使っってる時点で、お察し
0009デフォルトの名無しさん
垢版 |
2021/08/09(月) 12:40:21.77ID:S8n0VVLE
前スレ997は色々勘違いしてそうな気がする
普通pushしようとしてキューが満杯なら何らかの同期メカニズムで自分を待ち状態にする
pop側はpopしたらその同期メカニズムに対して待ちを解除するだけだからスレッド自体が実行中かどうかなんて見る必要がない
0011ハノン ◆QZaw55cn4c
垢版 |
2021/08/09(月) 13:52:46.20
正直いって pthread の条件変数は私には理解が難しく、私は安易に win32api のクリティカルセッション&シグナルを多用してしまうのです
ただし、スタベーションに陥ることが多々あり、どうもクリティカルセクション・シグナルでは駄目なパターンがあるかもしれない、とヒヤヒヤしています‥‥
0012デフォルトの名無しさん
垢版 |
2021/08/09(月) 14:01:28.39ID:TRAo/ccI
>>2
別に
Producer(pushする側)がこれからpushするのを待っている場合、
Consumer(popする側)はキューサイズ(キューの中の要素数)を見ても
Producerが待っているのかどうかの情報を得られない
なぜなら、まだpushしていないからな
0013デフォルトの名無しさん
垢版 |
2021/08/09(月) 14:14:45.62ID:TRAo/ccI
>>9
>pop側はpopしたらその同期メカニズムに対して待ちを解除するだけ
そういう実現方法も(pop側が行った待ち解除がキューイングされれば)成立する鴨、と>>997にちゃんと書いているもーん
0015デフォルトの名無しさん
垢版 |
2021/08/09(月) 14:33:19.09ID:S8n0VVLE
>>13
いや、スレッドの実行状態なんて見てもしゃーないって話
pop後にpush側が実行中だとしてもそのチェック直後にpushするかも知れん
要するにスレッドの実行状態の変化は排他制御できないから意味がないって話
pop前にいちいちスレッドをsuspendしてチェックしてからresumeするとかするならできるかもしれないけどw
0016デフォルトの名無しさん
垢版 |
2021/08/09(月) 14:34:07.65ID:aCXIbwxy
std::vectorの部分ベクトルの切り出しって絶対O(要素数)の計算量かかりますよね?
0019デフォルトの名無しさん
垢版 |
2021/08/09(月) 15:11:52.58ID:KzU8BZnC
参照できればいいのか、コピーがいるのか、切り出し位置はわかってるのか、検索を伴うのか、
その辺の条件もなしに計算量の議論なんて出来んわ
0020デフォルトの名無しさん
垢版 |
2021/08/09(月) 16:11:11.49ID:6v1cUfUr
クラスAの内部にクラスBがある (入れ子クラス) として、BからAのメンバにアクセスするテクってないんですかね?
アクセスしたいメンバをstaticにはしたくないです
0022はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/09(月) 16:48:43.56ID:OWI9S7jW
>>20
クラスの中でクラスを定義しても A の名前空間の中に B が定義されるってだけ。
B のオブジェクトを作っても A のオブジェクトが存在しないなら存在しないオブジェクトのメンバにはアクセスできない。
A のオブジェクト (インスタンス) と B のオブジェクトの間には勝手に関係が出来たりもしない。
関係ないのに関係あるように見えて初心者が混乱してるのはどっかの質問サイトでも見たことがある。
よく理解できてないならまずはクラスの定義を入れ子にせずにやってみるのがオススメ。
0023デフォルトの名無しさん
垢版 |
2021/08/09(月) 16:52:51.13ID:S8n0VVLE
>>20
AやBのインスタンスをどう生成してるのよ
>>21の言うようにAへのポインタ持ってたら普通にアクセスするだけでしょ
class A {
public: int i;
class B {
public: B(A* a){ … = a->i; }
}
}

auto b = new A::B(new A());
0025デフォルトの名無しさん
垢版 |
2021/08/09(月) 17:00:48.11ID:hJGoZPOe
絶対レビュー通らないウンココードでよいなら
(char*)this + offsetof(A, b)でなんとかならんのか
0026デフォルトの名無しさん
垢版 |
2021/08/09(月) 17:33:38.90ID:GC6B710d
class Aをtemplate化して、class BでAを継承すれはメンバにはアクセスできるけど、たぶんそういうことがしないんじゃないんだろうなw
コンテナクラスのイテレータから親クラスインスタンスのメンバにアクセスしたいとかか?
0028デフォルトの名無しさん
垢版 |
2021/08/09(月) 20:07:17.09ID:XVy1LhuX
>>23
普通にコンポジションで実現できる条件だよな
メルプラネットの奴らも同じこと言いそう
0029デフォルトの名無しさん
垢版 |
2021/08/10(火) 00:55:38.92ID:rk6SLsdN
親オブジェクトへのポインタをうっかり共有ポインタにすると循環参照の原因になる(小並感)
0032デフォルトの名無しさん
垢版 |
2021/08/10(火) 08:16:11.83ID:JssHBcjd
>>30
遅くなる可能性があるから気にしない。
コンパイル時に解決できるなら++使っても同じだし、実行時に解決するようだと1かどうかの判定が増えて遅くなる。
0033デフォルトの名無しさん
垢版 |
2021/08/10(火) 12:11:16.71ID:OMlKC5pQ
TCPIPのソケット通信プログラム作ろうと思っているのですが、
コネクションを維持し続ける場合のデメリットって何がありますか?
0034デフォルトの名無しさん
垢版 |
2021/08/10(火) 12:42:43.27ID:ZRv1Vy3I
>>32
後出しになって申し訳ありませんが、*、!=、++、+=、- 辺りが定義されたイテレータを持つ自作のデータ構造を範囲for文で走査することを考えています
それ自体は想定した通りにできたのですが、その範囲for文をomp並列化するとイテレータのインクリメントが ++ でなく +=1 で行われるようになります
で、その自作データ構造では ++ よりも += の方が重い実装になっているので、+=1 よりは ++ の方を使ってほしいです

omp に特有の仕様に思えるので、普通に += の冒頭で引数が1かどうかの分岐を入れることにしようかと思います

ありがとうございました
0035デフォルトの名無しさん
垢版 |
2021/08/10(火) 14:57:46.78ID:W7aMf5pX
マルチスレッドのキューのサンプルをSTLで作りゃったーしたったわ、
https://ideone.com/bS7rqc

↓ここのC#のサンプルプログラムの移植
// https://atmarkit.itmedia.co.jp/ait/articles/1801/31/news023.html

フラグの必要性は意味を取り違えていたわサーセン、
しかしこれフラグ(runningFlag)無しでやるとしたら終了時にConsumerがいちいちProducerが
join可能か調べる(std::thread::joinable())ことになってスレッドより先にプログラムした人が終了したくなるお
フラグで済むのに、
0037デフォルトの名無しさん
垢版 |
2021/08/10(火) 15:28:07.54ID:W7aMf5pX
と思ったがやっぱ当初の意味(Producerが待っているのかどうか)のフラグが無いと、
キューが空になった後のnotifyで、1万個あるかもしれない仕事の無いConsumerが次々起床され、
巡り巡ってようやくProducerが起床されるみたいな非効率が生じる余地があるやんけ;;;

やっぱ当初の漏れのフラグ必要という意見で正しかったのかもしんない
漏れは天才なのかもしんない、
かもしんない運転、
0038デフォルトの名無しさん
垢版 |
2021/08/10(火) 18:25:35.80ID:W7aMf5pX
つかその前に、漏れの天才eyesが改造元とした@IT様のサンプルプログラムに
スレッドのディスパッチ依存で終了できなくなることがあるという恥ずかしいバグを発見した、
論より証拠:
https://ideone.com/NbKdEQ

変更点は、Consumerを1個にして、Producerの側のある個所にsleepを入れただけ
(マクロ CAUSE_STOPPING_FAILURE_BUG で条件コンパイルで有効にしている個所
これでConsumerスレッドが終了できなくなる

対策は、同ソースコードの BUGFIX_STOPPING_FAILURE_BUG マクロを有効にしたら宜しい

天才の判断である
0039デフォルトの名無しさん
垢版 |
2021/08/10(火) 18:42:35.68ID:mYAwPqTL
>>34
すみません。この件なんですが、

void operator += (int n){
 if(n == 1){
  // ここ
 }else{
  ……
 }
}

「ここ」で演算子++を呼びたいときってどう書いたら良いでしょうか
++の中身をコピペしても良いのですが、
this -> ++
みたいなノリで呼び出せた方が都合が良いです
0040デフォルトの名無しさん
垢版 |
2021/08/10(火) 19:06:35.71ID:W7aMf5pX
というわけで最終的な版を貼る、
https://ideone.com/G3XeAg

ProduceとConsumerそれぞれに対する起床条件を分離すた、

日本語ではいくら説明しても一向に理解の光が射さなかったボンクラ学生レヴェルの>>15でも
100行足らずのソースコードなら読めるんじゃないの
知らんけど
0042デフォルトの名無しさん
垢版 |
2021/08/10(火) 19:24:28.15ID:mYAwPqTL
>>41
ありがとうございます
前置/後置の別が自分の中でよく付いていませんが、教えていただいたことに基づいて調べてみます
0044デフォルトの名無しさん
垢版 |
2021/08/10(火) 20:32:27.09ID:W7aMf5pX
「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や
とれると良い、ではなく取ることが必須や

なぜなら、WIN32APIのイベントは1回だけキューイングされるので投げたら投げっぱなしでもそのうち
受け取ってもらえるが、(pthread系統のしくみである)状態変数はそうではなく、
起床信号を投げつける前に相手が信号をキャッチ可能なのか(待ちに入っているのか)知る必要がある

なお、イベントのキューイングの有無によって話が変わる旨はすでに書いたある(>>997
上記のことを書いてあるというのに理解もせずにしつこく同じことを繰り返し言ってきたのが>>15
0045デフォルトの名無しさん
垢版 |
2021/08/10(火) 21:01:08.35ID:Lbev+Y0v
>「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や

それって具体的にどういうものを想定しているんだろう。
もともとの話はstd::threadに追加したい機能だったと思うけど、この説明だけじゃ全然想像がつかない。
0046デフォルトの名無しさん
垢版 |
2021/08/10(火) 22:11:54.85ID:W7aMf5pX
なんか元にしたコードにまだ問題があった気配orz
MAX_QUEを1にすると高い頻度でProducerとConsumerが両方待ちに入ってしまいハングアップする、、、
対策版は多分これ↓で良いんジャマイカ……
https://ideone.com/at7ef9
(何が起きていて、どうしてこれで対策なのかはコメント参照、

>>45
>>「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や
>それって具体的にどういうものを想定しているんだろう。
今回のサンプルコードでは具体的にはありません(キリ
しいて言えば!runningFlagならConsumerが自身を待ちに入れない(∵Producerがもう起こしてはくれない
というのはあるが、>>35に書いた通りフラグ以外の方法でも同じ判定を行える

言っていることにブレがあるのは今日pthreadを勉強したばっかりやし、
天才なので大目に見てホスイ、
0047デフォルトの名無しさん
垢版 |
2021/08/10(火) 22:25:26.70ID:W7aMf5pX
でもまあコメントを読んでいただければ、pthread系のしくみだと
起こす対象のスレッドが何をしているのかについて常に配慮が居るということをご理解いただけるのではないかと思う
今回はたまたま見込みでnotifyして話が通るからスレッドの実行状態を表す変数が具体的に生じなかっただけ
0048デフォルトの名無しさん
垢版 |
2021/08/10(火) 22:47:59.90ID:C0wcAbjz
すみません。
自作プログラムが特定のPCだけ同じ場所でntdll.dllのエラーで止まるのですが、何が原因と考えられるでしょうか?
他のPCでは問題無く進み、エラーを起こすPCのメモリにも異常は見つかりませんでした。
0049デフォルトの名無しさん
垢版 |
2021/08/10(火) 23:06:02.90ID:OOQ3UOoB
>>48
未初期化変数があって無効なアドレスにアクセスしたとかじゃね

確実なことを言うためには例外コードが知りたい
あと問題の箇所のソースコードも
0053デフォルトの名無しさん
垢版 |
2021/08/10(火) 23:34:52.75ID:5fGESjxl
他の言語にはスレッド実行中か判定するAPIあるしstd::thread作った人達だってそのくらいのこと知ってたでしょ
boost::thread時代にそういった要望もあっただろうし
それでもあえてstd::threadにはスレッド実行中を調べる機能を付けなかった
本質的に必要な機能ではないと判断したんじゃないの?
0054デフォルトの名無しさん
垢版 |
2021/08/10(火) 23:44:13.15ID:rk6SLsdN
スレッドそのものの終了状態を知る需要はあまりなく、スレッド内で行われるユーザー定義処理が終わったかどうかが重要だからでしょ
0055デフォルトの名無しさん
垢版 |
2021/08/10(火) 23:50:54.98ID:Lbev+Y0v
>>47
>起こす対象のスレッドが何をしているのかについて常に配慮が居るということをご理解いただけるのではないかと思う

それがwaitで待っている状態かそうでないかを意味しているんだとしたらそれは正しくない。
チェックした次の瞬間にwaitする可能性もあるわけなんで。
0056デフォルトの名無しさん
垢版 |
2021/08/11(水) 01:24:38.33ID:qkzYmFIh
>>55
>チェックした次の瞬間にwaitする可能性もあるわけなんで。
無い
チェックと処置をmutexによる単一のロック期間の中でアトミックに行うのだから>>55は全くナンセンスな問題提起

>>53
thread::joinable()があることは書いたもーん
0057デフォルトの名無しさん
垢版 |
2021/08/11(水) 01:28:13.23ID:qkzYmFIh
問題だらけだった@IT様のサンプルコードだけど
これまともに実装するとしたら条件変数をConsumer x NとProducerの計N+1個設けて、
さらにConsumerそれぞれが待っているのか動いているのかを示すフラグを設けて
全部動いていたらProducerを待たせる
Consumerが待ちに入る直前にProducerにnotifyかけてキックする、みたいな
スレッドプールを手で実装するみたいな話になりそう……

でここまでやるならConsumerの状態変数が実体としてコードに現れる
0058デフォルトの名無しさん
垢版 |
2021/08/11(水) 01:44:51.77ID:01hIEDa4
何を主張したくてごちゃごちゃ言ってるのかさっぱり見えないし途中で変わったりしてるようでもあるので、
続けるならそもそもどういう主張をしているのかいっぺんまとめてほしい。
0059デフォルトの名無しさん
垢版 |
2021/08/11(水) 08:13:22.18ID:SyYdmIb8
>>56
std::threadから取得する「スレッドの実行状態」の話をしているんだが。
それをmutexでアトミックに操作する???
0060デフォルトの名無しさん
垢版 |
2021/08/11(水) 09:56:36.95ID:8ERcfmko
C++ってiPhoneアプリ作れる?
0062デフォルトの名無しさん
垢版 |
2021/08/11(水) 12:13:04.52ID:sOdrsbt7
iPhone専用でいいなら、そもそも、Appleが提供している標準開発環境だけでも
C++で作れる。
iPhoneの標準開発言語はSwiftだが、SwiftはC++と相互に呼び出せるから。
ただし、それだけだと面倒かも知れない。
そういう場合は、Qtで作れば。
0063デフォルトの名無しさん
垢版 |
2021/08/11(水) 12:52:41.17ID:MU7UJMps
std::vector で insert するとき
v.insert(v.begin() + n, hoge);
とかすると思いますが
このときの n の型って何ですか?
int ?
unsigned long ?
size_t ?
あとこういう型を調べるときって
vector のどことか iterator のどこを調べると判りますか?
0064デフォルトの名無しさん
垢版 |
2021/08/11(水) 13:03:37.14ID:19rzwYjH
22.3.11 Class Template vector
23.3.11.1 Overview
3
using iterator = implementation-defined; //see 22.2
となっていて、std::vector::iteratorの型は処理系定義だね

現物で調べるならVisual Studioの[F12]が簡単だと思う
0065デフォルトの名無しさん
垢版 |
2021/08/11(水) 14:01:06.77ID:OqxISI0I
>>59
ID:W7aMf5pX = ID:qkzYmFIh はスレッドの状態として
・その瞬間の状態: Run/Ready/Wait/...
・終了してるかどうか: thread::joinable で取得できる
を混同してる(わざとかどうかは知らんが)
あと条件変数とスレッドの状態も混同してるので
> チェックと処置をmutexによる単一のロック期間の中でアトミックに行うのだから
なんて意味不明なことを言い出してる
これ以上続けるなら>>58が言うように本人にまとめてもらわないとますますグダグダになるだけだと思う
0066デフォルトの名無しさん
垢版 |
2021/08/11(水) 14:15:21.29ID:EWMgwFeS
std::thread使ったことないから自信無くて黙ってたけど
thread::joinable()って別にスレッドが終了したかの判定ではなくない?
他スレッドでの実行を管理していない状態の(空の)オブジェクトが作れるから、そういう空の状態かどうかの判定関数であるように読めた
fstream::is_open()的な……
0067デフォルトの名無しさん
垢版 |
2021/08/11(水) 14:23:39.88ID:01hIEDa4
>>63
暗黙変換があるから n の型としてはすべての整数型があり得る。
基本的には、生ポインタで実装される可能性もあるものなので ptrdiff_t だと思っておけばいい。
正確な型が必要なら difference_type とか iter_difference_t とかで調べればわかる。
0068デフォルトの名無しさん
垢版 |
2021/08/11(水) 14:56:54.71ID:OqxISI0I
>>66
> thread::joinable()って別にスレッドが終了したかの判定ではなくない?
もちろん正確にはスレッド変数がスレッドと関連づいてるかどうかの判定
彼は>>35辺りでスレッド終了判定と思い込んでるフシが見られるのでそう書いてある
0069デフォルトの名無しさん
垢版 |
2021/08/11(水) 15:08:15.20ID:MU7UJMps
>>67
ありがとうございます

>>64
>現物で調べるならVisual Studioの[F12]が簡単だと思う

それで判るのは自分で定義した可能性の高い n の型ですよね?
知りたいのは v.begin() + n に要求されている型のことです
0070デフォルトの名無しさん
垢版 |
2021/08/11(水) 15:28:09.46ID:EWMgwFeS
>>68
やっぱりそうですよね
じゃあ>>65の2個目の中黒の内容については引用??

例のコードではjoinableなんか使ってないし>>7が書いたのを試しもせずに真に受けた感じなのかな
0073デフォルトの名無しさん
垢版 |
2021/08/11(水) 15:52:06.26ID:SyYdmIb8
>>66
>thread::joinable()って別にスレッドが終了したかの判定ではなくない?

実際にそのスレッドが実行中か待ちか終了しているかを表しているわけじゃないことはその通り。
で、たぶんそれで十分だからjoinable以上の機能は用意されなかった。

ところがそれが役に立つ場面があるよと言ったのが前スレ>>997
このスレの>>35と同一人物かどうかは知らんが。
0075デフォルトの名無しさん
垢版 |
2021/08/13(金) 02:38:58.72ID:tLa9gek2
char *mystrcat(char *a, char *b)
{
// a に b を結合して
return a;
}
みたいな関数を
shared_ptr<char *> mystrcat(shared_ptr<char *> a, char *b)
{
// a に b を結合して
return a;
}
みたいな実装にするとき参照カウンタが無限に増える心配はありますか?
shared_ptr<char *> mystrcat(weak_ptr<char *> a, char *b)
の方が良いのでしょうか?
あと
hoge = mystrcat(NULL, hage); みたいに使用されるときは
mystrcat の中で new してコピーして new したポインタを返したいのですが問題ありませんか?
0076デフォルトの名無しさん
垢版 |
2021/08/13(金) 02:56:15.88ID:nopi39s7
>>75
shared_ptr<char *> だと、たぶんやりたいことはできてない。
shared_ptr<char[]> の間違いなんだろうと思うけど、この時点でコンパイルすら試してないのが見て取れる。
参照カウンタの動きは挙げられたソースだけじゃ読み取れないけど、無限に増えるなんてことはまず起こらない。
shared_ptr の use_count() で取れるから試してみればいい。
問題があるかどうかも自分で試してみればいい。何を「問題」とするかこちらにはわからないし。
0077デフォルトの名無しさん
垢版 |
2021/08/13(金) 09:51:25.31ID:BE9FMbqU
個別の事例で心配ない、問題ないという返答を得たとしても理解が深まらない。
shared_ptr のメカニズムを理解できないと何度でも心配になるだけ。

どういう理屈で参照カウンタが無限に増えると思ったのかを説明してみて。
考え方に間違いがあれば指摘するよ。
0078デフォルトの名無しさん
垢版 |
2021/08/13(金) 11:40:57.21ID:UG8FRdqC
char *mystrcat(char *a, char *b)
{
// a に b を結合して
return make_shared<char []>(a);
}
じゃいかんの
しらんけど
0082デフォルトの名無しさん
垢版 |
2021/08/14(土) 09:56:52.00ID:2Gpa2MRC
>>81
大規模ライブラリを設計するときに重宝する機能
詳しい経緯は知らないがグローバルスコープの識別子名の競合を回避する目的で導入されたと思う
namespaceがないC言語時代にいくつからの大規模ライブラリを組み合わせたときに何が起きがちだったか知っていれば納得出来るはず

どんな機能もそうだが、自分が必要と思った時に使えば良いだけだよ
存在意義が分からないならお前にとっては必要のない機能ということだから、気にする必要はない
0084デフォルトの名無しさん
垢版 |
2021/08/14(土) 10:48:18.77ID:isR1pnnS
>>75
蛇足だけど、理由がなければshared_ptr<char[]>の代わりにshared_ptr<str>にしたほうがいいな。
// a に b を結合して
return a
がすごく怖い。
0088デフォルトの名無しさん
垢版 |
2021/08/14(土) 11:16:28.29ID:Wd8wuOU/
C++を本格的に学ぼうと思って本を数冊買ったが、言語仕様が複雑な割には知らないとエラー起こすだろ
っていう項目が多くてビビってる。あと、きれいなコードを書くのに尋常じゃない経験が必要なんじゃないか
0089はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/14(土) 11:34:44.96ID:xM4RG8+9
全部知らなくてもわかる部分だけでまあまあ使えるというのが C++ の方針なので
最初から綺麗に書こうと思わないほうがいいと思う。
綺麗に書けないと考えるより汚くても普通なんだと考えると気が楽でしょ。
0090デフォルトの名無しさん
垢版 |
2021/08/14(土) 11:41:20.52ID:HmVXtcJk
構造体の中に関数が書ける、というコアの中のコアな部分の使い方・考え方さえ憶えるというより慣れれば
あと他のは追加で憶えればいいってだけ

ただし、その追加が今とんでもない量になってて
禿本の初版からやってる俺でさえ憶えきれなくてもがいてる
0091デフォルトの名無しさん
垢版 |
2021/08/14(土) 11:47:19.11ID:fhp8ilcT
いいかい学生さん、 他人のコードをな、 他人のコードをいつでも読めるくらいになりなよ。
それが、人間えら過ぎもしない貧乏過ぎもしない、 ちょうどいいくらいってとこなんだ。
0096デフォルトの名無しさん
垢版 |
2021/08/14(土) 17:38:14.88ID:sh47n3w4
perlは文法が複雑なだけで、知らない書き方に出会ったらそれを調べればいい。
C++はコードの断片だけ見ても動作を想像できないことがあるから厄介。
0100デフォルトの名無しさん
垢版 |
2021/08/14(土) 19:58:29.67ID:x6Wgppy9
スマートポインタに慣れたら自分で解放しなきゃならないmallocやnewの方がよっぽど面倒
0104デフォルトの名無しさん
垢版 |
2021/08/15(日) 00:20:00.85ID:YeWgyy60
QZ案外初心者やなw
でも言ってることは全面的に賛成
ポインタや参照、クラス等の基本を抑えてからでないとスマポや、C++11からの要素(右辺値参照含む)の使い方もわからんと思う
0106ハノン ◆QZaw55cn4c
垢版 |
2021/08/15(日) 09:34:41.47
>>103
確かに罰ゲームの一種になるかも‥‥私も少しずつ採り入れていくようになっていますし

>>104
もう永遠の初心者だと思っていますので、ならば、初心者の気持ちがわかるコメントでコントリビュートするのもありかと、ふつふつと
0107デフォルトの名無しさん
垢版 |
2021/08/15(日) 14:37:33.11ID:Qb5ISoeo
>>104
なにこれ?


QZ「〜」
名無し「QZ初心者やな。でも賛成」
っていう自演をやろうとしたが、一個目のQZのレスをコテつけ忘れで投稿してしまったのか?
あるいははちみつとQZを同一視している?
いずれにせよとんでもない皮肉だな笑
0110デフォルトの名無しさん
垢版 |
2021/08/15(日) 17:52:57.61ID:/OoKg6VD
クッソささやかな体面保つためだけの自演も失敗とか本当にみじめないきものだな…
0112はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/15(日) 18:12:10.32ID:oR5NZ4bd
>>111
ブラウザが記憶してたのを再度投稿してしまったとかそういうしょうもないミスじゃないかな。
JaneStyle のメモ欄で以前のレス内容を貼り付けたりそのまま投稿できたりする機能があるよ。
0113デフォルトの名無しさん
垢版 |
2021/08/15(日) 18:15:56.65ID:pJ9UilRh
だから勝手にコピペされたっつってんだろクソ餃子め
>>104は俺じゃないから
3行目を引用したかったのか変な自演したかったのかは知らん
0114はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/15(日) 18:21:10.51ID:oR5NZ4bd
>>113
すまぬ。
本人によるものでなくてもなんらかの意図でメモしてたものを
うっかりということは起こりそうなデザインにはなっているので、
意図によるものでなくただのミスじゃねという部分が主旨。
0117はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/16(月) 15:17:56.99ID:5E5Krdno
>>116
現時点でこのスレにコテ (+トリップ) 付きで書き込んでいるのがはちみつ餃子と QZ だけだからだろ。
0118デフォルトの名無しさん
垢版 |
2021/08/16(月) 19:18:38.03ID:QgSHgEhC
(unsigned) intの数を受けたら何らかの演算をして (unsigned) long longの数を返す、(unsigned) double の数を受けたら何らかの演算をして (unsigned) long double の数を返す、みたいのって逐一オーバーロードを書くしかないですよね?
要するに、大きいデータ型に格上げして何らかの演算をして返したいってことなんですが
0119ハノン ◆QZaw55cn4c
垢版 |
2021/08/16(月) 19:34:40.64
>>118
演算子のオーバーロードにしても関数のオーバーロードにしても、返り値の型を指定することは出来なかったかと
思いつくのは演算前の引数にあてがうキャストのオーバーロードですね
0120デフォルトの名無しさん
垢版 |
2021/08/16(月) 19:55:44.02ID:AiYiQHL1
引数をテンプレートにして、引数Tのビット数と整数型かどうかを見て、一段階大きい型を戻り値の型とすることは出来る
0122デフォルトの名無しさん
垢版 |
2021/08/16(月) 21:59:33.60ID:AiYiQHL1
ごめん、めんどい・・というか
sizeof(T)と整数or浮動小数点数のbool(is_integralとかで取る)を受け取る構造体の中でtype(戻り値の型)を定義、とか考えてたけど
結局Tのサイズごとに特殊化するから手間変わらん、てのと
関数の中身が長くなるなら、オーバーロードした関数からテンプレート版(戻り値の型と引数の型がテンプレート)を呼んで、そこで中身書けば一回で済むね
0123デフォルトの名無しさん
垢版 |
2021/08/16(月) 23:40:17.97ID:cwTPPWgm
>>118
ふつうに long long や long double を引数で受け取るって演算して返す関数を書けば
その通りの動作になりそうなんだけど、何か気に入らないの?
2つ関数書くのが嫌だってこと?(やりたいことが少なくとも2通りあるのに?)
0124はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/17(火) 00:20:49.88ID:yPn/BtRt
大きい型というのは一段階大きい型という意味なのかな?
型の大きさは処理系 (アーキテクチャ) 依存だし、
ポータブルに書こうと思ったら思ったよりも面倒な感じ。

主要なアーキテクチャだけ対処できればいいなら
8 → 16 → 32 → 64
の拡張が出来ればいいので用意するパターンはそんなに多くはない。

ちなみに Windows の long double は double と同じ大きさだよ。
0126デフォルトの名無しさん
垢版 |
2021/08/18(水) 04:11:58.97ID:ReVsRUuR
関数読んだら1段階デカい型が返ってくるなんて使う側でも面倒が起きそうだな
0127デフォルトの名無しさん
垢版 |
2021/08/18(水) 04:23:43.76ID:TZ94eDdV
まぁ、戻り値にも使用できるテンプレートの追加の型を関数内でconstexpr的に定義出来たらいろいろ面白いことが出来そうではあるなw
0128デフォルトの名無しさん
垢版 |
2021/08/19(木) 15:14:48.98ID:9cCAU3aU
話は勝手に変わるけど、
{ 1,2,3,4,5 }
のような書き方が initializer_list になる場合とならない場合を全て知りたいけど
良く分からないので、誰か教えてくれまいか。
0129デフォルトの名無しさん
垢版 |
2021/08/19(木) 15:21:14.80ID:9cCAU3aU
>>128
的を外しているかも知れないけど、その書き方をAと書くとすると、どんな文脈でも
A自体が最初に必ずいったん initializer_list<T> になった後にそれぞれの文脈で処理されるという
ことなのか、あるいは、
auto x {・・・};
auto x = {・・・};
auto x = TYPE {・・・};
func({・・・});
のようにいろいろな書き方や文脈が変わるとそもそも A は意味論的にすら
initializer_list<T> を経由せずにそれぞれ独自に解釈されて処理される
のか、どちらなんだろう????
0130デフォルトの名無しさん
垢版 |
2021/08/19(木) 15:24:22.53ID:9cCAU3aU
あと、良く分からないのが、
struct CPerson {
・・・
CPerson(int a, int b, int c) {・・・} //(1)
};
とあった場合、
1. CPerson a{1,2,3};
2. CPerson a={1,2,3};
3. CPerson a=CPerson{1,2,3};
のどれを書いても多分、(1)が呼び出される気がするけど、
struct CPerson {
・・・
CPerson(initializer_list<int> a) {・・・} //(2)
};
と書いた場合、1,2,3 はやはり全て(2)が呼び出されるのだろうか?
0131はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/19(木) 16:38:31.07ID:z/GAGLjl
>>129
> initializer_list<T> を経由せずにそれぞれ独自に解釈されて処理される

initializer_list を経由しないことはある。
おおざっぱには initializer_list を受け取る文脈では initializer_list だし、
推論が必要なとき (auto やテンプレート) にも initializer_list に推論されるが、
そうでないときは initializer_list を経由しない。
0132はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/19(木) 16:48:40.83ID:z/GAGLjl
>>130
優先順位がある。
1. 2. 3. のいずれも initializer_list としての解釈が「優先される」。
initializer_list を受け取るコンストラクタが存在しなければ
三引数のコンストラクタが呼出される。
0133デフォルトの名無しさん
垢版 |
2021/08/19(木) 16:54:44.67ID:9cCAU3aU
>>132
なるほど。確認だけど、
1. CPerson a{1,2,3};
2. CPerson a={1,2,3};
3. CPerson a=CPerson{1,2,3};
4. CPerson a(1,2,3);
5. CPerson a=CPerson(1,2,3);
は、どれも3引数のコンストラクタで受け取ることは可能ということでOk?
1. 2. 3. は、initializer_list を受け取るコンストラクタでも受け取ることが可能?
4. 5. は、initializer_list を受け取るコンストラクタでも受け取ることは不可能??
0134はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/19(木) 17:08:54.15ID:z/GAGLjl
>>133
(initializer_list を受け取るコンストラクタが無ければ) いずれも 3 引数のコンストラクタが起動されるが、
5. は 3 引数のコンストラクタでオブジェクトを構築した上で a にコピーする。
(コピーコンストラクタ、またはムーブコンストラクタが起動する。)
ただし RVO が有効な状況ではコピーやムーブはが省略されるので 5. は 4. と同じ。

そしてこの場合には関係ないが、波括弧によるコンストラクタ起動では引数の暗黙の型変換を許さない
といった重要な違いがある。

(initializer_list を受け取るコンストラクタが有る状況でも) 4. と 5. は initializer_list とは解釈されない。
0135デフォルトの名無しさん
垢版 |
2021/08/19(木) 17:14:28.81ID:9cCAU3aU
>>134
1. 2. 3. は、initializer_list を受け取るコンストラクタでも受け取ることが可能?
4. 5. は、initializer_list を受け取るコンストラクタでも受け取ることは不可能??
については?
0138デフォルトの名無しさん
垢版 |
2021/08/19(木) 17:27:44.09ID:td+NCu9W
template <int N> void test(std::bitset<N>& arg);

int main()
{
std::bitset<1ull> lvalue;
test(lvalue);
}

これ、Nが推定できないのはなんで?
0140はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/19(木) 17:30:02.71ID:z/GAGLjl
>>135
> 1. 2. 3. は、initializer_list を受け取るコンストラクタでも受け取ることが可能?
はい。 可能です。

> 4. 5. は、initializer_list を受け取るコンストラクタでも受け取ることは不可能??
はい。 不可能です。

ところで >>134 で、オブジェクトを構築した上でコピーするのは 5. と述べたけど 3. もそうやな。
0141はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/19(木) 17:33:59.90ID:z/GAGLjl
>>138-139
正解は size_t だよ。
size_t が具体的にどの整数型に対応するかは処理系定義なので
もちろん unsigned long long と等価なこともあるだろうけど。
0142デフォルトの名無しさん
垢版 |
2021/08/19(木) 17:40:36.29ID:9cCAU3aU
>>136
念のため、その「述べた」はずのルールがどの文章だったのか教えてもらえれば
ありがたい。
0143デフォルトの名無しさん
垢版 |
2021/08/19(木) 22:54:32.78ID:CH0dz2ka
vector<long long>を取る関数にvector<int>を渡すと、その引数はvector<long long>にキャストされる
で、vector<int>を取る関数にvector<long long>を渡すのはNG

この理解は合ってますでしょうか
0144デフォルトの名無しさん
垢版 |
2021/08/19(木) 23:03:24.64ID:/B0HDd6y
間違ってる
vector<long long>とvector<int>には何の関係もない
intとstringに関係がないのと同じくらい関係ない
0145デフォルトの名無しさん
垢版 |
2021/08/20(金) 11:13:55.26ID:5K/SmrCp
pair<int, int> は pair<long long, long long>にキャストできるけど
vectorにそういうコンストラクタはないな
0146デフォルトの名無しさん
垢版 |
2021/08/20(金) 12:13:09.91ID:ssGfr3Zr
>>103
VS6.0の頃は地獄だったよ
forループの変数は生キノコるわ例外出たら自動変数の破棄全部ぶっ飛ばすわでMSはクソの集大成だと確信していたわ
0148デフォルトの名無しさん
垢版 |
2021/08/20(金) 15:19:34.50ID:Pb4opnB5
STOUT を STDOUT に空目してこそプログラマ脳


「ミロ」そっくりの缶ビール 子どもが誤飲し販売禁止に(豪) - Yahoo! JAPAN
https://article.yahoo.co.jp/detail/1a7b2e0b9ab108ebf156f22e654f60634c39c88b
子どものみならず大人にも大人気のココア味の麦芽飲料「ミロ」は、世界中で愛されている。このほどオーストラリアの企業が、
ミロにそっくりのパッケージデザインで缶ビールを製造したことにより「子どもが間違えて飲んでしまった」という苦情が届いた。
これにより同製品の広告使用禁止が言い渡されたことを『news.com.au』などが伝えている。
問題の缶ビールは、豪ビクトリア州にある企業「Howler Brewing Company」の「Chocolate Milk Stout」というチョコレート風味の黒ビールだ。
缶のデザインは有名な麦芽飲料「ミロ」を真似たもので、お馴染みの緑色を背景に製品名や販売会社を示す文字の色やフォントまで同じデザインとなっている。
同社はこれまでにも、Instagramや炭酸飲料「スプライト」など認知度の高いロゴデザインを真似た製品を作り出している。
0149デフォルトの名無しさん
垢版 |
2021/08/20(金) 17:52:50.79ID:BMARPdQo
関数オブジェクトじゃなくて関数を記述するメリットってなんかある?
テンプレートは近々関数オブジェクトの方でも使えるようになるんでしょ?
0151デフォルトの名無しさん
垢版 |
2021/08/20(金) 20:12:20.52ID:BMARPdQo
>>150
じゃあそのうち「関数はレガシーな書き方なので関数オブジェクトを使用するようにしましょう」とか言われるようになるの?
0153デフォルトの名無しさん
垢版 |
2021/08/21(土) 00:37:37.24ID:E2GGZp0E
>>146
forの変数スコープは回避策あったやん
98年発売なんでもうちょっとどうにか出来たのではとも思うが
0154デフォルトの名無しさん
垢版 |
2021/08/21(土) 00:45:38.19ID:E2GGZp0E
あ、すまんラムダじゃなくて関数オブジェクトか
確かにタイプ数くらいしか思いつかんけど
テンプレートは既に使えるのでは?関数テンプレートに出来て関数オブジェクトに出来ないテンプレートの使い方あったっけ
0155デフォルトの名無しさん
垢版 |
2021/08/21(土) 10:46:43.63ID:+K/WXdke
>>148
日本でも煙草を真似したデザインのチョコレート菓子があったけど
間違って煙草食った子供が死んだとか裁判になったとか聴かないな
おそらくあったんだろうな
0156デフォルトの名無しさん
垢版 |
2021/08/21(土) 12:15:51.53ID:t0h3aTQf
>>154
実体化の制御かね。
関数テンプレートは使用されない限りエラーにならない。
SFINAEもそうじゃなかったっけ?
0157デフォルトの名無しさん
垢版 |
2021/08/21(土) 13:42:38.53ID:E2GGZp0E
クラステンプレート内の普通のoperator ()だとそうだね
operator ()がテンプレートの場合ならほぼ関数テンプレートと同じ事出来るとは思うけど
文法上、明示的にテンプレート引数指定する際、関数と共通の書き方には出来ないな・・
0158デフォルトの名無しさん
垢版 |
2021/08/21(土) 20:47:50.56ID:7GAoG1Iq
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ
ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
0159デフォルトの名無しさん
垢版 |
2021/08/21(土) 22:35:53.53ID:o/sUihIV
質問です。
std::array ary = { 1, 2 };

↑の{}で初期化すると、
要素数を自動推論できるようにするにはどう実装すればいいんでしょう?
0163デフォルトの名無しさん
垢版 |
2021/08/22(日) 12:59:29.57ID:0Cz6ueFz
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴 バージョン1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html

第二プログラミング言語として Rust はオススメしません Nim をやるのです
https://wolfbash.hateblo.jp/entry/2017/07/30/193412


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
0164デフォルトの名無しさん
垢版 |
2021/08/22(日) 18:45:30.76ID:gNvESTNy
std::chrono::time_point::time_since_epoch()が返すエポックタイムの原点はいつですか?
もし具体的に規定されていないとしても、
ミリ秒パートが0であることは保証されていますか?
0165デフォルトの名無しさん
垢版 |
2021/08/22(日) 19:20:25.99ID:gNvESTNy
ある意味自己解決しますたorz
https://cpprefjp.github.io/reference/chrono/system_clock.html
>C++17 以前の場合、system_clock のエポックがどの時間を指しているかは未規定だが、ほとんどの処理系は UNIX 時間(1970年1月1日0時0分0秒)を指している
>C++20 以降の場合、system_clock のエポックは必ず UNIX 時間(1970年1月1日0時0分0秒)を指す
しかし(特にC++17以前において)ミリ秒パートが0が保証されているのかどうかがはっきりしませんぬ、
0166デフォルトの名無しさん
垢版 |
2021/08/22(日) 19:28:39.82ID:VeL/IzCV
生年月日をUNIX時間で表現できないオッサンはこのスレにどのくらいいるの?
0167デフォルトの名無しさん
垢版 |
2021/08/22(日) 21:27:04.43ID:gNvESTNy
生年月日ならミリ秒まで言える必要は無いが
ログの時刻を極力正確に(WindowsのGetLocalTime()と同じ時刻で)記録したいのでつ∀`;)
0169デフォルトの名無しさん
垢版 |
2021/08/23(月) 16:50:49.24ID:Rrt4HCug
B.C.
A.D.
B.E.
0171デフォルトの名無しさん
垢版 |
2021/08/23(月) 22:52:48.51ID:xWEF4I0D
ていうかsystem_clockはC++17以前からtime_tと相互変換できるのに(system_clock::from_time_t()、system_clock::to_time_t())、
エポックがどの時間を指しているかは未規定とかおかしくね↑?
0173デフォルトの名無しさん
垢版 |
2021/08/23(月) 23:31:13.03ID:sPTJEjpv
そんなことよりなんでtime_tは符号なしなん?
64bit拡張するときに符号ありにしとけば166みたいな煽りを受けずにすんだのに
0175デフォルトの名無しさん
垢版 |
2021/08/24(火) 07:17:43.25ID:NEyNeI43
符号付き整数はwrap aroundしたときの挙動が処理系依存か何かだったはず……
ハードウェア例外を生じるやつがあるらしい
0177デフォルトの名無しさん
垢版 |
2021/08/24(火) 08:21:39.19ID:NErefsYh
>>175
オーバーフローしたときにラップアラウンドさせる使い方が数値計算としては特殊だからねぇ。
0178デフォルトの名無しさん
垢版 |
2021/08/24(火) 15:27:02.85ID:WZMj7UxV
>>167
ntp使え
0179デフォルトの名無しさん
垢版 |
2021/08/24(火) 17:48:36.53ID:DexxKsi1
>>174
time_tを符号なしにしたやつはアフォだと思うが
それをもって符号なしを使うやつ全員が例外なくアフォというのは
早まった一般化という誤謬だ
0181167
垢版 |
2021/08/25(水) 00:50:22.37ID:MXKFEwSS
そういやーまだご存命の方もいらっしゃるんでしたね

>>179
符号付きにしたら2038年問題が2004年問題になってた
人類は間に合わなかった
0184デフォルトの名無しさん
垢版 |
2021/08/26(木) 16:49:35.75ID:WPRv8+9f
関東大震災だって100年も猶予があっても何もしない國ですし
0186デフォルトの名無しさん
垢版 |
2021/08/27(金) 17:50:19.96ID:BFKMFKNN
https://twitter.com/cpp_akira/status/1430779310885859330
最近はC++の発表資料を公開すると「Rustでいいじゃん」というコメントがたくさんつくのか…。
Rustへの言及とか一文字も書いてないのに。
普及活動だと思うけど、さすがに嫌がらせチックに見える。

https://twitter.com/moriyoshit/status/1430795812552863744
C++の件に限らず、旧来からある言語の長所短所を理解せずに、
表面的に新言語を推す発言を見ると、
果たして当人は新しい言語の方も理解できているのだろうか、
という疑念をもってしまう...
https://twitter.com/5chan_nel (5ch newer account)
0187デフォルトの名無しさん
垢版 |
2021/08/27(金) 19:27:10.45ID:wbifwX7a
>>186
Rustはいらんけど、制約を強化してコンパイルエラーを増やしたc++--は欲しいなぁ。

スライシングはすべてコンパイルエラー、ダウンキャストはメンバー関数とフレンド関数のみ使用可能
new deleteはメンバー関数とフレンド関数のみ使用可能(global operator new/deleteは廃止)
といったメモリ周りの制約強化は欲しい。
0188デフォルトの名無しさん
垢版 |
2021/08/28(土) 14:03:18.97ID:dCOU+NEa
Rustを使って欲しいなら、そう言えばいいのに
人のすることを小馬鹿にするような態度で来るから敵と見られるんだよ
コミュ障にも程がある
0189デフォルトの名無しさん
垢版 |
2021/08/28(土) 18:35:03.00ID:iJLWqDs6
インテルコンパイラの-fastには-staticが含まれてるけど、なんでスタティックリンクは速いの?
0191はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/08/28(土) 23:41:54.59ID:V8MBAFoh
スタティックリンクにすると最適化の情報が増えるというのもあると思う。

C/C++ では翻訳単位ごとにコンパイルしてからリンクするという工程を踏むから、
コンパイル時には他の翻訳単位の情報を知らず、他の翻訳単位の情報を利用した
最適化が出来なかった。

今では LTO が当たり前になって、リンク時にあらためてコンパイラに戻して最適化
させる仕組みがあるんだけど、バイナリ自体が別物だとその仕組みを使えない。
0192デフォルトの名無しさん
垢版 |
2021/08/29(日) 13:13:16.45ID:h29TClHM
std::threadってスタックサイズを指定できないってマジ?
仮想メモリを使えない組み込み用途だとどうすんじゃ……
0193デフォルトの名無しさん
垢版 |
2021/08/29(日) 13:20:14.34ID:kSqJuAzn
native_handle()関数で環境に応じたスレッドハンドル(linuxならpthread)を取得できるから、スタックサイズを設定するところだけ環境ごとに用意して切り替えればいいよ
0194デフォルトの名無しさん
垢版 |
2021/08/29(日) 13:28:41.66ID:h29TClHM
Windowsみたいにスレッドハンドルを生成したときはスタックサイズ指定済のとき、みたいな
組み込み用OSがあったらどうすんじゃ……
0195デフォルトの名無しさん
垢版 |
2021/08/29(日) 13:46:08.60ID:h29TClHM
とわいえμITRONのcre_tsk()は
>cre_tsk でスタック領域を明示しない場合のタスクのスタックや割込みハンドラ/割込みサー
>ビスルーチンのスタックは、OS が用意する「スタック用メモリ」から割り当てられます。
>スタック用メモリのサイズを定義する STKMSZ の標準値は 0 で、この場合、main 関数が使って
>いる処理系のデフォルトのスタック領域(スタックセクション)を、OS のスタック用メモリとし
>ます。この場合の実際のスタックサイズは、リンカでのセクション設定とスタートアップルー
>チンでの初期スタックポインタ値で決まります。
みたいなことが書いてある
C/C++界隈はみんな頭おかしい……
0196デフォルトの名無しさん
垢版 |
2021/08/29(日) 13:55:46.65ID:h29TClHM
ゴメ勘違いcre_tsk()(IDがOSが自動割り当てのやつはacre_tsk())は
第2引数に与えるT_CTSK構造体でタスクごとにスタックサイズを指定できたわ;;;
なんでstd::threadではできないんじゃ……
0197デフォルトの名無しさん
垢版 |
2021/08/29(日) 14:18:20.52ID:vSvS+48a
コイツ前スレでも連レスしてたムーブ全く理解してないバカだよね?
NGしたいからトリップつけてください
0198デフォルトの名無しさん
垢版 |
2021/08/29(日) 14:25:04.60ID:x8xWTwL3
>>192
標準じゃ無理でしょ
全てのスレッドを変えたいならリンカのオプションとかで指摘できる環境もあるけど

boost::thread使って
boost::thread::thread_attribute::set_stack_size()
で設定するがよろし

>>193
native_handle()関数でハンドル取れると言う事はスレッド開始してる
開始済みスレッドのスタックサイズを変えられる環境って聞いたことない
0200デフォルトの名無しさん
垢版 |
2021/08/29(日) 16:52:45.64ID:h29TClHM
>>197
完璧な理解をサンプルコード付きで示したやろうが;;;

論点はなんでムーブに置き換えられるケース(明示的にstd::move()したら明らかに効率的なコードになる
において最適化でムーブにならないのか?なのだが高度すぎるのか文盲か故に>>197が付いてこれていないだけ
>>197はブーメラン
0201デフォルトの名無しさん
垢版 |
2021/08/29(日) 16:54:56.72ID:h29TClHM
もっとも天才の漏れは答えにたどりついたがな
ムーブコンの実装がコピコンの実装より効率的である保証が無い以上、
置き換え可能なケースであってもコピコンからムーブコンへの機械的置き換えは正当化されない
0202デフォルトの名無しさん
垢版 |
2021/08/30(月) 14:34:41.72ID:jKIf8Vzq
天才のインフレ
0203デフォルトの名無しさん
垢版 |
2021/09/01(水) 16:43:13.53ID:Uxp79PtR
Rustみたいにコンパイル時にいちいち参照のチェックするんじゃなくて
C++で最終的に完成したバイナリに対してメモリサニタイザーを一回動かす
ってのではだめな理由ある?
0204デフォルトの名無しさん
垢版 |
2021/09/01(水) 20:16:57.41ID:dG55Jwur
>>203 動かしたフロー以外のフローについて不安が残るし、サニタイザーの精度がどれほどかという問題もありそう。
0205はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/09/01(水) 23:35:30.93ID:3mB0e8fG
>>203
ものによって賢さの程度が違うから一概には言えないけど
基本的にはサニタイザは実際に起こった問題を検出するものなので
入力値次第で問題が有ったりなかったりするようなケースを検出できなかったり、
言語仕様上で未定義なものがたまたま問題ないアクセスになってしまうようなケースも
検出できないかもしれない。

問題が起こっていて再現条件が分かっているときに検証するツール、つまりデバッグ用のツール
としてはサニタイザは有用だし、ごく基本的なテストツールとしても使えるけど、
Rust のライフタイムチェックほど網羅的ではない。
0207デフォルトの名無しさん
垢版 |
2021/09/03(金) 09:16:16.79ID:6YHhlfzl
MozillaのFireFoxの場合、わざとクラッカーがセキュリティーホールを見つけ出して
そこを付いてくるから、普段の実行テストでは一度も発見できなかった
メモリーバグが問題になるが、普通のアプリの場合、ユーザーがわざとバグを
付くことはないから、そのようなホールはあまり関係ないと思う。
テスト駆動開発とかアジャイル開発とかも、普段使いで問題が無いかをテスト
することで大部分のバグが無い状態で開発していこうとする考え方。
それでもほとんどのメモリーバグは無い状態になっている。
メモリーバグがあると、普段使い的なテストをしても発覚することが多いから。
昔から言われているメモリーバグの問題点は、再現性が有る場合でも、バグが
ある行とそれが発覚した時期とがずれていることがあるから。
デバッグモードでコンパイラが自動的にチェックするコードを入れていれば、
それはなくなるはず。
Rustはその意味で、経験法則的にFireFoxみたいな特殊なものでは意味があるが
一般アプリでは余り意味が無い。ブラウザの特殊性は、世界中のクラッカーが
セキュリティーホールを探してわざとその穴を付いてくること。一般アプリでは
それがないので、隠れたバグは隠れたままになっていることが多くて、
テストで出てこなかったバグは実際問題的には余り問題となら無い事が多い。
0208デフォルトの名無しさん
垢版 |
2021/09/03(金) 09:22:40.61ID:6YHhlfzl
>>207
例えば、ダングリングポインタ(Use After Free)は、ptrがどこかでまだ使用中なのに、
free(ptr)としてしまうこと。しかし、そのfree()をした時点ではアプリはダウン
しないし、ptrに対して読み書きした段階でもまだ発覚せず、ptrが指すメモリー
アドレスを別の目的で使用してしまって、お互いに読み書きがある種の干渉を
起こしてしまって、データがめちゃくちゃになり、それによってどこかで不具合
が生じた時点で発覚する。
なので、バグの根本原因であるfree(ptr)を実行した行がどこかを探し出しにくいと
される。
しかし、このバグの場所とバグが起きた場所のずれは、デバッグビルド時に速度を
落としてチェックすれば本当は防げるはず。
0209デフォルトの名無しさん
垢版 |
2021/09/03(金) 09:24:49.55ID:6YHhlfzl
>>208
チェックと言っても人間が手で書く必要は無く、コンパイラがチェックコードを
自動生成できるはず。
0212デフォルトの名無しさん
垢版 |
2021/09/03(金) 10:46:20.27ID:yJUEU9nq
>>207
任意のファイルを読むアプリはファイルのパーサーの脆弱性をついてユーザ権限でコードを実行される可能性がある
どちらかと言えばアプリよりサーバとしてアクセスを受け付けているプログラムの脆弱性をつかれて攻撃コードの実行を許してしまうことが多い
さらに上のような場合でも、アプリやサーバのプログラム自体に脆弱性があるのではなく、使用しているOSのAPI側の実装の脆弱性をつかれる可能性がある

こういうアプリやサーバやOSのコードの脆弱性にMSやGoogleは悩まされている
0213デフォルトの名無しさん
垢版 |
2021/09/03(金) 11:00:44.84ID:yJUEU9nq
Valgrind と言う動的解析ツールを調べて見るといい
うちはC++のプログラムは基本これを通すことになってる
商用ならもっといいツールもあるかも知れない
そういうのを利用しても充分でないから静的解析するRustが注目されている
0214デフォルトの名無しさん
垢版 |
2021/09/03(金) 11:27:43.59ID:6Xh4x7Us
商用の静的解析ツール使ってると、正直メモリ関係のバグなんてありえないと思えるくらいいろいろ見つけてくれるよ
0216デフォルトの名無しさん
垢版 |
2021/09/03(金) 11:47:10.63ID:lmzB7IZ6
> メモリ関係のバグなんてありえないと思える

lintの副作用がモロに出てるなw
0217デフォルトの名無しさん
垢版 |
2021/09/03(金) 15:20:21.54ID:MvVz2a9W
言うまでもない事だが完璧なメモリチェッカーは存在し得ない
停止問題と同値だからな
0218デフォルトの名無しさん
垢版 |
2021/09/03(金) 15:50:45.07ID:6Xh4x7Us
完璧無理っておまえの毛髪の量がプログラム停止に与える影響が読めないとかそういう話だろ?
限定的な範囲で正しけりゃ十分だよ
0223デフォルトの名無しさん
垢版 |
2021/09/03(金) 18:28:35.67ID:iCLUv6gH
rustでもメモリアロケーション失敗するとパニックになる、てリーナスが突っ込んでいたろ。
c++の場合はどうなんのかな。
0224デフォルトの名無しさん
垢版 |
2021/09/03(金) 20:13:28.89ID:USKNPKWa
CoverityとVectorCASTは使ったことあるけど検知レベル最高にしても見逃すリークや二重フリー, ダングリングはそれなりにある (そもそもコードの構造が悪い場合も多いが)
検知レベル上げ過ぎると逆にFalse Positiveも増えるし
0229デフォルトの名無しさん
垢版 |
2021/09/04(土) 22:28:42.31ID:mLTAxmCN
超久しぶりにC++の参考書 買った。
いまってC++20までいってるんでしょ?

時代遅れもいいところだから勉強しようと思ってw


ただ読む気がおきない。
「pythonでいいか」って思いが・・・ww
0230ハノン ◆QZaw55cn4c
垢版 |
2021/09/04(土) 23:52:57.58
>>223
https://tabesugi.net/memo/2009/1a.html
C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。

C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら
Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、
それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる:

- うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が
安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、
もはや笑えるレベルを超えている)

- 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに
効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の
コードがその素晴らしいオブジェクトモデルに依存していて、直すためには
アプリ全体を書き直さなきゃなんない。

言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
0232デフォルトの名無しさん
垢版 |
2021/09/05(日) 00:27:52.33ID:eMsTCIh+
linusに言われると返す言葉もないが、その後の文脈にある

『もし C++ で書かれた VCS が欲しいのなら、Monotone を見てみるといい。
ほんとに。連中は「本物のデータベース」を使っているよ。
「素敵なオブジェクト指向ライブラリ」も使ってる。「ナイスな C++ の抽象化」も
使ってる。そして率直なことろ、一部の情報系の人間が喜びそうな
これらすべての設計上の決定のために、できてきた結果はゲロゲロで
保守不可能なカオスだ。

でもあんたはきっと git よりも気に入るだろう。保証するよ。』

な感じでC++を気に入って、夢を見ていたいんだろうね。
0233デフォルトの名無しさん
垢版 |
2021/09/05(日) 00:53:47.56ID:66hkUr5p
「オレはC++を使いこなせている」と思い込む素人を生温かく見守るスレはここですね
0235デフォルトの名無しさん
垢版 |
2021/09/05(日) 06:00:11.76ID:fsFc+8nQ
昔、バカでも使える言語でプログラマ人口増やしましょうてなことやってたな
BASICじゃないぞ、あれは初心者用で、バカ用じゃない

計算を数式で書くのは理系だけだから
英文で書けるようにして文系でも使えるようにしようという試みがあった

で、狙いどおり本当にバカプログラマを量産できた
それでいいことあったか?

C++はアレの逆をいっているわけだ
0236デフォルトの名無しさん
垢版 |
2021/09/05(日) 06:45:24.37ID:ClPlKiJv
Qtを使ってるから、C++一択だな。
0239デフォルトの名無しさん
垢版 |
2021/09/05(日) 14:17:57.22ID:cBh+EO/A
>>234
Linuxはモノリシックカーネルなので動的メモリ確保を伴うような軟弱な
モジュールもカーネルのうちに入ってしまっているからメモリ不足ぐらいで
パニくられると手の打ちようがないから困るという話なんじゃないの(適当

OSはリソース管理を放り投げて停止することは許されないから
伝統的なやり方では起動時に非常用のメモリブロックをアロケートしておいて
メモリが枯渇したら非常用のメモリブロックを使うみたいな手段がとられる(と思う
がパニックされたらそこまで行きつかない

※ 個人の感想です
0240デフォルトの名無しさん
垢版 |
2021/09/05(日) 14:38:48.42ID:eMsTCIh+
>>239
具体的に何かのケースを想定して言ってるわけじゃないのか。
ぶっちゃけOSをC++で書くならカーネルでnew/malloc/mmapとか使う実装はしないだろうし、処理系が使うランタイムにも依存するけど基本その辺はカスタマイズできるようになってると思う。
rustでもそんな感じで処理系次第って話だと思う。
0242ハノン ◆QZaw55cn4c
垢版 |
2021/09/05(日) 17:28:18.83
>>241
>>230 の類の話は昔からいわれていたもので、これも有名ですね
http://www.kh.rim.or.jp/~nagamura/misc/stroustrup-interview.html

インタビューア(以下「I」): あなたがソフトウェアデザインの世界を一変させてから何年にもなる。振り返ってみて、感想は。
Stroustrup(以下「S」): 実はあなたがここへ来る直前、当時のことを思い出していたんだ。おぼえているかな。誰もが C 言語を使っていたけど、問題はみんな結構うまくコーディングしていたことだった。
大学も C 言語を教えるのがうまくなっていたしね。驚異的な割合で有能な――「有能」という言葉は強調しておきたい――卒業生を量産していた。それが問題の原因だったんだ

S: ある日、オフィスにいたときに、ある策略を思いついたんだ。バランスを少し回復させる策略をね。「プログラマが余るなんてことが絶対にありえないくらい、複雑でおぼえにくい言語があったらどうなるかな」ってね。
実は、この考えの一部は X10――例の X Window の――から頂いたんだ。あれはひどいグラフィックシステムでね、Sun 3/60とかでないと動かなかった。
ばかばかしいくらい複雑な構文規則とか、わかりにくい関数とか、疑似オブジェクト指向的な構造とか、僕がほしいと思う要素は全部揃っていたんだよね。
今でさえ、生の X Window コードを書く人間なんていない。正気を保つには Motif を使うしかないんだ。

S: もうかなり時間がたったしね、C++ が時間の無駄だということにはほとんどの人が気がついたとは思うけど、でも当初予想していたよりはずいぶん時間がかかったな。
I: 具体的に何をどうやったのかな。
S: 最初はほんの冗談のつもりでね、みんながあの本を真に受けるとは思ってもみなかったんだ。脳みそが半分でもあれば、オブジェクト指向プログラミングが非直感的で、非論理的で、非効率なことくらいはわかるよね。
I: え?
S: それに「コードの再利用性」ときたら…。どこかの会社がコードを再利用したなんて話を聞いたことがある?

I: うん、でも C++ は基本的にはしっかりした言語だと思う。
S: それ、本気で信じてるね。実際の C++ プロジェクトの経験はある? どうなるかって言うとね、まず第一に、いろいろワナを仕掛けてあるから、よほど小規模なプロジェクト以外は一発では動かないようになっているんだ。
たとえば演算子のオーバーロードがそうだ。たいていの場合、プロジェクトの終わり頃にはほとんどのモジュールで演算子をオーバーロードしている。
プログラマの連中が、トレーニングコースで教わったとおりにやらなくちゃいけないと思うからだ。つまり、1つの演算子の持つ意味が、モジュールによってまったく異なることになる。
モジュールの数が100かそこらあるときに、これをまとめあげようとしたらどうなると思う? データ隠蔽もあるね。モジュール間の連繋にどこかの会社が苦労しているなんて話を聞くと、笑いを抑えられないときがあるよ。
「Synergistic」という言葉は、プロジェクト管理者の胸に刺さったナイフをグリグリ回すためだけに発明されたんじゃないかと思うな。
0244デフォルトの名無しさん
垢版 |
2021/09/05(日) 18:05:24.16ID:Lkm6/1Sl
https://ideone.com/fHH1N4
これが、シングルトンとして抜けている理由を教えて下し亜。
コードのストックにするために書いたのですが、そもそもシングルトンってなんでしたっけ?
0246はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/09/05(日) 18:10:26.36ID:vh6AiUnJ
>>244
関数テンプレートが結果的に引数の数が違う関数として展開される。
引数の数の違いが結果の違い。
0247デフォルトの名無しさん
垢版 |
2021/09/05(日) 18:23:29.28ID:cBh+EO/A
>static std::shared_ptr<T> O = std::make_shared<T>(A...);
の部分って、Singleton()の初回呼び出しが複数のスレッドから同時に起こってもき
ちんと排他してくれるんでした
っけ

また排他してくれるとしても最速(そのアーキテクチャ(マルチコアかもしれない)で最も適切)
であることを気体していいんでしたっけ……
つまり生成に成功した後は排他不要なわけで、無駄にロックを取りに行きたくない……
0249デフォルトの名無しさん
垢版 |
2021/09/05(日) 18:27:31.03ID:cBh+EO/A
みたいな配慮がシングルトンにしたとたんに必要になる
メインの処理が始まる前に普通の初期化関数呼び出しでOを生成したらそれで済むのに、、、
0251デフォルトの名無しさん
垢版 |
2021/09/05(日) 18:47:53.68ID:cBh+EO/A
>>250
ある
>static std::shared_ptr<T> O = std::make_shared<T>(A...);
全体が排他されないとしたら、Oの生成関数(初期化式「O=」の右辺)が複数回、
それも同期的に繰り返し呼ばれるのではなく、非同期的に再入される形で呼ばれかねない
生成関数の中でリソース確保するとしたら先の呼び出しで確保したリソースの
ハンドルがdunglingにならないように配慮が必要になる
非同期的再入ということは、Oが生成→破棄→生成→破棄、にならず、
生成→生成→破棄→破棄になりかねないから、デストラクタをちゃんと書いたらリークしないとか
そういう認識で当たったらバグる
問題山積や

メインの処理が始まる前に普通の初期化関数呼び出しでOを生成したらそれで済むのに、、、
0255ハノン ◆QZaw55cn4c
垢版 |
2021/09/05(日) 21:38:19.52
>>248
はい、頭も性格も悪いと思います、しかし >>242 の中のどういうところが悪いとお考えになったのか教えていただくと嬉しいです!!
0256デフォルトの名無しさん
垢版 |
2021/09/05(日) 22:21:15.62ID:TAzC3d8r
>>255
そもそも、C++の生みの親で、それに関する書籍を出してその中でC++を
良い言語と自負して(それ以上の言語が出来ないというような主張も幾度もして)
解説し、まだ推進しようとしている人が、C++を徹底的に卑下するかどうかを
疑問に思ってないことも頭が悪いと思われる原因の一つ。
0257デフォルトの名無しさん
垢版 |
2021/09/05(日) 22:29:24.50ID:15q7gB85
実際、C++は、特に初期の頃はCより全面的に優れていると誰でも思えるような
物であって、ちゃんと世界的に認められて広まっていたのに、その部分まで
全否定するようなことをインタビューで答えるわけがない。
その後に追加されて機能は人により評価が分かれて全面的に優れているとは
思えるようなものではなくなっていた。
だから、C++11は、好きな人も居れば嫌いな人も居る。C++98より全面的に
優れていると言えるかどうかは人により評価が分かれるので、好みにより
文壇の様なものが生じている。
0258デフォルトの名無しさん
垢版 |
2021/09/05(日) 22:30:49.67ID:cBh+EO/A
>>254
ひ、日本語でおk、、、

>If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.85
>If control re-enters the declaration recursively while the variable is being initialized, the behavior is undefined.
はどう読めばいいの?
結局concurrentlyにre-enterされるときはbehavior is undefinedとしか読めなさげ

>>254
以上の状況なので>>244の糞コードは直しても仕方が無い
0261デフォルトの名無しさん
垢版 |
2021/09/05(日) 22:52:01.95ID:cBh+EO/A
とオモタがcontrol enters the declaration concurrently のときは初期化のcompletionまでshall waitで、
ただしrecursivelyだとイカン(未定義動作)と書いてあるのか……
つまりSingleton()関数内の初期化式「O=」の右辺がSingleton()を呼び出す場合か

まあ確かにWindousみたいに特殊な仕様のクリティカルセクションでもない限りデッドロックしそう
0262デフォルトの名無しさん
垢版 |
2021/09/05(日) 23:09:38.17ID:eTOvJaZ9
>>251
そうか
まあ仕様的にはスレッドセーフだわ
関係ないけど参照したグローバル変数に値が入っとらんで困ったことがあった
0263デフォルトの名無しさん
垢版 |
2021/09/06(月) 00:30:26.82ID:62gS+LUW
>>258
なんかスレッド安全性の問題にしたいようだけど、
そもそも>>244の第一の問題点は2番目のSingletonの呼び出しだけ別のオブジェクトを指してしまっている点だよ
stdoutの2行目だけ0になってるだろ?
その原因の説明が>>246というわけだ

すべての関数・クラスを最初からスレッドセーフな設計にしないといけないわけじゃない
0265デフォルトの名無しさん
垢版 |
2021/09/06(月) 04:31:59.38ID:G2BRvA3h
ビャーネ・ストロヴストルップその人のインタビューだとは私も考えてませんよ、これはブラックジョークというべきでしょう、まあC++er が気を悪くする理由は理解できますが
それに私も GNU Multi-Precision Library を使うときはC++のラッパの方を使います。C インターフェースの方は使い難くって使い難くって、これはもう罰ゲームですね‥‥
だから演算子のオーバーロードも控えめに使えば有用という立場です、紹介することと賛成することとは別だと思います
https://mevius.5ch.net/test/read.cgi/tech/1434079972/84
0267デフォルトの名無しさん
垢版 |
2021/09/06(月) 07:17:56.24ID:7SReNX2q
>>263
スレッドセーフでなくともよいシングルトンとか
>メインの処理が始まる前に普通の初期化関数呼び出しでOを生成したらそれで済むのに、、、
で良くね?

>>264
>>263じゃないが非アトミックな操作(初回か否かチェックして初回なら初期化する)
であることが明示される分その書き方の方がマシ
必要なら排他する、不要ならしないという判断ができるから
>すべての関数・クラスを最初からスレッドセーフな設計にしないといけないわけじゃない (>>263
という願いも叶うYO!
0268デフォルトの名無しさん
垢版 |
2021/09/06(月) 08:08:09.17ID:62gS+LUW
>>264
確かに普通こんな感じだな
テンプレート別々にすることだけで頭止まってた

>>267
そうだな
書いてはみたがC++でシングルトン使う意味は無いと思う
あれはグローバル変数の無いJavaでグローバル変数を使うためのハックだとか聞いたし
じゃあもう普通にグローバル変数使えばよくね、と
0269デフォルトの名無しさん
垢版 |
2021/09/06(月) 08:45:11.58ID:3/UK3SOv
グローバル変数と同じなのでだめだよな
普通に動的に用意して渡せばよろしい
0270デフォルトの名無しさん
垢版 |
2021/09/06(月) 08:48:23.63ID:HRRCwLhx
ログとかアプリの現行設定ファイルとかはSingletonっぽく実装するけどなぁ・・・
インスタンス生成が遅いものはただのグローバルにしたら起動が遅くなるし
0273デフォルトの名無しさん
垢版 |
2021/09/06(月) 12:01:04.36ID:KKMECnvR
>>255 >>265
これは「権威に訴える論証」を悪用した主張であり、議論の対象としてはいけない類のもの。
もし真面目に議論したいのなら、少なくともStroustrupの名前は消して内容だけに修正しなくてはならない。

本人も否定しているのに訂正もしないようなフェイク記事は邪悪。それに対してコメントを求めるのは正気を疑う。
0274デフォルトの名無しさん
垢版 |
2021/09/06(月) 12:06:51.69ID:86SPG0/G
その昔、こんなクラス作ってたな
class WinMainArguments
{
public:
static HINSTANCE hInstance;
static HINSTANCE hPrevious;
static LPSTR lpszCmdLine;
static int nCmdShow;
};
0275デフォルトの名無しさん
垢版 |
2021/09/06(月) 15:04:51.66ID:DsY+3+kX
>>265
ブラックジョークは大半の人が聴いた瞬間にジョークだと判るから成立する
麦藁禿のあの名文はまさにそれ

だまされてるのは事情を知らない若い人かも知れんな
0280デフォルトの名無しさん
垢版 |
2021/09/06(月) 17:51:19.11ID:ugWeBDlD
今更バイエルの運指について議論してるような雑魚に構うなよ
C++もピアノも、憧れだけあって実力がまるでないバカ
0281デフォルトの名無しさん
垢版 |
2021/09/06(月) 20:33:14.67ID:d5h9Y6Qi
日本語版(0xCC=フ)によりフフフフフ…で埋められたWin32アプリデバッグメモリを思い出した人、どのくらいいるかな



「フフフ…」4歳娘が撮影した花火に家族で爆笑! 見ると笑顔になる“奇跡の1枚”の状況を父親に聞いた | FNNプライムオンライン
https://www.fnn.jp/articles/-/224754
0282はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/09/06(月) 23:42:11.67ID:buVCF6sT
>>278-279
D&E によればネームスペースは 1991 年に ANSI/ISO の委員会において浮上したトピックであるとのことだ。
逆に言えばそれ以前には無かった。
Windows 3.1 の頃に C++ でプログラミングしていたなら >>274 のようなコードが有ったとしても不自然とは言い切れない。
0287デフォルトの名無しさん
垢版 |
2021/09/07(火) 23:50:11.37ID:jZhA4bAr
>>286
ちなみにtry~catch~finallyっぽいのはVC++が持つと光と闇が両方そなわり最強に見える
Cが持つと逆に最適化が合わさり頭がおかしくなって死ぬ
0288デフォルトの名無しさん
垢版 |
2021/09/08(水) 05:21:53.89ID:KzXEzs8I
>>287
別に頭がおかしくなって死なないでしょ
finally機構で資源解放する機会が増えるのはユーザーの利益になるだけで、複雑さを増す不利益にはならないよ
0289デフォルトの名無しさん
垢版 |
2021/09/08(水) 05:59:59.53ID:4NmVrZFW
確かにgccだと-O1でも2でも3でも暴走しちゃうけど、vc++だと最適化してもちゃんと動くね
0290デフォルトの名無しさん
垢版 |
2021/09/08(水) 09:59:21.28ID:1wbeyQs7
VC++はマイクロソフト拡張によってCでも構造化例外処理が使えたんだよね

__try __except __finally
0291デフォルトの名無しさん
垢版 |
2021/09/08(水) 10:59:12.67ID:6jFCz4HP
intalコンパイラはほんとにヤバいが、gccの最適化で変なことになったことは自分は一回もない
0294ハノン ◆QZaw55cn4c
垢版 |
2021/09/08(水) 19:47:37.26
>>286
最近まで try.. catch の実装の大半は sjlj だと思っていましたが最近は違うのですか?
0297ハノン ◆QZaw55cn4c
垢版 |
2021/09/08(水) 20:33:06.31
>>296
それは単なる都市伝説
お布施を毎年律儀に払っている人にそんなことをするわけがないでしょう‥‥
0298デフォルトの名無しさん
垢版 |
2021/09/08(水) 20:48:20.14ID:4NmVrZFW
>>289の件、再現コード抽出しました。最適時i=1がlongjmp後に0に戻ります。
// gccだと最適化なしなら正常終了。最適化すると終わらない。
#include <stdio.h>
#include <setjmp.h>
int main(int argc, char *argv[])
{
int i = 0;
jmp_buf jmpbuf;
_setjmp(jmpbuf);
printf("hoge\n");
if (i < 1)
{
i = 1;
longjmp(jmpbuf, 1);
}
return 0;
}
0300デフォルトの名無しさん
垢版 |
2021/09/08(水) 21:09:30.53ID:4NmVrZFW
インラインアセンブラとかでもない限り、処理系依存の文法を使いたくはないし、>>286はあくまでネタですよ。
ただ最適化時の挙動が違う原因を知りたかったので、個人的に調べた結果を載せといただけです。
お気になさらず。
0303デフォルトの名無しさん
垢版 |
2021/09/09(木) 02:02:27.18ID:aICFtjZy
>>297
規制議論板を一度でも見たことがあるの?
どれだけのIDを消して書き込んでる奴が浪人焼かれてるかその目で確かめてくるといい
0304デフォルトの名無しさん
垢版 |
2021/09/09(木) 02:39:56.24ID:AtdpUvef
コテとトリ付けながらIDは消すとかいうガイジムーブ
他スレでの荒らしがバレたら困りますって宣言してるようなもんだな笑
0306デフォルトの名無しさん
垢版 |
2021/09/09(木) 03:58:39.82ID:k9fYYQrZ
>>305
何を言いたいのか分からない無言URL貼りは時間の無駄なのでやめて欲しいです。少なくとも該当していません。
0307デフォルトの名無しさん
垢版 |
2021/09/09(木) 04:10:55.91ID:k9fYYQrZ
一応書いておくと、>>298のコードは見れば分かるとおりiをvolatile宣言して最適化の対象から外せば当然動きます。
これはlongjmpに限った話ではありません。

先のURLの個別のコードにはありませんが、一般論としての記述はありました。このサイトが元にしてるサイト(リンクのURLは違いましたが)ではvolatileも例に含まれているようです。
https://wiki.sei.cmu.edu/confluence/display/c/MSC22-C.+Use+the+setjmp%28%29%2C+longjmp%28%29+facility+securely
0308デフォルトの名無しさん
垢版 |
2021/09/09(木) 04:18:38.68ID:k9fYYQrZ
すみません。見落としてただけみたいですね。日本語の方でも個別のコードありましたね。寝ぼけてたかも。
0309デフォルトの名無しさん
垢版 |
2021/09/09(木) 08:55:47.93ID:+RnvyubR
>>295
嘘記事かどうかくらいは書いておくべきだと思うがね
だいぶ前に初めて見たとき俺も半信半疑だったし(D&Eをまだ読んでなかった頃だが

てかオブジェクト指向のとこをテンプレート(メタプログラミング)に置き換えるとすごいしっくり来るんだよなアレ
0310デフォルトの名無しさん
垢版 |
2021/09/09(木) 12:39:56.43ID:emntwqXC
>>295
全然違う。
>>230は少なくとも本人の発言からの引用であり、(権威に訴える論証が混ざっているとはいえ)すべてを否定することはできない。
>>242は自分の主張を強化するためにでっち上げた嘘であり、本人の普段の主張を否定する邪悪な紛い物。本人も否定しているものをジョークと称するのはやはり正気を疑う。
0313デフォルトの名無しさん
垢版 |
2021/09/09(木) 18:45:48.31ID:I6ZDQIJr
ダニングクルーガー効果のなんちゃってマスター状態でも容易に書けちゃうのが問題。
そのクソコードの状態でも一応動くところがC++の恐ろしいところでもあり幅広いフリーフォーマットの適応力でもある。
0314デフォルトの名無しさん
垢版 |
2021/09/09(木) 19:54:26.64ID:VcdPV4nP
jokeもhumorも馬鹿には理解できない
0316デフォルトの名無しさん
垢版 |
2021/09/09(木) 20:26:09.91ID:5B6QjFP1
お前らってホント人にケチつけるときだけイキイキとしてんな
0318デフォルトの名無しさん
垢版 |
2021/09/11(土) 11:18:20.93ID:ke/Tkn8S
オブジェクト指向も構造化も原理主義者がウザいだけで
ナンチャッテでいいからやってると問題がきれいに整理できるので
やめようとは全然思わない

テンプレートだってそうだ
0320デフォルトの名無しさん
垢版 |
2021/09/11(土) 12:26:09.65ID:3OqmYb77
C++には酸っぱい葡萄もある
0321デフォルトの名無しさん
垢版 |
2021/09/11(土) 12:37:06.92ID:FXACoymx
テンプレートってただの超絶便利機能だろ
オブジェクト指向笑とは比べ物にならない
0322デフォルトの名無しさん
垢版 |
2021/09/11(土) 12:45:07.36ID:d+bn5JZd
>>318
歴史は繰り返す、ってことだろ
一時期C++コミュニティがJavaに悪影響受けたりしてたことからJavaを嫌悪してたやつが
何でもSTLの真似してりゃ自動的に価値のあるコードになると盲信してたからな
笑うしかない
0323デフォルトの名無しさん
垢版 |
2021/09/11(土) 12:49:01.51ID:ke/Tkn8S
俺ら技術屋の辛いとこだよ
新しいものはとりあえず食ってみるしかない
あげくゲロマズで非常に気分が悪くなることもあるが怖がってらんない
0324デフォルトの名無しさん
垢版 |
2021/09/11(土) 12:59:15.55ID:d+bn5JZd
技術屋というか、実用してる人は盲信はしないと思う
原理主義に走るのは、自分の頭で考えない(権威に頼る)からだ
自分の頭で考えて使ってれば、自ずと長所も短所もわかるもんだ
0325ハノン ◆QZaw55cn4c
垢版 |
2021/09/11(土) 14:40:07.67
>>311
人を選ぶジョークとはまさに >>242 のことだったんですね‥‥
今回は勉強させていただきました
0326デフォルトの名無しさん
垢版 |
2021/09/11(土) 15:50:05.22ID:pU9Ou8D7
分かったら二度とデマ流すなよ
ワクチンにマイクロチップだのどこそこの銀行が潰れるだの朝鮮人が井戸に毒入れただのもだぞ
本人は軽いジョークのつもりでも、デマとして流行したら人が死ぬんだからな
0328デフォルトの名無しさん
垢版 |
2021/09/11(土) 21:27:01.30ID:3OqmYb77
そうはいってもC言語規格にfinally機構があったら便利なはず
PGが規格追加に後ろ向きになってしまうのはコンパイラの対応が信頼できるレベルになるまで時間がかかる不快な経験を積んできたから
0331デフォルトの名無しさん
垢版 |
2021/09/11(土) 21:59:46.39ID:3OqmYb77
>>329
デストラクタがないからこそfinallyで資源解放処理を呼び出す需要があるともいえるんだけど
0332デフォルトの名無しさん
垢版 |
2021/09/11(土) 22:14:53.27ID:rQxvOqzv
>>331
実際に書いてみたらわかると思うけどどこからfinallyに来るのかわからないから解放処理書くのはけっこう大変だぞ
0336デフォルトの名無しさん
垢版 |
2021/09/11(土) 23:18:46.75ID:EO9owr6G
関数毎に atexit かな
0337デフォルトの名無しさん
垢版 |
2021/09/12(日) 01:57:56.96ID:z8yQu9Mw
Goのdefer文でいいんじゃないか
0338デフォルトの名無しさん
垢版 |
2021/09/12(日) 11:03:53.61ID:JRO5EM3e
ハノンフルボッコされて火病を起こしててワロス
自分が悪いのに逆ギレするほどみっともないことはないなあw
0339デフォルトの名無しさん
垢版 |
2021/09/12(日) 11:40:02.90ID:AN8tG6su
整形後に関数が10行以上になったらコンパイルエラーにしよう
関数名1行+開きカッコ1行+return1行+閉じカッコ1行だから実質5行までな
0340デフォルトの名無しさん
垢版 |
2021/09/12(日) 12:24:15.40ID:SBMPlzna
たまにちびっこだらけのピアノ教室に一人だけ下手くそなおじさんが混ざってて臆面もなく発表会とかにも出てくるけど、それがその固定ハンドル
0343デフォルトの名無しさん
垢版 |
2021/09/12(日) 18:54:34.09ID:d/9I2lQ9
>>342
std::thread以外の手段で作ったスレッドで実行したときのふるまいは
規格上非規程ということでおk?
0347ハノン ◆QZaw55cn4c
垢版 |
2021/09/13(月) 01:29:14.15
>>326
米国民主党の宣伝=ロイター・ブルームバーグ=真実
米国共和党、なかんずくプレジデント・トランプの言ったこと=フェイクニュース
という理解でいいでしょうか?イヴェルメクチンの話 https://www.youtube.com/watch?v=zhIg_KNfyhQ

>>338
どこがフルボッコか詳しく、ジョークのわからない馬鹿一人だけが騒いでいた、という印象ですが

>>340
バッハコンクール大人の部には出てみたいですね‥‥たぶんよくできる中高生のなかに一人ヨボヨボが混ざるの図になりそうですけれどもね
0348デフォルトの名無しさん
垢版 |
2021/09/13(月) 02:16:31.80ID:ZygXXNwA
>>347
コンクールとは無縁の音楽歴だろうがクソバカが
見栄張んなよ
精々弱小音楽教室の発表会止まり
0349デフォルトの名無しさん
垢版 |
2021/09/13(月) 03:47:26.34ID:PttYpQoG
わかるよ
C++とはつまりCから2キー(2半音)上げたDという意味
ピアノならCはドでDはレ
0350デフォルトの名無しさん
垢版 |
2021/09/13(月) 04:01:44.26ID:PttYpQoG
このスレにMIDIエンジンを自分で作ったことある人、どのくらいいる?
0353デフォルトの名無しさん
垢版 |
2021/09/13(月) 07:13:59.03ID:PttYpQoG
>>351
思うだけならあなたの自由だから好きにしなさい
0354デフォルトの名無しさん
垢版 |
2021/09/13(月) 07:15:10.48ID:OJvNe7+i
>>351
世の中には移調楽器って言うものがあって、例えば普通によく見かけるトランペットはドの音はB♭だったりする
0355デフォルトの名無しさん
垢版 |
2021/09/13(月) 07:16:20.40ID:PttYpQoG
Windowsの標準システムドライブがCであることの経緯を知らないでPGやってる人、どのくらいいる?
0360デフォルトの名無しさん
垢版 |
2021/09/13(月) 12:01:25.13ID:DUyA86Uv
MIDIなんてPC-98以前のFM音源搭載機でしかいじらなかった
MIDIドライバとかならともかくMIDIエンジンが何なのかよく分からない
0361ハノン ◆QZaw55cn4c
垢版 |
2021/09/13(月) 13:47:19.19
>>348
スレチガイも大概だからここで終わりましょうか
バッハコンクール https://www.bach-concours.org/p/about.html 
趣旨「J.Sバッハの作品はクラシック音楽の真髄、導入期からポリフォニー音楽や舞曲に親しみ、ピアノの学習の中に取り入れて、そしてレパートリーにしていただきたい」、おっしゃるとおり誰でも参加可能です
https://matsuri.5ch.net/test/read.cgi/piano/1488364000/

バッハはこんな曲を作った人:https://www.youtube.com/watch?v=SBWGgwzcjYc
確かアニメ監督の押井守は若い頃バッハの合唱団にいたと聞いています
0363デフォルトの名無しさん
垢版 |
2021/09/15(水) 11:32:22.49ID:0GWRKP/3
関数のポインタを引数で受け取る関数に
予め定義した関数のポインタの代わりに
lambda関数のポインタを渡したいとき
どう書けばよいですか?
0366デフォルトの名無しさん
垢版 |
2021/09/15(水) 12:01:19.03ID:+suq2kti
>>363
こういうこと?
void func1(void (*arg)())
{
arg();
}

template <std::invocable F>
void func2(F arg)
{
arg();
}

int main()
{
func1([]{});
func2([]{});
}
0367デフォルトの名無しさん
垢版 |
2021/09/15(水) 12:57:52.48ID:gM7DTPzC
>>363
違うかも知れんけど、関数ポインタとラムダと型推論でなんかハマってこの記述に落ち着いた。
ttps://ideone.com/UNUgdi
0368はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/09/15(水) 13:01:11.97ID:/JHaU2Oz
>>363
クロージャ (ラムダ式によって作られた関数オブジェクト) は周囲の変数をキャプチャしないときに限り関数ポインタに変換可能。
https://timsong-cpp.github.io/cppwp/n3337/expr#prim.lambda-6
逆に言えばそうでないときは関数ポインタと互換性はない。

受け取る側が関数ポインタとして受け取るという前提を動かせないのであれば
渡すラムダ式のほうをキャプチャしない形にしてくださいということになるし、
汎用的にラムダ式を受け取れるようにしたいのだということであれば >>365-366 という方法をとることになる。
0369デフォルトの名無しさん
垢版 |
2021/09/15(水) 13:05:03.04ID:0GWRKP/3
>>366
template<typename F> void func2(F arg) { arg(); }
int main() { func2([]{}); }

これだと動いています

void func1(void (*arg)()) { arg(); }
int main() { func1([]{}); }

やりたいのはこっちだったんですがこれはコンパイルエラーになりますた

# invocable は C++20 からみたいですね 目的にあってるかどうか判りませんが試す環境が今無いので後回しです
0370デフォルトの名無しさん
垢版 |
2021/09/15(水) 13:05:45.58ID:0GWRKP/3
>>368
ああなるほど
[&] してたのが原因かも知れません
ありがとうございます
0374デフォルトの名無しさん
垢版 |
2021/09/17(金) 16:40:49.64ID:J/w/zJeW
仕事が生きがい?会社員の分際で?そろそろ認めなさい…あなたたちは単なる駒です
⇒赤羽の父ひろゆきが教える仕事の本質とやりたいことの違いが凄過ぎて感動が止まらない…
https://www.youtube.com/watch?v=zkwQOdq17dI
【ひろゆき/切り抜き】サラリーマンって資本主義の奴隷なの?
https://www.youtube.com/watch?v=Vi-dvyd5ksE&;t=74s
【ひろゆき】社会人語っちゃうサラリーマンについて語りました
https://www.youtube.com/watch?v=pX7NHj_rIBg
奴隷は身近にある?日本の奴隷について【ひろゆき 切り抜き】
https://www.youtube.com/watch?v=evQjCUWIHV4
【ひろゆき】会社員なんて楽しくない?⇒楽しいしラクな仕事の仕方とは※サラリーマン必見!
https://www.youtube.com/watch?v=T95-FS8sT3w&;t=390s
【ひろゆき】日本のサラリーマン制度...終わってますよwww
https://www.youtube.com/watch?v=Y-30zk2zDn0
【ひろゆき】視聴者の質問そっちのけで虚言癖アピールするひろゆき
https://www.youtube.com/watch?v=cMjk9B4J2n4
【ひろゆき/切り抜き】虚言癖ってどうやって直せばいい?
https://www.youtube.com/watch?v=5cS7vyb0tfE
0375デフォルトの名無しさん
垢版 |
2021/09/18(土) 12:55:20.00ID:fzYJNrfO
聞いてくれウィンドーズ10で
 GetLocalTime(&st1);
 const system_clock::time_point now = system_clock::now();
GetLocalTime&(st2);
とした後に、nowから
 const time_t tt = system_clock::to_time_t(tp);
 auto msec = duration_cast<milliseconds>(tp.time_since_epoch()).count() % 1000;
としてnowのms単位のUNIX Timeを算出したらば、
 st1 ≦ now
は当然成立しているが、
 now ≦ st2
は成立しないことがあり、何か
 now ≦ st2 + 1
なんじゃわ;;;

何で?!
0376デフォルトの名無しさん
垢版 |
2021/09/18(土) 12:57:50.95ID:fzYJNrfO
処理系はMSVC2019でつ、
duration_cast<T>はTで指定した時間単位未満は切り捨てとC++の規格で決まっているはず……
0377デフォルトの名無しさん
垢版 |
2021/09/18(土) 13:05:15.92ID:fzYJNrfO
ちなみにst1 < st2 でありかつ (now ≦ st2) が非成立、というケースも発生するあるから
おかしいのは明らかにstd::chronoの方、
0378デフォルトの名無しさん
垢版 |
2021/09/18(土) 13:23:54.83ID:I+biH5jK
>>377
これだけじゃどっちがおかしいかは分からんでしょ
GetLocalTimeが正しいと思うからGetLocalTimeでsystem_clock::nowを挟んだんじゃないかい
0379デフォルトの名無しさん
垢版 |
2021/09/18(土) 13:43:19.07ID:fzYJNrfO
>>378
>>377のは時刻のキャッシングみたいなことをしており呼び出した瞬間の時刻を返していないとしたらそれはGetLocalTime()の方ではない、という証左

つなみにマルチコアと最適化(いやしくもAPIの呼び出しがあるのであり得ないが)とプリエンプションの合わせ技で
実行順序が変になり得るかも、みたいな被害車妄想で
  GetLocalTime(&st1);
  const system_clock::time_point now = system_clock::now();
  _ReadWriteBarrier();
  GetLocalTime&(st2);
としてみたが>>377な現象は変わらんかったは、
0380デフォルトの名無しさん
垢版 |
2021/09/18(土) 13:48:57.22ID:vjp4M7Ow
windowsのAPI同士で比較しろ
一般に違うAPIを使ってるなら一貫した結果にならなくてもおかしくない
0381デフォルトの名無しさん
垢版 |
2021/09/18(土) 13:53:59.82ID:I+biH5jK
ちゃんと知りたいならsystem_clock::nowが内部でどのAPIを呼んでいるのか調べてみては
0387デフォルトの名無しさん
垢版 |
2021/09/19(日) 13:12:19.06ID:/yxUr6Cy
中途半端なコードだけチラ見せされてもな
再現する完全なコードを出せとしか
0388デフォルトの名無しさん
垢版 |
2021/09/19(日) 15:50:35.11ID:neurUQ4a
>>386
天才なのでそんなヘマはしますしません、

>>387
再現コード貼る、
https://ideone.com/GeMebI
※ 冒頭コメントの通り、非Windows環境では現象再現しないコードなのので注意

ウィンドーズでの実行結果:
i=---: st1, chrono, st2: ORDER CHECK
i= 0: 1632034143228, 1632034143228, 1632034143228: OK.
i= 1: 1632034143229, 1632034143229, 1632034143229: OK.
i= 2: 1632034143229, 1632034143229, 1632034143229: OK.
i= 3: 1632034143229, 1632034143230, 1632034143229: NG!
i= 4: 1632034143229, 1632034143230, 1632034143229: NG!
i= 5: 1632034143230, 1632034143230, 1632034143230: OK.
i= 6: 1632034143230, 1632034143230, 1632034143230: OK.
i= 7: 1632034143230, 1632034143231, 1632034143230: NG!
i= 8: 1632034143230, 1632034143231, 1632034143230: NG!
i= 9: 1632034143230, 1632034143231, 1632034143230: NG!

==> ORDER CHECK 「NG!」のところでchrono > st2 になっており、chronoのtime_pointがSYSTEMTIMEを1 msだけ追い越している
0389デフォルトの名無しさん
垢版 |
2021/09/19(日) 15:57:36.84ID:neurUQ4a
こっそり訂正するが、>>377
>st1 < st2 でありかつ (now ≦ st2) が非成立、というケースも発生するあるから
と言ったがな、ありゃ誤報だスマンカッタ、

あとちなみに、>>375を書いた時点では、現象再現はFILETIMEを使わずに、以下の方法で、
SYSTEMTIMEと ( (time_point - epochタイム) を tm構造体に変換したもの、の
それぞれからから直接シリアル日時を出して比較すた、
  year * (12 * 31 * 24 * 60 * 60 * 1000)
 + month * (31 * 24 * 60 * 60 * 1000) // 一ヵ月の日数を31固定で換算しているが、大小比較目的なのでこれで問題無い。
 + day * (24 * 60 * 60 * 1000)
 + hour * (60 * 60 * 1000)
 + minute * (60 * 1000)
 + second * (1000)
+ millisecond
0390デフォルトの名無しさん
垢版 |
2021/09/19(日) 16:10:18.78ID:HwX1dH8g
まともに読んでないがバリアの使い方がおかしくて実行順序入れ替わってるとかじゃね??
0391デフォルトの名無しさん
垢版 |
2021/09/19(日) 16:33:01.30ID:neurUQ4a
>>390
(1) _ReadWriteBarrier()は最強のバリアーやぞ;;;
(2) GetLocalTime()がどんな副作用を持つ関数かコンパイラが知るはずは無いのだから
  最適化でコードの入れ替えや変数のレジスタ割り当てしっぱなしということはあり得ない
(3) ていうかそれ以前に、GetLocalTime()やstd::chronoの呼び出し元がシングルスレッドなのだから
  それで順序がおかしくなるとかCPUがおかしいか、スレッドをプリエンプトして再びディスパッチする際に
  別のコアに実行させようとする際にOSがヘマしているかのどちらかという話に……

ちなみに漏れは正常動作しており、本人が言うのだから間違いない
0393はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/09/19(日) 17:02:40.43ID:nkVr2ypq
>>375
GetLocalTime の分解能は 10ms くらいっぽいぞ。
system_clock::now がもっと精度の高い API を使っていたら
そんくらいの前後はあってもおかしくないんじゃね。
0394デフォルトの名無しさん
垢版 |
2021/09/19(日) 17:17:42.61ID:k8GedCcQ
https://ideone.com/qA5yOL
system_clockの部分を生のFILETIMEで置き換えてみた
実行結果はこんな感じ
i= 0: 132765453416200000, 132765129416213861, 132765453416200000: NG!
i= 1: 132765453416210000, 132765129416218094, 132765453416210000: NG!
i= 2: 132765453416210000, 132765129416218837, 132765453416210000: NG!
i= 3: 132765453416210000, 132765129416219530, 132765453416210000: NG!

GetLocalTimeやめたら?
0396デフォルトの名無しさん
垢版 |
2021/09/19(日) 17:59:29.70ID:UeoKc9fZ
時刻取得でそのまま精度を上げるAPIとしては
GetSystemTimePreciseAsFileTime
https://docs.microsoft.com/ja-jp/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime
ただしWindows 8以降。それ以前だと以下を使うしかないっぽいね。
GetSystemTimeAsFileTime

std::system_time::nowの実装としては、_Xtime_get_ticksを使用している(2021年9月21日17:57JST現在)
https://github.com/microsoft/STL/blob/main/stl/inc/chrono#L663-L665

これが使用しているAPIについて聞いたStackoverflowの質問
https://stackoverflow.com/questions/54933940/what-clock-does-the-visual-studio-2017-crt-implementation-of-stdchronosystem

上記によると最初に書いたAPIである模様
0397デフォルトの名無しさん
垢版 |
2021/09/19(日) 19:46:00.85ID:neurUQ4a
>>393
GetLocalTime()の精度が10 ms台だというのは
Windowsのデフォルトのスレッドへの最大ディスパッチ時間15.6 ms(PCによっては10 ms)の影響が混入している可能性、
>>392のリンク先のような計測方法をとった場合、計測中に他のスレッドに実行権を横取りされたりすると、どうしても
期待する時間に対して15.6 msとか(高優先のスレッドが相次いでディスパッチされた場合はあるいはもっと)実際の時間が大きくなる
一方>>375の計測方法は時間の順序にのみ注目しており、プリエンプションの影響を受けない(はずだった
この話に猜疑があるなら後で述べる

>>392
>>392の情報提供はdクスやし実際乗り換えようかと考えているが、それはそうとして、std::chronoのふるまいを検証しなくて委員会?
0398デフォルトの名無しさん
垢版 |
2021/09/19(日) 20:05:49.20ID:neurUQ4a
というわけでms単位のUNIX timeを得るにあたってstd::chronoとGetFileTimeAsSystemTime()が同じ精度であり互換であることを
直接検証すた、
https://ideone.com/9Opqj9

実行結果(Windows 10)
i=---: st1, chrono, st2: ORDER CHECK
i= 0: 1632049473157, 1632049473157, 1632049473157: OK.
i= 1: 1632049473158, 1632049473158, 1632049473158: OK.
i= 2: 1632049473159, 1632049473159, 1632049473159: OK.
i= 3: 1632049473159, 1632049473159, 1632049473159: OK.
i= 4: 1632049473159, 1632049473159, 1632049473159: OK.
i= 5: 1632049473159, 1632049473159, 1632049473159: OK.
i= 6: 1632049473159, 1632049473159, 1632049473159: OK.
i= 7: 1632049473159, 1632049473159, 1632049473159: OK.
i= 8: 1632049473160, 1632049473160, 1632049473160: OK.
i= 9: 1632049473160, 1632049473160, 1632049473160: OK.
NG times=0/10

問題無くなったやたー
0399デフォルトの名無しさん
垢版 |
2021/09/19(日) 20:13:38.40ID:neurUQ4a
>>393
GetSystemTime()は確かに根本的に精度悪かったスマンカッタorz
この結果からすると、ウィンドーズのシステム時間のの実装は、
OSがプリエンプトした際に更新し、ディスパッチ中は値が変わらないというしくみな可能性が大きい
※ 取得時間の間隔が15.6 msの倍数にならないのは、15.6 msというのがあくまで1津のスレッドが
  ディスパッチされてからプリエンプトされるまでの「最大」時間であって実際は高優先のやつに横取りされたり
  自発的に待ちに入ったりで15.6 msより小さい時間で実行権をOSに返すからだと思う
0402デフォルトの名無しさん
垢版 |
2021/09/19(日) 22:38:35.16ID:UeoKc9fZ
>>401
大元はWindows3.1時代からあったGetTickCountだと思うんだけど、説明的にそこしかなかったから書いた
WinAPIスレで聞きたければどうぞ
0403デフォルトの名無しさん
垢版 |
2021/09/20(月) 00:06:39.19ID:luBeUSFz
周期15.6 msを下位互換性のために新しいWindowsがエミュレートしているというのはありえない

1スレッドへの最大割り当て時間としての15.6 msはPCによって変わり得るデフォルト値にすぎないし、
http://hp.vector.co.jp/authors/VA007219/rtc_pic.html

だいたい設定でも変わるし、
https://atmarkit.itmedia.co.jp/ait/articles/1410/30/news150_2.html
(スレッドのクォンタムタイム)

取得間隔が15.6 msにならない理由は>>399で説明いしたし
0404デフォルトの名無しさん
垢版 |
2021/09/20(月) 00:10:20.87ID:luBeUSFz
で、GetTickCount()の分解能かきちり1 msであることはビジーループ的に値をとってみたらワカル
分解能に関して後方互換性も糞もなく昔からそいうブツのはず
多分やけど、ハードウェアのカウンタを読んでるだけやからなあれ
0405デフォルトの名無しさん
垢版 |
2021/09/20(月) 00:25:55.12ID:luBeUSFz
と思って、
  const int N = 10;
  std::vector<DWORD> vec;
  DWORD curTmg = GetTickCount();
  DWORD prevTmg;
  while (vec.size() < (size_t)N) {
    prevTmg = curTmg;
    curTmg = GetTickCount();
    if (prevTmg != curTmg) {
      vec.push_back(curTmg);
    }
  }
  for (int i = 0; i < N; i++) {
    (差分vec[i] - vec[i-1]をprint)
  }
というのをやったら、
0406デフォルトの名無しさん
垢版 |
2021/09/20(月) 00:26:50.20ID:luBeUSFz
vec[0]=1391507593
vec[1]=1391507609 (diff=16)
vec[2]=1391507625 (diff=16)
vec[3]=1391507640 (diff=15)
vec[4]=1391507656 (diff=16)
vec[5]=1391507671 (diff=15)
vec[6]=1391507687 (diff=16)
vec[7]=1391507703 (diff=16)
vec[8]=1391507718 (diff=15)
vec[9]=1391507734 (diff=16)
やったわorz
まつがえますたすみません;;;
勉強になるなあ、
0407デフォルトの名無しさん
垢版 |
2021/09/20(月) 06:12:36.98ID:DnvAIBnA
>>402
自己レスです

GetTickCountとGetLocalTimeとGetSystemTimeの分解能調査
https://ideone.com/wKC8DA
1000回値が変わるのにかかった時間をマイクロ秒で計測した(std::chrono::high_resolution_clock::now()で計測)

PS C:\> .\ConsoleApplication8.exe
15614998
1003946
1000238
PS C:\> .\ConsoleApplication8.exe
15621414
1001066
1001218
PS C:\>

結論: GetLocalTimeは約1秒なのでこの環境(Win10+ハード)では1ms程度の分解能がある
感想: 誤差大きい
0409デフォルトの名無しさん
垢版 |
2021/09/20(月) 07:51:13.46ID:l/aXhlvm
スレタイも読めない、検索できないやつがまともなプログラム書けるはずもなく・・・
0410デフォルトの名無しさん
垢版 |
2021/09/20(月) 07:52:13.05ID:Mm5TpRqo
windows API使いたがるひとがいてめんどくさい
こっちはなるべく標準のc++使いたいのに
0412デフォルトの名無しさん
垢版 |
2021/09/20(月) 10:01:57.22ID:LqQpPYvk
プラットフォーム固有の話も参考になる
今回の流れは Win32 API と std::chrono の違いが端緒だしスレ違いというほどではない
0416デフォルトの名無しさん
垢版 |
2021/09/20(月) 11:30:28.88ID:DnvAIBnA
とりあえず動かないから面白くないということなのかもなということで、Linuxのclock_gettimeにも対応しといた。
BSDとmac組は知らん。
https://ideone.com/Z9CfOo

一応WIN32はあえて低解像度のを計測してるという点だけは補足しておきます。
0421デフォルトの名無しさん
垢版 |
2021/09/20(月) 13:22:11.61ID:DnvAIBnA
>>420
そのタイマは同期待ち合わせに使用するタイマリソースですね
時間計測用に使うのは勿体ないのでやめましょう
また無言でAPIだけ書かれても困ります
0424デフォルトの名無しさん
垢版 |
2021/09/20(月) 16:05:39.48ID:DnvAIBnA
>>422
この例はExついてないけど、こういう使い方をするものなんだよ。
待機可能タイマー オブジェクトの使用 - Win32 apps | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows/win32/sync/using-waitable-timer-objects

>>423
>>388で求めているのは正確には時刻取得だね。つまりsystem_clockの話。
俺がしてるのは時間計測なのでsteady_clockの話。
違いは時刻の修正などにより増減するかしないかという特性の違いと、それを実現するHWタイマの分解能/性能の違い。
GetLocalTimeの分解能は文書にも記述がなく、>>393の指摘だけで事実関係が不明なまま宙に浮いてたので、>>416などでそれを計測した。
ここでは10〜15.6msの出元であるGetTickCountもついでに計測した。
steady_clockとsystem_clockをどこかで同時に取得して、steady_clockの分解能のまま時刻っぽいものを得るみたいなことも短期的には現実的な精度でできなくはないけど。
0425デフォルトの名無しさん
垢版 |
2021/09/25(土) 05:50:44.21ID:B+D0wTVh
3種類ぐらいのタイマの時刻が1000回変化するのに要するトータル時間Tを測っているらしいが
この計測結果からSYSTEMTIMEの分解能がHWタイマの分解能/性能の違いに起因すると結論づけることはできない

実態は>>375な計り方でst1: SYSTEMTIME、now: nowtime_point、st2: SYSTEMTIME、の順で立て続けに時間をとると
>>388の通り
  st1 ≦ now && now ≦ st2 + 1 ms
という結果なわけで、この「1 ms(<15.6 ms)というのは本当にハードウェアタイマの分解能なんかい話が違うぞ?!」と詰問されて
答えに窮する>>424な未来が見える見えまくり
0426デフォルトの名無しさん
垢版 |
2021/09/25(土) 05:55:32.54ID:B+D0wTVh
実態は>>399に書いた理由のはずで、
証拠にst1の取得とnowの取得の間にSleep(1000)とか入れたら
>>388の結果はたちどころに
 st1 ≦ now && now ≦ st2 + 1秒
に早変わりする
よってGetSystemTime()で取得するSYSTEMTIMEの分解能はHWタイマの分解能/性能起因ではなく、
GetSystemTime()で取得する時刻がOSのプリエンプションタイミングでのみの更新されるというソフト要因である、
という>>399に述べた理屈が正解ということでケテーイ

実際にやってはいないが天才なので以上のことはちょっと考えたらワカル
0427デフォルトの名無しさん
垢版 |
2021/09/25(土) 06:02:51.16ID:B+D0wTVh
ごめ、Sleep(1000)を入れたのではOSにプリエンプションの機会を与えてしまうからNG
正しくは
 GetSystemTime(&st1);
 15.6 ms未満のビジーループ  <== 訂正
 now = system_clock::now();
GetSystemTime(&st2);
とすると、
 st1 ≦ now && now ≦ st2 + 15.6 ms
にnowの精度が劣化する、に訂正

OSのAPIもプリエンプションの機会にならない保証が無いのでビジーループはガチでビジーループで作る必要があり、
面倒なのでやらないがな!
0428デフォルトの名無しさん
垢版 |
2021/09/25(土) 07:18:10.24ID:B+D0wTVh
といいつつAPIに頼らずに10 ms規模のビジーループ(ビジーウェイト)させるのはやや技巧を要すると思ったので漏れが自らやってやった、
https://ideone.com/CjXN4X
※ 計測の実行は要Windows

結果、1 ms、8 ms、16 ms、1秒のどれに変えても>>388と同じで、
std::chrono::now()の時刻nowに対し、その直後にGetSystemTime()で得た時刻st2が
1 msだけ追い越されることはあっても決して 1 msより大きく追い越されることは無かったorz
なぜじゃ闇が深いなこれ、

もちろんGetSystemTime()ではなくGetSystemTimePreciseAsFileTime()を使う(↑のソースコードのPRECISE_AS_FILETIMEマクロ定義を有効化する
>>398の通りドンピシャな時刻順になる点はビジーウェイトがあっても変わらない。
GetSystemTime()のふるまいが一方的に謎杉
0429デフォルトの名無しさん
垢版 |
2021/09/25(土) 08:12:02.95ID:HzR9ZlyY
WinAPIスレに持っていってくれますか?
結局<chrono>に固有の問題(?)ではなくて背後のAPI関数に関することって分かったはずなんで
0431デフォルトの名無しさん
垢版 |
2021/09/25(土) 09:20:27.88ID:ZWKkb85T
>>425
HWタイマの分解能/性能の違いと言ってるのはsystem_clockとsteady_clockの違いの話でWindows APIの話はしてないよ。
一応補足しておくとepochも違う(時刻としてそのまま使えるのはsystem_clockということ)。
>>426以降は妄想が迷走してるだけに見えるかな。
>>430は新しい事実で>>393の謎も解けたしもう俺的に不思議な部分はない。
0434デフォルトの名無しさん
垢版 |
2021/09/25(土) 18:44:00.64ID:+JZgAVsh
割り込み禁止命令が実行できたり
割り込みコントローラにコマンド出せたりする
デバドラかMODESETみたいのないと無理だよ
0435デフォルトの名無しさん
垢版 |
2021/09/26(日) 12:46:15.93ID:9lvhFgGq
std::complex<double> の変数 a, b について、OpenMP の並列リージョン内での
#pragma omp atomic
a += b;

error: invalid expression type for '#pragma omp atomic'
というエラーを出すんですが、std::complex はアトミック演算の対象外ですか?
それとも他の何かを見落としてる可能性がある?
0436デフォルトの名無しさん
垢版 |
2021/09/26(日) 13:03:13.46ID:4UIlewCz
ompのAPI仕様書を読むと対象はスカラー型のみって書いてあるから対象外なんじゃないの?
0438デフォルトの名無しさん
垢版 |
2021/09/26(日) 13:07:22.68ID:9lvhFgGq
数学とか物理の用語としては複素数はスカラーですが、コンピューター用語としては違うんでしたっけ?
0442デフォルトの名無しさん
垢版 |
2021/09/26(日) 15:02:24.84ID:9lvhFgGq
>>441
つまりatomicはプリミティブ型だけ想定してるってことですかね
ありがとうございます
おとなしくクリティカルセクションにします
0443はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/09/27(月) 00:54:20.59ID:vtQXnC4F
>>438
C++ におけるスカラ型の定義
・ 算術型 (整数型と浮動小数点数型)
・ 列挙型
・ ポインタ型
・ メンバへのポインタ型
・ std::nullptr_t
・ 以上を cv 修飾 (const や volatile で修飾) したもの

https://timsong-cpp.github.io/cppwp/n3337/basic.types#9

言語によって定義は異なっている (または定義を持たない) ので
コンピューター用語として一般化は出来ないと思う。
0446デフォルトの名無しさん
垢版 |
2021/09/27(月) 19:18:30.57ID:LR1S7vXs
複素数を直接扱う命令がないCPUが多い以上、小数2個で表される複素数がスカラではないのは自然だと思うけど

それを言い出すと、一般線形群と呼ばれる行列はなんでも算術型になるのではないか?と思えてくるし
0447デフォルトの名無しさん
垢版 |
2021/09/27(月) 19:25:38.25ID:n9hc+rIL
arithmeticを「算術」とか仰々しく訳すからおかしくなる
要は小学生がさんすうで習うような単純な数のことよ
0451デフォルトの名無しさん
垢版 |
2021/09/27(月) 22:51:45.61ID:GPisoDJi
複素ベクトル空間の係数体の元として見ればスカラだし複素数体を実ベクトル空間と見れば複素数は実ベクトル
0452デフォルトの名無しさん
垢版 |
2021/09/28(火) 07:58:37.24ID:ZoUlFxaV
除算が定義できる体なので普通はスカラーとして扱うと思うけどな。
2要素の実ベクトルや2自由度の行列に適切な演算を導入することによって同一視することはできる。
0453デフォルトの名無しさん
垢版 |
2021/09/29(水) 10:21:13.97ID:QYKzykPR
>>447
要は小学生がさんすうで習うような単純な数のことを「算術」と言うんだが
0454ハノン ◆QZaw55cn4c
垢版 |
2021/09/29(水) 18:51:49.92ID:+NS+8RdU
>>452
>2自由度の行列に適切な演算を導入
有名な a b -b a 以外にも複素数と同様に振舞う行列を定義できるものでしょうか?それはどんな形?
0456デフォルトの名無しさん
垢版 |
2021/09/30(木) 04:33:42.15ID:a96KQdEj
>>454
> 有名な a b -b a 以外にも
> 複素数と同様に振舞う行列

この世のことを何一つとして理解してないことがよく伝わってくる2フレーズ
0457デフォルトの名無しさん
垢版 |
2021/09/30(木) 10:27:42.19ID:rsDh5L5E
i 0
0 i
0458デフォルトの名無しさん
垢版 |
2021/09/30(木) 12:07:05.65ID:CrfxKotF
複素数z=x+iy (x, y:実数)とした場合どうやって行列で表現できるのか分からん
そもそも無理だろ
0460デフォルトの名無しさん
垢版 |
2021/09/30(木) 12:39:55.75ID:HqpdIwHE
複素数の実行列表現あたりで調べれば出てくるから自分で調べろ。

複素数ライブラリの実装は行列表現だろ。
0462ハノン ◆QZaw55cn4c
垢版 |
2021/09/30(木) 21:06:22.87ID:SS5VJirH
>>460
キーワードありがとうございます!
1, 1, -2, -1 とか 3, 2, -5, -3 とか i に対応するものはいろいろあるんですね

>>456
生きていてすみません
0464デフォルトの名無しさん
垢版 |
2021/10/01(金) 04:28:27.07ID:YSb3+a7i
パウリ行列やで
0466デフォルトの名無しさん
垢版 |
2021/10/01(金) 11:45:26.96ID:o+E+DUKy
そもそも勝手な演算❎とかを用意して、それを複素数の演算になるような演算規則にすればいいだけの話

普通のプログラミング言語での実装は2要素ベクトルに対して複素数積となるような演算を*に対応させているんだと思うけどな

行列積が複素数の積と同一視できるような表現行列があるというだけ

群論とか環論とか体論とか入門的にでもやればわかるよ
0470デフォルトの名無しさん
垢版 |
2021/10/02(土) 14:56:43.55ID:cR/mfYmg
んまーたしかに物理現象は座標変換しても変わらない(同じもの)とみなすのが
物理の先生なのかもしれん スカラーもそん延長線上の概念
しかし観測が系に影響を与えると言い出した時点でいつまで真理でありつづけることやら……
0471デフォルトの名無しさん
垢版 |
2021/10/02(土) 20:42:45.96ID:xJ5F1jwy
>>467
言葉足らずだったかもしれないが、複素数体と数学的にはR2の正規直交基底かつ基底の長さが1のベクトルの成分表示を、適切な演算を入れることによって同一視することができるという話をしているのであって、一般的なベクトル空間の話をしている訳ではない。
0472デフォルトの名無しさん
垢版 |
2021/10/02(土) 21:15:26.25ID:cR/mfYmg
スカラーか否かというのは数をどこに使うかの話であって
数をどう表現するかの話ではないし、
0473デフォルトの名無しさん
垢版 |
2021/10/02(土) 21:16:10.17ID:cR/mfYmg
それはそうとしてR^2と言っただけでは計量が入っていないから(平行移動も糞も無いため)ベクトル空間ではない
つまり { ベクトル空間 } ⊂ { R^2 } であってR^2の方がより一般的

R^2上で実数と同じ7つの演算則を満たす演算を形式的に定義することはできるが|i|=1を表すために
>正規直交基底かつ基底の長さが1のベクトルの成分表示
が必要になるから複素数体を正確に言い表すにはR^2ではなくてユークリッド空間か何かが要ることになるんじゃないの
0474デフォルトの名無しさん
垢版 |
2021/10/02(土) 22:42:32.17ID:5uoG6j9g
加法(V × V → V)と係数体による倍演算(K × V → V)が入ってて線型ならベクトル空間だよ, 計量入れたら計量ベクトル空間
0475デフォルトの名無しさん
垢版 |
2021/10/05(火) 17:00:23.30ID:YgA3J5wy
関数の引数に参照渡しで何も渡さないようにするはどうすればよいですか

自作クラスAがあったとして、それを引数にとる関数
void hoge(int& p1, A& p2)
があります。

ただ、p2は、ケースによっては要らない場合もあって、その場合にはどうすればよいですか。

調べてみたらnullptrみたいなのはあったので、
int p1 = 1;
hoge(p1, nullptr);
と書いてみても、
非constの左辺が何とかとエラーが出て、渡せませんでした。
0477はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/05(火) 17:41:01.80ID:krkmojOq
>>475
参照は何も参照していない状態というのは作れない。
参照で受け取るように書いてあればその参照が無効ということはあり得ないという表明として解釈するのが通例。
(実際にはダングリング参照はあり得るけどそれは単に間違ったプログラムなので気にしない。)

引数として不要なのであればオーバーロードで引数が不要な関数も用意するのが真っ当な方法だけれど、
どうしても無効ということを表す状態を渡したいということであればダミーのオブジェクトを作っておいて
それを無効の意味に使うという方法は考えられる。 (不格好だけど……。)

#include <iostream>

struct A {};
A dummy;

void hoge(int& p1, A& p2 = dummy) {
if(&dummy == &p2) std::cout << "p2 is dummy" << std::endl;
else std::cout << "p2 is not dummy" << std::endl;
}

int main(void) {
int foo = 1;
A bar;
hoge(foo, bar);
hoge(foo);
}

あるいは std::variant と std::monostate と std::ref を組み合わせれば表現できなくもないかなぁ……。
0480デフォルトの名無しさん
垢版 |
2021/10/05(火) 17:49:14.63ID:3jRalumJ
>>476
*(A *)nullptr にしないとエラーになるな
そいで関数側で&p2==nullptrでnullptrが渡されたかどうかチェックできるね
でもこんなの許されてるの?
0482デフォルトの名無しさん
垢版 |
2021/10/05(火) 19:00:16.73ID:lBT+65cn
何いってんだ
キチンと動作する
ただの参照なんだから未定義じゃないだろ
他の変数に受け渡してるワケでもないし
0483はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/05(火) 19:59:32.04ID:krkmojOq
>>482
実質的な (コンパイルされた後の) 動作として値を取り出す必要がないというのは、
言語仕様上において * の適用を無かったことに出来るわけではない。
(C には単項 * の結果に単項 & を適用した場合に相殺されてどちらも無かったことになる規則があるが……。)
0484デフォルトの名無しさん
垢版 |
2021/10/05(火) 20:26:29.70ID:SwNxahaG
また未定義動作なんか怖くない君か
命知らずなのはいいけどチームプログラミングには関わらないでね本当に迷惑だから
0485デフォルトの名無しさん
垢版 |
2021/10/05(火) 20:32:26.64ID:7rL/DhC7
1. 参照をやめてポインタにする
2. std::optional<T>を使う(C++17以降)

俺ならこのどっちか
0486デフォルトの名無しさん
垢版 |
2021/10/05(火) 22:18:37.99ID:bhHmmGon
クラスTが自作クラスなら
Tにnulを意味するlオブジェクトを定義すれば良い……
>>477なdummyオブジェクト方式はテンプレートの中で使いにくくなるいはず
>>485なstd::optional<T>案はどうせ余計な記憶を要するのだからT固有のnullを定義するうのとイーブン
0487デフォルトの名無しさん
垢版 |
2021/10/05(火) 22:24:32.10ID:bhHmmGon
もちろんT固有のnull「値」の定義においては
  オブジェクトの参照 == null値、
はアドレスの一致ではなく値の一致として解釈されねばならな
0488デフォルトの名無しさん
垢版 |
2021/10/05(火) 22:44:53.78ID:bhHmmGon
さもないと、クラスTのnull値をT_NULLみたいな名前にしたとして、
  T arr[] = { T_NULL, T_NULL, T_NULL, T_NULL };
みたいなことができないか
らな
0490デフォルトの名無しさん
垢版 |
2021/10/06(水) 00:55:04.49ID:E9G/hK4q
void hoge(int& p1, optional<A>& p2 = nullopt) { // constじゃないのでエラー
みたいなことってoptionalで上手いことやる方法ないの?
呼び出し元は
int i;
A a;
hoge(i, a);
hoge(i);
みたいな感じで
書き換えられるけどhogeから抜けたら消える初期値nulloptのoptional<A>をデフォルト値で渡せるのか知りたい
0492デフォルトの名無しさん
垢版 |
2021/10/06(水) 01:31:37.67ID:V3EBITWg
nullopt以外が渡されたらそのA&に対して、
nulloptが渡されたらスタックにAを構築したうえでそのA&に対して操作したい、ってこと?

それはvoid hoge(int& p1, A& p2 = デフォルト値)でいけるんじゃないかい
0495デフォルトの名無しさん
垢版 |
2021/10/06(水) 06:31:33.91ID:lNsYT/rw
部分特殊化できないのは関数テンプレートだよな

template<class T1, class T2>
struct test {
void fig1();
void fig2();
void fig3();
};

template< > void test<void, void>::fig1(); //ok
template<class T1> void test<T1 , void>::fig2(); //error
template<class T2> void test<void, T2 >::fig3(); //error

クラステンプレートなのに弾かれるのは何で?
0496デフォルトの名無しさん
垢版 |
2021/10/06(水) 06:43:32.28ID:Cv4NDZSF
その部分特殊化されたtest(構造体)が定義されてないからだね
先にtestの部分特殊化を書けば通る
0497デフォルトの名無しさん
垢版 |
2021/10/06(水) 07:59:10.51ID:E9G/hK4q
>>494
std::reference_wrapperは知りませんでした
std::optional<A>をstd::optional<A*>にしてconstのままいじれるようにした気分なので
実質無理ってことなのかなぁと思いますが…
ありがとうございます
0498デフォルトの名無しさん
垢版 |
2021/10/06(水) 08:17:01.00ID:fON1wZ9Y
>>475
普通はオーバーロードだな。デフォルトを指定させたいのならnullobjectを始めとする定数オブジェクトかね。

nullポインタとか空のスマートポインタとかはエラーの元だから避けたいところ。
0499デフォルトの名無しさん
垢版 |
2021/10/06(水) 08:26:08.77ID:E9G/hK4q
>>497
自己レスです
いずれにしても呼び出し元を変更せずに要件を満たせそうな唯一の方法っぽいので解決ですね
(私は>>475ではありません)
0502デフォルトの名無しさん
垢版 |
2021/10/06(水) 09:13:14.40ID:lTl3I+RT
とはいえ、いきなりテンプレートにするのはハードル高いので、
結局は、継承クラスをいくつか作ってみてテンプレート化を試すことになる
0506デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:20:32.60ID:iqYhGyd9
最適化オプションの違いで挙動が変わるようなコードはそもそもダメだって理解してくれよ
0507デフォルトの名無しさん
垢版 |
2021/10/06(水) 13:11:05.10ID:BBSbIN5v
インテルコンパイラはもう規格満たしてないだろってくらい滅茶苦茶に挙動を変える
gccなら、最適化で結果が変わるようなコードはダメコードと言って良いと思う
0508デフォルトの名無しさん
垢版 |
2021/10/08(金) 05:56:22.58ID:Xasiu/5n
>>496
遅レスすまそ
testなら部分特殊化できるのはわかるんだが
その場合クラス定義の全部を書き直すよな

template<class T1>
struct test<T1, void>
{
void fig1();
void fig2(); //特殊化したいのはここだけ
void fig3();
};

fig1とfig3を一次テンプレートと同じ内容で
書き直さにゃならんかね
0509デフォルトの名無しさん
垢版 |
2021/10/08(金) 23:05:08.47ID:xNy0cJty
関数テンプレート内でラムダ式使おうとしたらコンパイルできない

template<class T> void hoge(){
 auto func = [](){return 0;};
}

int main(){
 hoge<int>();
 return 0;
}


in instantiation of function template specialization 'hoge<int>' requested here
と出るが、何がだめなのかよくわからん
0510はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/08(金) 23:18:07.74ID:ZAq25yo3
>>509
そのメッセージは「関数テンプレートはここで特殊化 (テンプレート引数を当てはめて具体的な型に展開) されたやで」
というメッセージで、普通は他の警告やエラーの補足として出てくる。 なんか警告が一緒に出てない?

func が定義されとるけど使ってないという警告は出てくるけど無視して問題ない警告なのでコンパイルできないってことはない。
警告をエラー扱いにするオプションを付けてたりしない?
0512はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/08(金) 23:28:30.45ID:ZAq25yo3
>>511
C++20 では std::is_pod や POD の概念自体が非推奨になってるぞ。
次あたりでは廃止されるんとちゃうか。
0513デフォルトの名無しさん
垢版 |
2021/10/09(土) 21:11:49.30ID:PhB5rfBq
あるラムダ式が他のラムダ式をコピーするとき、参照キャプチャにするかコピーキャプチャにするか迷うんですが、皆さんはどういう基準で決められてますか
0515デフォルトの名無しさん
垢版 |
2021/10/09(土) 21:17:39.52ID:yAn344zh
>>513
コピーキャプチャはコピーなので、それ相応のリソースを食う。
基本は参照キャプチャにしている。
0516デフォルトの名無しさん
垢版 |
2021/10/10(日) 01:44:21.88ID:qGt3mQky
破壊的代入の余地が無いようする
つまりコピーを第一の選択肢として考えるする
0517デフォルトの名無しさん
垢版 |
2021/10/10(日) 01:50:32.12ID:qGt3mQky
*thisはさすがに参照にすることが多いが(だいたいコピコンがあるとも限らないし、
とはいえ参照コピーしてパラメータに対する破壊的代入を許すと思想的に重箱読みになって気持ち悪い気がするし、
参照渡ししたオブジェクトは一般にスレッドローカルとは言い切れなくなることから
スレッドセーフと断言しにくくなるというのは実害に数えて良いと思う
入れ子になったラムダ式の奥深くでそれをやられると、いつ排他制御すべきなのかが全くワケワカメになりかねない
0520デフォルトの名無しさん
垢版 |
2021/10/10(日) 09:28:13.64ID:lWUpu20f
意図しない破壊を防ぐにはキャプチャしなきゃいいだけ
それを参照のせいにするゴミはプログラマの資質がない
0521デフォルトの名無しさん
垢版 |
2021/10/10(日) 09:31:55.66ID:MbdCJRMe
とりあえずで[&]で書いてるな
丁寧にやりたければ変数ごとに考えて明示する
0523デフォルトの名無しさん
垢版 |
2021/10/10(日) 10:09:31.41ID:B/tc3JZb
スレッド立ち上げるとかファイル書くとかクソ重い操作が伴う時にコピーコスト気にしてもしょうがない
場合によるとしか
0524デフォルトの名無しさん
垢版 |
2021/10/10(日) 10:37:13.21ID:2ZvzU42q
どこでも使う汎用性高いものなら問題が起きる前に[=]にしてる
逆に[&]はよほど安全だと思わない限り使わない
0525デフォルトの名無しさん
垢版 |
2021/10/10(日) 10:45:00.67ID:qGt3mQky
>>522
スレッドセーフをどう保証するかに無頓着な香具師はマルチスレッドプログラミングに向かんわ

>>518>>519
低レベルなレスどうも
ラムダ式の成り立ちを知らなかったり
どのように使われるか想像できなかったり
使ったこと無いんじゃね;;;
0526デフォルトの名無しさん
垢版 |
2021/10/10(日) 10:59:19.31ID:lWUpu20f
>>525
スレッドがどうたらはおまえさんが勝手に言い出したことで元質問にはない
まさかとは思うがコピーしてりゃスレッドセーフなんて主張はしてないよな
0527デフォルトの名無しさん
垢版 |
2021/10/10(日) 11:13:11.28ID:qGt3mQky
ラムダ式は一般にラムダ式を定義したスコープの外に持ち出され、予見できないタイミングで使われうる
参照キャプチャだと
(1) ラムダ式が使われるタイミングで参照xの参照先が存在することが保証されていなければならない
(2) ラムダ式が使われるタイミングで参照xの参照先へのアクセスが他のスレッドと競合しないことが保証されていなければならない
とゆー2条件をクリアする必要がある。
コピーキャプチャだと(オブジェクトがディープコピーなら)どっちの配慮も不要
参照キャプチャして(1)、(2)を満たして安心できるのは、イミュータブルなオブジェクトだけ……!
0528デフォルトの名無しさん
垢版 |
2021/10/10(日) 11:14:48.07ID:qGt3mQky
>>526
ラムダ式、が含意する事柄について不十分な理解なレスktkr、
危険プログラマー認定のレベル3ぐらいやな;;;
0531デフォルトの名無しさん
垢版 |
2021/10/10(日) 11:28:30.83ID:qGt3mQky
>>529
定義するのと使う(評価する)のを同じスコープ内でやるならラムダ式使うまでもないじゃん?
ていうか使うまでもないんですよ
>>529はアレな人?
0532デフォルトの名無しさん
垢版 |
2021/10/10(日) 11:38:17.37ID:QniiN4Lz
スコープ内の変数をキャプチャする処理をスレッドで動かす場合は普通にラムダ式を使うと思うが。
0533デフォルトの名無しさん
垢版 |
2021/10/10(日) 11:39:34.18ID:B/tc3JZb
>>531
はぁ?お前これしないの?ラムダ式のユースケースって9割方この類だろ
std::functionに突っ込んではるか遠くにぶん投げたりコンテナに詰め込んだりするのだけがラムダ式の使い道だと思ってるの?
std::sort(v.begin(), v.end(), [](int a, int b){/*...*/});
0534デフォルトの名無しさん
垢版 |
2021/10/10(日) 11:57:37.17ID:tv4afNG+
みなさんスレッドセーフにしたいときはスレッドセーフになる様に書きましょう
0536デフォルトの名無しさん
垢版 |
2021/10/10(日) 12:21:43.80ID:Ld3aFVRt
任意のスレッド安全性を実現するのはゼロコストでは不可能だから
必ずシングルスレッドで実行される保障がある場合などはあえてスレッド安全性を捨てることもある
0537デフォルトの名無しさん
垢版 |
2021/10/10(日) 12:31:34.49ID:6/7jGiIK
std::conj() に double を渡したら std::complex<double> にキャストされるのが嫌なので、double を渡したら何もしないで double を返し、std::complex<double> を渡したら std::conj() と同じ動作をするオーバーロード関数 conj() を作ろうかと思うのですがアリですか?

なぜ std::conj() がそういう動作じゃないのか不思議で、何か見落としてたら教えてください
0538デフォルトの名無しさん
垢版 |
2021/10/10(日) 12:36:51.51ID:2ZvzU42q
こここ・・こういうこと?

(A)キャプチャが必要でスコープ内で実行までされるケース
(B)キャプチャが必要でスコープ外まで実行が遅延されるケース
(B-1)ラムダ式生成時と実行スレッドが同じケース
(B-2)ラムダ式生成時と実行スレッドが違うケース

(A)なら全員「[&]で問題があるケースはない」と考えている
(B-1)は好みが別れているところ
(B-2)は好みが別れているところで、さらにキャプチャされる変数側をスレッドセーフにするかどうも好み

[&]と[=]がよく分からない人はコチラ
https://ideone.com/OQS113

以下個人的意見
スレッドセーフにするコストは結構高い(開発・実行・保守全てで)ので、競合させずに遅延可能ならそれに越したことはないと考えている
ようはコピーするコストをそれほど高くは見積もっていない
0541デフォルトの名無しさん
垢版 |
2021/10/10(日) 16:49:17.57ID:2ZvzU42q
>>540
う〜ん、伝わらないですね・・・
共有リソースに競合するアクセスがなければ排他制御の必要がなく、スレッドセーフにする必要がないってことです
そもそもコピーして共有しないことで排他制御が必要なくなれば、スレッドセーフにしなくていいという考え方ですよ
0542デフォルトの名無しさん
垢版 |
2021/10/10(日) 16:51:53.70ID:lWUpu20f
だから共有=リスクなんだろ?
もうマシンも別の実機にすれば最強防御じゃん
0544デフォルトの名無しさん
垢版 |
2021/10/10(日) 17:32:07.51ID:qGt3mQky
>>533
頭の中がgdgdな人が話をgdgdにしようとしていまつね……
std::sort()の呼び出しと同じスコープが終わった後に
[](int a, int b)が呼び出されないということは、単にstd::sort()がreturnするまでにラムダ式を忘れてくれる作りだから(たまたま)担保されているだけであって、
[](int a, int b)のスコープが限定されるために担保されているわけではないし、
[](int a, int b)がラムダ式だから担保されているわけでもないの。

つまり、>>533
>ラムダ式をスコープ外に持ち出すなんてレアケース(>>529
の根拠に全くなっていないワケ
0545はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/10(日) 17:47:25.28ID:cCUvKLuJ
レアケースがどうこういったところでレアケースなら考えなくていいってわけでもない。
そんなの個別の事例ごとに考えるしかしょうがないだろう。
0547デフォルトの名無しさん
垢版 |
2021/10/10(日) 18:04:09.07ID:2ZvzU42q
>>546
無理筋ではありませんよ
スレッド以前から並列処理で共有される実行コンテキストを分けることは大昔からやられてきました
今更その手法自体を想像できない人に、こんなところで説明するのは困難なだけです
0548デフォルトの名無しさん
垢版 |
2021/10/10(日) 18:11:49.41ID:lWUpu20f
おまえさんの言う「大昔」がどのくらいか知らんが
俺が若手の頃はRENT,REUSなんてやってたよ
0549デフォルトの名無しさん
垢版 |
2021/10/10(日) 18:25:30.38ID:Euz3vWgQ
ラムダ式によって作られたオブジェクトがキャプチャされたオブジェクトより長生きする可能性があるならコピーキャプチャ
そうでなくともレジスタに乗ると思われるならコピーキャプチャ
そうでない場合に初めて参照キャプチャ

排他に関してはshared_ptr<mutex>とshared_ptr<なかみ>をメンバに持たせてコピー可能にしつつ、メンバ関数経由で排他制御するのが筋だと思う
RustのArc<Mutex<T>>パターンに影響されすぎかもしれないが……
いずれにせよキャプチャと排他制御の問題とは切り離して考えることができるし、そうすべき
0550デフォルトの名無しさん
垢版 |
2021/10/10(日) 21:19:12.50ID:MbdCJRMe
ラムダ式関連でいうと参照とかコピーをデフォルトだけで指定したときも実際に使ったものの分しかクロージャオブジェクトのサイズに乗ってこないと思ってるんだけどヤバい?
0551デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:42:34.57ID:9PtWfEC6
>>550
むしろ他に何が乗ると思っているのか?
気になるなら生成コード見て確認すればいいだろうとも思うし。
0552デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:58:18.57ID:2ZvzU42q
>>548
大昔とは1990年頃の話です
COBOLなのか知りませんが、reentrantとreusableは今回の話と直接関係ありません
0554デフォルトの名無しさん
垢版 |
2021/10/11(月) 05:43:06.87ID:FIUH1xZN
>>552
関係大ありだよ
あの当時はアセンブラでC++は使ってなかったというだけだ
わかってないのおまえさんだな
0556デフォルトの名無しさん
垢版 |
2021/10/11(月) 07:52:27.26ID:pMbZgi1h
>>555
おまえさんがどう思おうと勝手だが
センターオウンコーディングとかやってたよ
マウント取られる気が全くしねえぜ
0557デフォルトの名無しさん
垢版 |
2021/10/11(月) 08:08:27.81ID:M/9mFHzI
>>556
マウント取る取らないとかどうでもいいです
あなたが理解できないのをどうにもできないだけなんです
0560デフォルトの名無しさん
垢版 |
2021/10/11(月) 09:58:01.98ID:F+cmXQty
クラスの型を自動変換して関数に入れるにはどうすればいいですか?例えば、

class A {
public:
double hoge;
};
class B {
public:
int hogehoge;
};

int function(A aaa);

があった時に、functionにB型を入れても動くようにしたいです。
クラスAのソースに、Bから生成するコンストラクタ書ければいいのかもしれませんが、
実際はAはライブラリのクラスで触れなくて、Bが自作のクラスになります。
0564デフォルトの名無しさん
垢版 |
2021/10/11(月) 12:11:05.48ID:F+cmXQty
できました。ありがとうございます。

また、ポインタのvectorを実体として使うにはどうすればよいでしょうか?

std::vector<A*>
で定義されてるものを、
std::vector<A>として使いたいです。
別のvectorにポインタ値を詰め直せばいけると思うのですが、元のポインタの場所のまま実体で使いたいです。無理でしょうか。
0568デフォルトの名無しさん
垢版 |
2021/10/11(月) 17:28:01.69ID:0Mn4AOx6
>>564
ややこしい所有権・所有責任問題が発生するから、ソースコードを見直したほうがいい。
具体的にはstd::vector<*A>を
std::vector<std::shared_ptr<A>>
にして、shared_ptr<A>をやり取りするようにすべきだな。

性能問題とか互換問題とかでも無ければvector<*A>なんて使うもんじゃない。
0569デフォルトの名無しさん
垢版 |
2021/10/11(月) 20:43:04.76ID:bPHZE8G4
言ってることは同意だが、ポインタの型もまともに書けないような人に言われても説得力がない
0572デフォルトの名無しさん
垢版 |
2021/10/11(月) 23:13:38.91ID:9gfKW03X
ドラクエ3のバージョン違いの謎に迫る!
https://www.youtube.com/watch?v=sh5GXYs6T1c
2021/10/01に公開済み

FC版DQ3には、AバージョンとBバージョンが存在する
今回はROM内のプログラムを徹底比較!
どこが違うのか白黒ハッキリさせると息巻いた内藤プロ
当時自分が作ったのに全て忘れてて大変なことに・・
0573デフォルトの名無しさん
垢版 |
2021/10/12(火) 04:13:48.50ID:jMkI4z1q
ぶっちゃけ継承とかポリモフィズムはオワコンでテンプレート最強?
0574はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/12(火) 04:25:26.30ID:WB1ScBpO
>>573
過去の C++ の流行においては継承が強調されすぎたこともあって
継承の害悪な面も見えて大幅な揺り戻しは有った。

しかしそれぞれに役割があるのでどれかが廃れるとかいう話ではない。
バランスとしては継承が控えめになったけれど、だからといって継承のない C++ はありえない。
結局のところそれぞれを適切に使えというだけのこと。
0575デフォルトの名無しさん
垢版 |
2021/10/12(火) 06:45:14.85ID:LoAbYEbi
継承が有効に使われている事例をひとつも知らないヒヨっ子丸出しな質問だな
テンプレートの何がいいのかもわかってなさそう
0577デフォルトの名無しさん
垢版 |
2021/10/12(火) 07:24:36.11ID:+oJUuDWk
>>576
virtual使えないor使わない処理系で、使ってみたけど確かに頭にスッキリ入らんパターンだわw
あれはあれでポイントで使うと便利だし、反対にやっぱvirtualも便利でいいよねーとか。
0578デフォルトの名無しさん
垢版 |
2021/10/12(火) 08:16:42.08ID:4AIb2U7h
>>573
メソッド共通化を実現するための継承はオワコン。
プレースホルダーを用意するための継承は現役。

総称型が実装されれば継承自体をオワコンにできそうな気がするけど、総称型風スマートポインタて無かったっけ?
0584デフォルトの名無しさん
垢版 |
2021/10/13(水) 07:29:48.53ID:w2mbz/VV
○○なんていらねーよ害悪だけだ
まだ使ってるやつは全員バカ
これからは△△を使うべきだ
なーんて言っちゃってマウント取った気になってるおめでたいやつ
メガトン級にアホにされてることに気付かねえよな
0585デフォルトの名無しさん
垢版 |
2021/10/13(水) 09:41:39.46ID:V99uCirA
vector を shuffle する場合について質問です(gcc/windows10でテスト)

vector<int> vec(50, 0);
for(int i = 0; i < 10; ++i) vec[i] = 1;
random_device dev_seed;
mt19937_64 mt(dev_seed());
shuffle(vec.begin(), vec.end(), mt);

で確かに shuffle されているのですが疑問点がいくつかあります
1.dev_seed()が毎回同じ値を返してる?
(random_deviceの使い方を間違えてる?)
2.先頭の値が1に偏ってる?
(shuffle() を数回繰り返す解決方法もあるようですがあまり気持ち良くないです)
3.そもそもforで先頭の方に1を入れる発想が良くない?
(shuffleされてるならこれは関係無いと思いたい)
0586デフォルトの名無しさん
垢版 |
2021/10/13(水) 09:47:25.08ID:V99uCirA
ああこれか
https://cpprefjp.github.io/reference/random/random_device.html
>GCC (MinGW): GCC 9.1までは擬似乱数生成器 mt19937 を用いるため使用を推奨しない。詳細は備考欄を参照。GCC 9.2からは暗号論的な乱数である rand_s を使用する。
0590はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/13(水) 16:23:55.69ID:6cp7j/AO
>>589
前者は編集者による解説なども含んでいて仕様の意図や習慣がわかりやすい。 実装の現実みたいな補足もあるし。
後者は仕様書の再編を指向してるから正確だけど規則の羅列を読むのがしんどいこともある。

適宜使い分けて。
0594デフォルトの名無しさん
垢版 |
2021/10/14(木) 19:08:30.88ID:D5VUtH01
今までJavaでやってきたけどC++もやってみたいんだよね
すぐ出来るようになると思う?
0596デフォルトの名無しさん
垢版 |
2021/10/14(木) 19:12:47.65ID:pMO89bX6
>>594
c++でちょっとした文字列パースして内容に応じたオブジェクト構築する処理書いてたの、
ほぼ使ったことないJavaに移植したらスゲー早く出来てワロタ。C#もサクサクできたな〜
逆は色々イラッとするんじゃねぇかな?
0597デフォルトの名無しさん
垢版 |
2021/10/15(金) 01:29:52.42ID:oSpeFu2A
元々C++はその辺の文字列処理を毎回1からゴリゴリ書くような言語じゃなくて何らかのライブラリを利用するものだと思うけど、
クロスプラットフォームで各種文字コードが自由に扱えて、c++11以降の仕様に対応してて、かつかゆいところに手の届くライブラリって意外とないんだよね
いや、俺が知らないだけかもしらんけどw
0600デフォルトの名無しさん
垢版 |
2021/10/15(金) 10:21:28.25ID:Sjupi756
Javaから入ると不能(陰ポ)になる
もう手遅れ
0601デフォルトの名無しさん
垢版 |
2021/10/15(金) 10:22:26.59ID:Sjupi756
>>597
wxWidgets
0603デフォルトの名無しさん
垢版 |
2021/10/15(金) 11:49:16.16ID:Sjupi756
Debugだとバカデカくなるけど
Releaseは気にならないレベル
(DLL除く)
0604デフォルトの名無しさん
垢版 |
2021/10/15(金) 11:53:45.11ID:JZ8LRo6T
std::regexと等価なインターフェースを各々の正規表現ベンダーが用意してくれればいいんだが、それすら実現されていないお寒い状況
0605デフォルトの名無しさん
垢版 |
2021/10/15(金) 12:03:59.88ID:XHojpqKh
>>599
その辺も無いわけじゃないんだけど、クラスの構造どうしようかとか、メモリ管理どうするかとか、
変態trmplateでパズルしてみようかとか、選択肢多い分考えることも多い部分で時間かけることが
多い所はあるなーって。それがC++使いたい動機の裏返しでもあるんだけど。
あと本人の問題120%だが、ボケて油断してると、エラー直すのにやたら時間かかったりで。
Javaとか詳しく知らん状態だから言えるのかもしれんけど、もうこうするしかネェってレールが
最初からあるような印象でした。つかオラクルのライセンス問題のほうがムズいw
0607デフォルトの名無しさん
垢版 |
2021/10/15(金) 12:34:03.36ID:Ax3dDCZ3
std::regexみたいな文字コードというものがあることを知らない人間が作ってそうなものを標準だと思ってつかうのはやめたほうがいいと思います
0609デフォルトの名無しさん
垢版 |
2021/10/15(金) 13:14:36.67ID:x+xcCYcO
なんか最近曖昧な上に突っ込む点多すぎる内容的にはどうでもいい話題が多くない?
0610デフォルトの名無しさん
垢版 |
2021/10/15(金) 13:33:42.62ID:ma4A3Lrr
>>607
utf8限定ならそこそこ。
もうutf8がデファクトだから、内部処理はutf8に統一した方がいいよ。
0611ハノン ◆QZaw55cn4c
垢版 |
2021/10/15(金) 19:29:27.64ID:0K4QrynR
>>608
内部コードは utf-32 でやっているので、utf-32 縛りのほうがうれしいです‥
0612デフォルトの名無しさん
垢版 |
2021/10/15(金) 19:56:39.74ID:JZ8LRo6T
>>611
はぁ?
std:::basic_regex<char8_t>、std::basic_:regex<char16_t>, std:::basic_regex<char32_t> のどれでも好きなの使えばいいじゃん
0613デフォルトの名無しさん
垢版 |
2021/10/15(金) 20:01:47.12ID:JZ8LRo6T
ところで、char16_t、char32_tってエンディアンはシステム依存しばり?
0614デフォルトの名無しさん
垢版 |
2021/10/15(金) 20:03:20.51ID:eqKsqNtm
ちなみに、いま使えるみたいですよ。
むかしは使えることになってるのに実際は使えなかったんだけど。
自作イテレーターにも対応してるようです。
アップルは知らんけど。
Ubuntu+gcc、Windows10+clでは自作イテレータでstd::regex<>が使えました。
これは、HTML、XML、JSONのデータ構造からコンテンツ内のみを検索のような事に使えます。
標準から外れるような議論もあるそうですが、便利なので外れないように抗議していきましょう。
0615デフォルトの名無しさん
垢版 |
2021/10/15(金) 20:12:21.03ID:eqKsqNtm
C++20でchar8_tが入ると便利になりますよね。
0617デフォルトの名無しさん
垢版 |
2021/10/15(金) 20:35:46.40ID:eqKsqNtm
STLはセントルイスの略。
では、GCCは何処でしょう?
0619デフォルトの名無しさん
垢版 |
2021/10/15(金) 21:40:43.65ID:HBylJ5Wv
平面3リンクマニュピュレータの逆運動学のプログラミングが分かりません。
キーボードで手先の位置を入力すると、関節角が表示されるようにしたいです。
scanfを使うのと、アームの長さなどは適当に決めていいという条件です。

わかる方いたら、送って欲しいです。
0621デフォルトの名無しさん
垢版 |
2021/10/15(金) 22:41:19.44ID:HBylJ5Wv
大した大学ではないです。ロボット工学です。
0623デフォルトの名無しさん
垢版 |
2021/10/16(土) 11:55:15.40ID:NekA8urB
>>622
リンクの長さは良さそうな値を定義してください。関節の座標はこちらで決めずにあくまでも手先の位置・姿勢であるxed、yed、φedから計算で出します。解が複数出てくるので、全ての候補を求めてください。
例えば、リンクの長さは根元から順に0.3m、0.3m、0.05mなどで良いです。
プログラムとしては手先の目標値を入力して、θ1、θ2、θ3が出力されればOKです。
0624デフォルトの名無しさん
垢版 |
2021/10/16(土) 12:05:17.39ID:NekA8urB
>>622
目標値は、x=0 y=0.3m φ=90degがいいと思います。先ほどのリンクの長さの設定値で楽な姿勢でロボットの手が届く範囲ですので。
0625デフォルトの名無しさん
垢版 |
2021/10/16(土) 12:08:52.99ID:pBeCkfuy
>>623
手の姿勢まで指定してて >>619 と違う問題になってんじゃん。どんなテキストにも解法載ってる問題丸投げしてんだな。
0626デフォルトの名無しさん
垢版 |
2021/10/16(土) 12:14:57.04ID:NekA8urB
>>625
テキストに載ってないからここで質問してるんですよ。手の姿勢は例えばの話ですよ。どっちみちscanfで入力するんですから。
0628デフォルトの名無しさん
垢版 |
2021/10/16(土) 12:35:46.33ID:NekA8urB
>>627
日本語分かる?プログラムは載ってないから。教科書に載ってるから見ろって丸投げしてんのどっちだよ。
0632デフォルトの名無しさん
垢版 |
2021/10/16(土) 21:15:24.70ID:1x8IpOH2
> どっちみちscanfで入力するんですから。
このレガシーさには誰も何も思わんの?笑
0635デフォルトの名無しさん
垢版 |
2021/10/16(土) 21:53:50.46ID:EatL4YvD
わざわざC++なんか使っときながら勉強不足でモロアンチパターン踏んでるバカ
よくいるよね
0638デフォルトの名無しさん
垢版 |
2021/10/16(土) 23:16:29.16ID:gJanIysk
文字列の数値化はstrtol()、strtoul()、strtof()、strtod()をオーバーロードしたwrapper関数を呼ぶテンプレートにすれば
cinと同等の型安全性と同等以上の使い勝手が実現にできるし、
0639デフォルトの名無しさん
垢版 |
2021/10/16(土) 23:41:33.15ID:VgkITY1O
C++な人ってゴリゴリ自分でBNF的なparser combinator書くイメージだな
わざわざcstring使う人はいない気がする
0640デフォルトの名無しさん
垢版 |
2021/10/16(土) 23:45:41.19ID:gJanIysk
いろんな人の手を経たプロジェクトだと CString(Windows) と std::string
(ていうか正確にはstd::basic_string<TCHAR>)が混在しがちなのがほんのちょっと悩みどころ
0642デフォルトの名無しさん
垢版 |
2021/10/16(土) 23:53:12.21ID:gJanIysk
しらそん
いちいち
#ifdef __clusplus
# include <cstring>
# include <cmath>
#else
# include <string.h>
# include <math.h>
#endif
みたいな書き方するん会、
0643デフォルトの名無しさん
垢版 |
2021/10/16(土) 23:54:09.02ID:6ga3nra2
json文字列として入力データを受け取って既存のjsonライブラリでパースするのが無難じゃないですかね
0645デフォルトの名無しさん
垢版 |
2021/10/17(日) 09:40:16.91ID:Rn6uB4uI
壊れても居ないものを直そうとするヴァカに言われたくはないし、
行の長さが定まっていないみたいなアフォな外部データ設計でない限り
fgets()で軽くて十分
0647デフォルトの名無しさん
垢版 |
2021/10/17(日) 11:05:04.47ID:cds0CTiX
今ならメモリ不足とか気にする必要はほぼないから、
fgets()よりも、テキストファイル全体を一気に読み込んで1行分をstring_viewで返していく、みたいな流れの処理の方が効率は良いはずだよね
0649デフォルトの名無しさん
垢版 |
2021/10/17(日) 11:19:23.83ID:Rn6uB4uI
>>646
ちゃうちゃう、目新しいという以外にメリットも無いのに飛びつく誰かさんの方

>>647
行の長さが定まっていない仕様というのは大変恐ろしいことでありまして、
40TBの入力も許容するという意思表明なのであります
0651デフォルトの名無しさん
垢版 |
2021/10/17(日) 11:24:11.36ID:Rn6uB4uI
こと外部データに関しては、読み込み終えないとサイズがわからない、みたいな仕様は悪手
で、異常な入力に対してエラー出力するプログラムは正しいが
クラッシュするのはバグ
という観点からすると、動的メモリ確保による不定長読み込みができると言っても活かしようが無く、
結局fgets()でいいやん?となる
0653デフォルトの名無しさん
垢版 |
2021/10/17(日) 11:30:16.75ID:Rn6uB4uI
>>652
バッファリングを自力で実装するんか……
デバイスドライバ側である程度何とかしてくれるケースもあるかもしれんが
0655デフォルトの名無しさん
垢版 |
2021/10/17(日) 11:47:07.94ID:XrR+wpGu
真理情報:fgets()はUTF-16やUTF-32のテキストファイルを正しく読み込めない
0656デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:13:01.70ID:0m7FLjXf
ワイド文字用の関数は使っちゃだめということ?
まあ使い方よくわからんけど
0657デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:16:45.02ID:XrR+wpGu
HTMLなりXMLなりJSONなりそれぞれパーサーがすでにあるのだからその恩恵を享受するのがナウなヤングの取るべき道でしょ
0658デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:21:07.90ID:4Zt4uwKf
>>652
俺ならCreateFileMappingを使う

fgetsなんて頭の更新が止まった昭和時代の化石のうちでも地頭までひどいやつの使うものだな
0661デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:24:50.71ID:XrR+wpGu
Java、Python、Ruby、Javscriptなどの他言語にファイル読込み処理を移植する徒労を考えないバカが集うスレはここですね
0664デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:28:53.83ID:PatMwtBc
組み込みに近いところいると、大抵自炊に近い状態になるわ。
たとえばiostreamコンパイル通るやん、ってリンカがフラッシュ容量超えを宣告しやがる(フラッシュが640KiBもある豪華マイコンやで)。
上の方でrandom_deviceカスタマイズするの簡単にでけんやん、とか。ハード乱数なんて別にクラスに押し込んでも意味薄だけど。
0665デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:29:39.45ID:4Zt4uwKf
>>661
他言語に移植するかどうかはおまえさんが決めることじゃないよ
プログラム技術板で下品な言葉に頼るのは低脳の証明だぜ
0666デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:29:57.14ID:XyIQiUpb
C++の標準ライブラリを使用しない前提でファイル読み込みを考えるならOS固有の関数を呼ぶべきって言ってるだけだよ
C++の標準ライブラリを使用しないでCの標準ライブラリ呼ぶには何か正当な理由がいると思う
0667デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:35:21.04ID:QqhGhKAl
標準ライブラリのストリームは遅延評価やらなんやら余計な思惑が付いてるのでとにかく重い。
0670デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:37:50.89ID:QqhGhKAl
APIならサクサク快適。
1Gbps/s出る。
標準ライブラリは500Mbps/sくらいしかでない。
0674デフォルトの名無しさん
垢版 |
2021/10/17(日) 12:45:16.88ID:QqhGhKAl
>>673
俺は見たんだ。
0676デフォルトの名無しさん
垢版 |
2021/10/17(日) 13:26:14.73ID:GKP6XQtx
fgetsはバイトを扱うのか文字を扱うのか分かりにくいよね
Javaはバイトを読むInputStreamと文字を読むReaderに分かれてる
ファイルは当然文字だからInputStream、上位のReaderで文字コードや改行コードを加味する

Cはバイトも文字もchar[ ]で扱うからAPIもバイト扱い・文字扱いが混在してる
fgetsは改行コードで区切るからバイトではなく文字を扱う関数のように思えるけど、実際は文字コードなどは考慮されないのでバイト読み取り程度にしか使えないしワイドキャラクタも扱えない
中途半端だと思う
0677デフォルトの名無しさん
垢版 |
2021/10/17(日) 13:26:48.31ID:GKP6XQtx
ファイルは当然文字
0678デフォルトの名無しさん
垢版 |
2021/10/17(日) 13:27:18.36ID:GKP6XQtx
じゃなくて
ファイルは当然バイトね ごめん、、
0680デフォルトの名無しさん
垢版 |
2021/10/17(日) 13:48:20.62ID:cds0CTiX
まぁ、欧米の毛唐どもにもようやく必要性が理解できたchar8_tの導入が進めば文字コードはutf8に統一されていくとは思うけど、
utf8はutf8で冗長コードの問題があるからな…その辺のルールも統一しとかないとバグが量産されることになるな
0681デフォルトの名無しさん
垢版 |
2021/10/17(日) 13:54:50.76ID:XrR+wpGu
2021年になってもテキストファイル読み込みの話をしなければならないC++の哀しさ
0683デフォルトの名無しさん
垢版 |
2021/10/17(日) 14:06:15.29ID:XrR+wpGu
Windowsのcode pageのような列挙型と文字セット判定クラスがC++で標準化されてないとテキスト読み込み処理を標準化できないでしょ
文字セット判定クラスは既存の判定ライブラリも標準インターフェースを介して使えるように的な
0686デフォルトの名無しさん
垢版 |
2021/10/18(月) 07:17:36.06ID:SjUVJOBm
C++ではなくCを使うというならまだそいつなりに筋が通る可能性があるが
C++でfgetsにしがみつくのはC++のライブラリについてこれなかっただけの
無能の中の無能だ
0687デフォルトの名無しさん
垢版 |
2021/10/18(月) 07:27:56.24ID:guTQadjs
C++でファイル操作にcstdio(というかFILE*)を使うべきだと宣うなら
せめてその場合の例外安全性くらい論じてくれないと話にならな
0688デフォルトの名無しさん
垢版 |
2021/10/18(月) 07:44:19.97ID:G16mKgJ/
>>658
Create !
File !
Mapping !
なんでテキストファイルを読み込むだけのためにそんんあ牛刀(しかも移植性が乏しい)を使わねばならんのじゃ……
だいたい標準ストリーム(istream/ ostreamでも良いが)との結合はどうするんじゃ……
std::streambuf派生クラスとか自力で書くんか……

やっぱ頭にうんこ詰まってる人からはうんこしか出てきませんね……
0690デフォルトの名無しさん
垢版 |
2021/10/18(月) 07:52:03.70ID:SjUVJOBm
>>688
あーおまえさん、あのAPIをベアで使ってるのか
ご苦労なこったな
C++使ってんのにクラス化って発想ねえのか
0691デフォルトの名無しさん
垢版 |
2021/10/18(月) 07:56:09.77ID:G16mKgJ/
>>687
>例外安全性くらい論じてくれないと
cstdioの仕様は突っ込んで調べてはいないがファイルの読み書きに関して
例外をスローすることがあるとしたら改悪で大層な失敗ライブラリとしか言いようが無い

ていうか例外安全というのは眉唾な概念でありまして、
40TBまでメモリを食いつぶしたら例外をスローするが
39.9999TBまでメモリを食いつぶしても何も起きないというコードは
システム全体の動作を担保できておらず設計したとは言えない
もっと定量的にプロアクティブな処置を講じるべきで、システムの正常動作を例外に依存させる設計は無い
0692デフォルトの名無しさん
垢版 |
2021/10/18(月) 07:57:48.58ID:G16mKgJ/
>>690
ますますのうんこ発言ご苦労
で、標準ストリーム(istream/ ostreamでも良いが)との結合はどうするんじゃ……
0694デフォルトの名無しさん
垢版 |
2021/10/18(月) 08:13:52.41ID:G16mKgJ/
この議論の中で自作クラス推しはポエミーすぐる
やっぱうんこ製造機な人は仕方が無い
0696デフォルトの名無しさん
垢版 |
2021/10/18(月) 09:00:47.23ID:SjUVJOBm
C++でクラス作るなって
Cで関数作るなに匹敵するすげえ主張だな
最長不倒main関数とかw
0699デフォルトの名無しさん
垢版 |
2021/10/18(月) 11:20:29.21ID:PPwA/bGd
C++からCにソースコードを移植せざるを得ないことがあるから、Cプログラマでもクラスやテンプレートの知識は必須でしょ
0700デフォルトの名無しさん
垢版 |
2021/10/18(月) 11:27:00.40ID:CHllzYZP
cの場合ファイルでクラスを実現するわけだけど、その縛りがある方がきれいになるよね
0701デフォルトの名無しさん
垢版 |
2021/10/18(月) 11:35:56.70ID:cow76Y8p
twitterでCやC++を検索したい時、検索ボックスに
(C 言語) OR cplusplus OR cpp OR @i -@i lang:ja
と入れると割りといいことが分かった。
さらに、検索ボックスの右にある「…」のボタンを押して「検索を保存」しておくと、この検索文字列が勝手に消えない。
0705デフォルトの名無しさん
垢版 |
2021/10/18(月) 15:52:23.39ID:r9t2S6+p
>>703
fread速くて素敵
0710デフォルトの名無しさん
垢版 |
2021/10/18(月) 19:38:54.73ID:bmSCfWZq
>>708
環境によってはそういう実装もあるだろうけど、保証はされていないはず
実際MSVCのランタイムとかはダメでしょ
0712デフォルトの名無しさん
垢版 |
2021/10/18(月) 19:56:34.12ID:PPwA/bGd
>>710
「ダメでしょ」っていう無駄な煽り質問じゃなくて、fread()の制約について触れたブログのURLとか教えてもらえますか?
0715デフォルトの名無しさん
垢版 |
2021/10/18(月) 20:20:14.22ID:q3S383yy
>>699
>C++からCにソースコードを移植せざるを得ないことがあるから、

いまどきそんなのある?思いつかない。
0716デフォルトの名無しさん
垢版 |
2021/10/18(月) 20:40:37.41ID:guTQadjs
>>691
違うよファイル読み込み以外の場所での例外発生時にFILE*をリークさせないための設計の話だよ
君が何も考えてないのはよく分かった
0719デフォルトの名無しさん
垢版 |
2021/10/19(火) 00:01:14.73ID:L2ZQN19z
MSVCのランタイムでfread()が2GB越えファイルを扱えないって話のURLはどこですか?
0720デフォルトの名無しさん
垢版 |
2021/10/19(火) 00:34:16.59ID:FM0S3WDg
>>716
スコープを抜けたらファイルをクローズしてくれるから安全、と考える
藻前の考えが浅いのもまた明らかだ
システム的にファイルをぶち切られること自体が致命的だったら?
また、クローズがエラーになったとき何が起きるか
(ただクローズするだけのクラスならエラー通知先は無い。例外を飛ばしたら即パニック

というわけで実用的なリソースリーク対策はコードの追加を伴うから
fgets()にリーク対策するのと言うほど違いが無いワケ
0721デフォルトの名無しさん
垢版 |
2021/10/19(火) 00:41:16.25ID:FM0S3WDg
例外安全はやれるならやった方が良いのは認めるが
他人様が作ったライブラリの中に生ポをメンバにもつクラスがあったら穴ができる
まだこれぐらいなら静的解析で発見できるかもしれんが
上で述べたようなcloseのエラーチェックのスキップとか循環参照とかは機械的検出が難しい
例外安全に予期せぬ事象が起きたときのセーフティーネット以上のことを気体するのはソフトウェア工学的ではない

というわけでやっぱfgets()を使いつつ例外を起こさないように書くのに比べて言うほどマシでないワケ
0722デフォルトの名無しさん
垢版 |
2021/10/19(火) 02:03:24.24ID:2It6fcyB
君が例外安全というものについて何一つ知らない事はよく分かった
無知は罪じゃないから今から勉強し直そうね
知ってるふりしていい加減な付け焼き刃の知識を振りかざすのは恥ずかしいだけじゃなくてお客や同僚に迷惑を掛けるからね
0723デフォルトの名無しさん
垢版 |
2021/10/19(火) 02:48:34.85ID:gI621CUN
コードや証拠もなしに噛み合わない話の空中戦とかするくらいなら反論しなくていいから黙ってよう
どちらが正しいかはみんな分かっているのだから
0727デフォルトの名無しさん
垢版 |
2021/10/19(火) 07:46:29.59ID:FM0S3WDg
馬鹿は正当性を定義も証明もできない事柄に正当性を見出してしまう好例
例外安全に予期せぬ事象が起きたときのセーフティーネット以上のことを気体できないというのが真実
それが証拠にいい加減でない知識として>>721以外の何があるのか>>722は示せていない

起こることが既知なら対処を平にコードに書けば良いのに
コードに明示されておらず、検証もしきれない実行パスをボコボコ作っといて安全と言い張る神経、
0728デフォルトの名無しさん
垢版 |
2021/10/19(火) 07:57:14.86ID:FM0S3WDg
ていうか知能の問題かもしれん……

>どちらが正しいかはみんな分かっているのだから
衆愚の言い草
「何が」例外安全なのかきちんと定義してから出直してホスイ、
0732デフォルトの名無しさん
垢版 |
2021/10/19(火) 10:31:03.98ID:L2ZQN19z
バグ報告する場合は再現条件を提示する責任がある
再現できなければ「おま環」で放置される

もしかしてこのスレの住人は、立民とか共産党の支持者だったりするの?
挙証責任って概念を知らないかな
モリカケ・桜を見る会問題にのめりこむような人は技術系の職業に向いてないから転職したほうがいいね
0733デフォルトの名無しさん
垢版 |
2021/10/19(火) 10:37:08.97ID:JueBMEYA
最後の一文、それを断言できるのはその問題にのめりこんでる証拠のような・・・
0734デフォルトの名無しさん
垢版 |
2021/10/19(火) 10:38:50.31ID:L2ZQN19z
お前は泥棒をしたのだから泥棒したことをお前自身が証明しろ、と言いがかりをつけ続ける取調官とか怖いだろ
それと同じことを一部の本スレ住人や立民共産信者は言ってるわけだよ
0735デフォルトの名無しさん
垢版 |
2021/10/19(火) 10:46:13.46ID:ZI1Nh3C2
モリカケ・桜を見る会問題にのめりこんでいない人は
突然無関係のスレでモリカケ・桜を見る会問題の話題を出さないからね
常に意識している(のめりこんでいる)から技術系のスレで政治的な話をしてしまう
0736デフォルトの名無しさん
垢版 |
2021/10/19(火) 10:55:44.60ID:L2ZQN19z
陰謀論など思い込みの激しい人は正義感でやってるから周囲の忠告に耳を貸さない
信者同士が共鳴しあうエコーチェンバー効果
0737デフォルトの名無しさん
垢版 |
2021/10/19(火) 11:12:58.88ID:ZI1Nh3C2
「最近、この沼にはまって抜け出せなくなる人が多いんだよ、困ったものだね」と言いながら沼にはまっている人↑
0738デフォルトの名無しさん
垢版 |
2021/10/19(火) 11:22:09.22ID:L2ZQN19z
MSVCでfread()が2GB以上のファイルを扱えないことを証明してくれさえすればいいんだよ、簡単だろ?
0739デフォルトの名無しさん
垢版 |
2021/10/19(火) 11:31:07.37ID:L2ZQN19z
自分は雑なバグ報告しておいて、相手には執拗に問題解決を迫るキチガイとかイヤだろ?
0740デフォルトの名無しさん
垢版 |
2021/10/19(火) 11:40:48.93ID:gI621CUN
そもそもfreadと何をどんな環境で比較して結果どうだったなどの証拠がない件
0741デフォルトの名無しさん
垢版 |
2021/10/19(火) 12:09:53.53ID:ZI1Nh3C2
正直興味のない話なので関わらなきゃいいじゃんって言われるだろうけど
「相手には執拗に問題解決を迫るキチガイとかイヤだろ?」と行っている本人が「証明してくれさえすればいいんだ」と迫っているところを見る限り
やっぱり本人も沼に入っているのに気づいていないんだな、と感じる小雨が降る今日この頃
0742デフォルトの名無しさん
垢版 |
2021/10/19(火) 12:19:05.04ID:L2ZQN19z
いまさら何言ってんだ?
このスレは、ダニング=クルーガー効果でイキったバカをからかうためのスレだぞ
0744デフォルトの名無しさん
垢版 |
2021/10/19(火) 12:50:43.47ID:gI621CUN
スレタイトルのとおりC++に関する相談をするためのスレですよ
ID:L2ZQN19z7 は他人を煽るためだけに書き込んでるように見えるので少し風当たりが強くなってるだけです
0745デフォルトの名無しさん
垢版 |
2021/10/19(火) 13:20:26.19ID:L2ZQN19z
マイクロソフトのような大企業がfread()の致命的な不具合を永年にわたって野放しにするはずがないという常識や判断力すらない人は、いろんな陰謀論にハマるだろうね
ご本人はそれはそれで楽しい人生なんだろうけどIT技術者としてはどうかなって話
ま、反ワクチンの医者もごくまれにいるから、陰謀論にハマる人はどんな業界にもいるんだろう
0746デフォルトの名無しさん
垢版 |
2021/10/19(火) 13:25:05.49ID:L2ZQN19z
ビル・ゲイツがワクチンの「狂った陰謀論」を改めて否定 | Forbes JAPAN
https://forbesjapan.com/articles/detail/39513
2021/01/28 12:30

マイクロソフトの共同創業者でビリオネアのビル・ゲイツは、パンデミックを受けてSNS上で拡散した、彼に関する陰謀論の多さに「非常に驚いている」と述べ、ワクチンの普及の妨げになりかねない誤情報への懸念を示した。

ゲイツは1月27日のロイターの取材に、彼と米国のコロナ対策のトップであるアンソニー・ファウチ博士についての「狂った陰謀論」は、パンデミックに対する恐怖心とソーシャルメディアの台頭により引き起こされた可能性が高いと述べた。

パンデミックに関する最も目を引く陰謀論のいくつかは、ゲイツが「世界の人々にマイクロチップを埋め込むためにワクチンを活用しようとしている」という、根拠のない主張に基づいている。

ゲイツは、人々が本当にこれらの陰謀論を信じているのかどうかを知りたいと話した。「それは、人々の行動をどのように変えるのだろう? そして、我々はどのようにして、これを最小限に抑えるべきだったのだろう?」と、彼は問いかけた。
0750デフォルトの名無しさん
垢版 |
2021/10/19(火) 19:19:45.97ID:GtxXqLyf
2000年ごろのLinuxユーザーなら、ゲイツがワクチンにウィルス仕込んでると大騒ぎしてただろうけどな。
0751デフォルトの名無しさん
垢版 |
2021/10/19(火) 19:24:26.03ID:GtxXqLyf
>>732
ご指摘の動作は弊社ソフトウェア製品の問題点であることが確認されました。
引き続き調査を行います。
進展状況はID2273405でご確認できます。
今後も弊社製品ご愛顧のほどよろしくお願いします。
0752デフォルトの名無しさん
垢版 |
2021/10/19(火) 19:28:33.46ID:GtxXqLyf
>>732
「証拠はあんのか?おお〜ん?」と言ってる晋三が暴力団に見える。
証拠がなくたって傍目に明らか。
なんで5000円でスイートに泊まれるわけない。
嘘つかずにごめんなさいしたら良かっただけ。
0753デフォルトの名無しさん
垢版 |
2021/10/19(火) 19:52:06.47ID:L2ZQN19z
>>752
5Gにつながるためにもちゃんとワクチン2回打てよ
11月になったらワクチン接種会場がさらに減るぞ
0754デフォルトの名無しさん
垢版 |
2021/10/19(火) 19:56:28.13ID:GtxXqLyf
>>753
桜を見る会に桜井誠は呼ばれたのか?
0756デフォルトの名無しさん
垢版 |
2021/10/19(火) 20:09:58.44ID:L2ZQN19z
違います
今後の心配は園遊会やお正月などのお食事会にモェ呼ばれるのか、という点です
0757デフォルトの名無しさん
垢版 |
2021/10/20(水) 07:14:37.76ID:0k8Pnquo
>>729
RAIIだから例外安全、と言うのは短絡的
文盲に読み飛ばされたのかしらんが>>720>>721において
@ オブジェクトが個々に盲目的にリソースを解放するのが常に安全と言えるか?
A リソース解放時にエラーが生じたものを無視しておいて安全と言えるか?(あるいはコードの追加無しに無視せずに済む方法があるか?)
0758デフォルトの名無しさん
垢版 |
2021/10/20(水) 07:16:51.24ID:0k8Pnquo
B リソース解放を解放しない瑕疵があるオブジェクトの混入が無いことをどうやって保証するのか?
という3つの問題提起をしているのに対して、あいまいに取り繕って逃げたのが>>722

@〜Bに定説が無いとすれば(実際無いのだが)、例外安全というのは信奉する馬鹿の数だけ定義があるという話
0759デフォルトの名無しさん
垢版 |
2021/10/20(水) 07:19:57.61ID:NMVwWGr0
盲目じゃねえし
uncaught_excptionsも知らんようだな
って言うとにわかで調べてシッタカこくんだろうけど
今の今までおくびにも出さなかったことで
どの程度の野郎かは察しがついてる
0760デフォルトの名無しさん
垢版 |
2021/10/20(水) 07:21:14.97ID:0k8Pnquo
だいたい火災で炎上するビルの8階から人が飛び降りたとして、
例外安全とやらでできることはせいぜい人を地面に軟着陸させて生命を守るぐらいの話で、
ビルの火災を消化はしないし(それをやるのは消防署
消化後のビルを復旧はしないし(それをやるのは各種の工事屋
復旧した8界のオフィスに飛び降りた人を戻して業務を再開させることもしない(それをやるのやEmployer

普通の人はまず火災を防ぐことを第一に目指すのだが、
例外安全主義者はそんなスタイルを古いと言い、例外安全に作っとけば安全と言い張るのだ
0763デフォルトの名無しさん
垢版 |
2021/10/20(水) 07:35:17.39ID:0k8Pnquo
でfgets()に戻るが、以下のコードの例外の捕捉のコストは話の本筋ではないので無視していただきたいのだが
(そのコストが気になるなら「スコープを抜けたら閉じるFILE*」みたいなブツを作ったらfclose()のエラー処理以外は同じにできる)、
void foo() {
 FILE* fp = fopen(...); // fpがNULLだった場合のチェックは記載省略
 try {
  Bar x, y, z;
  (fgets()とかのコード)
 } catch (Exception ex)
  fclose(fp)
}
}
とかなコードを見たら普通の人は「chatchに飛んできて大丈夫なんか?」とtryブロック内をチェックするが
(x, y, zの解放が保証される、とかは関係無しに
例外安全主義者にかかってはそんなことはお構いなしである。とにかく安全と言い張る
0764デフォルトの名無しさん
垢版 |
2021/10/20(水) 07:39:44.59ID:kO478Zp/
バカの主張: バグがあるかも知れないから例外安全は「使い物にならない」

アホすぎだろ…
0765デフォルトの名無しさん
垢版 |
2021/10/20(水) 07:44:50.14ID:0k8Pnquo
>>764
>例外安全はやれるならやった方が良いのは認める(>>721
>例外安全に予期せぬ事象が起きたときのセーフティーネット以上のことを気体できい(>>727
というわけで文盲に言われたくは無い

特定のケースにおいて、例外でエラー処理を安全に書けてその後のリカバリーもスムーズにいきますよ、
みたいな特定方面で有効なソリューションとして例外安全を勧めるのであれば問題無いのだが、
テキストファイルをfgets()で読むという絶対的に正しい事柄への批判に無理矢理つなげようとするから
話がおかしくなる
0766デフォルトの名無しさん
垢版 |
2021/10/20(水) 07:45:51.66ID:GCto648C
>>763
x,y,zのデストラクタならcatchに飛んだ時に呼ばれることは保証されてるけど…?
例えばyのコンストラクタで例外飛んでもxは~Bar()呼んでzは呼ばないくらいコンパイラがやってくれるけど…?
そういうの忘れずやってくれるのがコンパイラだから任せようぜっていうのがRAIIなんだけど…?

まさかこんな事も知らずに例外安全がどうのと偉そうに論じてたの?嘘だろ?
0768デフォルトの名無しさん
垢版 |
2021/10/20(水) 07:47:29.23ID:0k8Pnquo
>>766
ま た 文 盲 か
>(x, y, zの解放が保証される、
と書いてあるわけだが?
しかしだからといっても普通の人はtryブロック内をチェックするだろ、という主張
0771デフォルトの名無しさん
垢版 |
2021/10/20(水) 08:13:47.58ID:kO478Zp/
> 例外安全主義者にかかってはそんなことはお構いなしである。とにかく安全と言い張る
どこの主張を言ってるのか知らんけどどう見てもお前の方が「文盲」なわけだがw
0772デフォルトの名無しさん
垢版 |
2021/10/20(水) 08:27:40.98ID:DhnN+uGO
>>763
RAII を使わず明示的な catch でリソース解放しているコードを見て、一般的な C++ プログラマは「危険」だと見るのでは?
その例だと「fgets()とかのコード」内の return などで fp がリークする可能性があるわけで。
0774デフォルトの名無しさん
垢版 |
2021/10/20(水) 09:12:35.95ID:OEiI06HQ
Kuso.KENTA.
0777デフォルトの名無しさん
垢版 |
2021/10/20(水) 09:35:49.31ID:OEiI06HQ
>>743
観ようとしなければ何も観えない
そんな簡単なことにも気付けない
0778デフォルトの名無しさん
垢版 |
2021/10/20(水) 09:39:48.17ID:OEiI06HQ
>>757
2GB以上じゃなくて良いけど
そこそこの大きさのファイルで
書き込んでcloseしてる途中に
電源OFFとかになったら例外どころじゃないんだが
最近のOSはちゃんとコンデンサ放電仕切るまでの間に書き込み終了するんだろうか
0779デフォルトの名無しさん
垢版 |
2021/10/20(水) 09:44:46.84ID:OEiI06HQ
>>760
サンフランシスコ地震で高速道路崩落←直後に「日本では起こり得ない」と言われた
インドネシアの津波で街が吹っ飛ぶ←直後に「日本では起こり得ない」と言われた
チェルノブイリで原発爆発←直後に「日本では起こり得ない」と言われた
武漢でコロナ感染者急増でパニック&パンデミック←直後に「日本では起こり得ない」と言われた
いつも否定したがる人はいるしそれを信じたがるひともいる
0781デフォルトの名無しさん
垢版 |
2021/10/20(水) 11:15:17.23ID:glY3n63N
ファイル編集中、Ctrl+Sを押下して保存しようとした瞬間に停電になったことがある
再起動後、ファイルは存在しているのに中身は\0で埋められていたよ
0782デフォルトの名無しさん
垢版 |
2021/10/20(水) 11:16:33.48ID:PaxGKk4c
>>778
・UPSぐらい付けろよ
・障害が心配なら多重化しとけ
って話で例外安全とはレイヤーの違う話
0783デフォルトの名無しさん
垢版 |
2021/10/20(水) 11:28:28.97ID:EqJEar1P
>>770
古典だけどExceptionalC++あたりから読み始めるのがいいよ
準拠規格が古いから所々アレだけど大きな考え方を学ぶには十分だろう
感想聞かせてね
0788デフォルトの名無しさん
垢版 |
2021/10/20(水) 13:11:06.68ID:NMVwWGr0
いーやfreadで2G超のファイルはvsでも完全にあつかえる不都合はない
と、自信を持って断言できないゴミが
URL乞食でドヤってるのバカすぎ
0790デフォルトの名無しさん
垢版 |
2021/10/20(水) 13:30:01.90ID:OEiI06HQ
fseek()/ftell()が32bit用でfseeki64()/ftelli64()の方を使ってないというオチか
0791デフォルトの名無しさん
垢版 |
2021/10/20(水) 13:36:27.87ID:glY3n63N
自信をもって断言したところで、モリカケ・桜を見る会と同じことになるだけだよ
アベノセイダーズは不具合を見つけてくるまで決して許さない
0792デフォルトの名無しさん
垢版 |
2021/10/20(水) 13:39:14.76ID:glY3n63N
>>789
コストラクタでラムダ式をメンバ変数に受け取りデストラクタでそのラムダ式のメンバ変数を実行するクラステンプレートを自作すれば問題解決
0795デフォルトの名無しさん
垢版 |
2021/10/20(水) 13:50:04.27ID:NMVwWGr0
不都合があるという主張であろうと
不都合がないという主張であろうと
自分でコード書けないゴミは引っ込んでろ
0798デフォルトの名無しさん
垢版 |
2021/10/20(水) 14:38:01.57ID:NMVwWGr0
>>796
おいURL乞食、おまえに言ってんだよ、おまえに
俺はftellで例示するコード出してんだよ
同類呼ばわりすんな穢らわしい
0799デフォルトの名無しさん
垢版 |
2021/10/20(水) 14:47:18.86ID:BFKUlxpT
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdio>
#include <algorithm>
int main()
{
const char path[] = { "hoge.dat" };
std::vector<char> buffer(1024 * 1024); // 1MB
std::ofstream f(path, std::ios::binary);
for (int gb = 0; gb < 5; ++gb) {
std::fill(buffer.begin(), buffer.end(), static_cast<char>(gb));
for (int i = 0; i < 1024; ++i) f.write(buffer.data(), buffer.size());
}
f.close();
#pragma warning(suppress : 4996)
std::FILE* fp = std::fopen(path, "rb");
for (int i = 0; i < 5 * 1024; ++i) {
if (std::fread(buffer.data(), sizeof(buffer[0]), buffer.size(), fp) < buffer.size()) return 1;
for (auto ch : buffer) if (ch != static_cast<char>(i / 1024)) return 2;
}
std::fclose(fp);
std::cout << static_cast<int>(buffer[buffer.size() - 1]) << std::endl;
return 0;
}
とりあえずVC++2019でx86(32bit)ビルドして実行したら終了コード0の出力4だったのでfread 4GBは超えられてる模様
0800デフォルトの名無しさん
垢版 |
2021/10/20(水) 15:12:34.13ID:glY3n63N
>>799
それは、おま環にすぎないので不具合がないことの証明にはならない
不具合を見つけるのがお前の責務だ
赤木さんのように自○したくなるまで頑張って探せ
0803デフォルトの名無しさん
垢版 |
2021/10/20(水) 15:34:29.03ID:glY3n63N
お前らの家の冷蔵庫にエルビス・プレスリーがいないからといって、この世にエルビス・プレスリーがいないことの証明にはならないんだよ
血を吐くまで探せ
0805デフォルトの名無しさん
垢版 |
2021/10/20(水) 16:02:32.88ID:glY3n63N
あぁ?わかって言ってんのか?
泥棒の証拠を泥棒に探させるのがアベガー品質だぞ
0806デフォルトの名無しさん
垢版 |
2021/10/20(水) 16:09:49.79ID:Px+syONf
元々>>637がC++でもfgetsを使う俺は天才などとのたもうて
>>687がFILE*を使うなら例外安全をどう保証するのという話だったのが、
当の>>637>>691でfread/fgets自体が例外を投げる可能性(?)という謎の問題を考え始め
>>710が根拠不明の2GB制限の話を持ち出し

問題があると考えるひとは存在しない2個の問題を同時に考えて混乱し
まあまあ分かってる人はRAIIすればいいじゃん(ってかfstreamでいいじゃん)で話が終わっている

まとめるとこんなところか?
0807デフォルトの名無しさん
垢版 |
2021/10/20(水) 16:17:28.71ID:glY3n63N
挙証責任をガン無視できる文部科学省元事務次官前川喜平こそ最強
座右の銘は面従腹背、ライフワークは貧困調査
0809デフォルトの名無しさん
垢版 |
2021/10/21(木) 00:40:30.45ID:ObBh/rk9
>>806
俺はcの標準ライブラリ使うならosの関数使えって言ってた人でアンカの中には登場しない人だけど
「根拠不明の2GB制限」についてはlarge file問題というのが昔あった
https://en.wikipedia.org/wiki/Large-file_support
LinuxなどUnix系が64bit環境にほぼ移行した現在その問題はレアケースだとは思うけど
32bitアプリが割と残っているWindowsだと実際のところどうなのか分からない
でもfreadくらいは出来そうだと考えわざわざコード書いただけ(>>799)
ちなみにLinuxでもdebian系のantiX 19.4 32bit環境では#define _FILE_OFFSET_BITS 64がないとfopenがNULLを返していた
0810デフォルトの名無しさん
垢版 |
2021/10/21(木) 00:51:53.61ID:l0SlZ35R
話の肝は「私が間違ってました。ごめんなさい」と素直に言えるかどうかなわけで
小室文書みたいな屁理屈の羅列はいらねンだわ
0811デフォルトの名無しさん
垢版 |
2021/10/21(木) 01:06:38.58ID:5bux1k1I
>>807
NHK は メード イン ジャパン とか オーダー メード とか表記するのに
メイド 喫茶は なぜ メイド 表記なのですか?
0812デフォルトの名無しさん
垢版 |
2021/10/21(木) 01:19:29.04ID:ObBh/rk9
ちなみに>>809の「cの標準ライブラリ使うならosの関数」という意味で以前実験した結果も貼っとく
read, fread, std::ifstream::readの比較
https://ideone.com/H2jc7B
systemdのユーザーごとのRAMディスクを使っているのでそれがある環境でだけ動作する
ubuntu 20.04 64bit環境で実行した結果だと↓
$ g++ -O2 test.cpp -o test
$ ./test
227
267
225
$
0815デフォルトの名無しさん
垢版 |
2021/10/21(木) 11:19:37.65ID:l0SlZ35R
ババ抜きはOld maidの日本語訳だよ
セクシズムやエイジズムはポリコレの立場から見てどうだろうね
0818デフォルトの名無しさん
垢版 |
2021/10/21(木) 17:33:55.95ID:MfhbDLcG
>>812
その比較でなんで fread だけ遅いんだ?と思ってコード見たら fread じゃなくて fgets になってた。
あと read_cpp_standard() の if (std::cin.fail()) もたぶん f.fail() の間違い。
0819デフォルトの名無しさん
垢版 |
2021/10/21(木) 18:24:19.20ID:/1ln80gU
>>815
フェミが言葉狩りのネタにしないのは何故
0821デフォルトの名無しさん
垢版 |
2021/10/21(木) 18:56:39.47ID:ObBh/rk9
>>818
thx
>>812のコードは脳内破棄してくれ
指摘された部分を修正した
https://ideone.com/DoI3ww

同環境での測定結果が↓
214
213
214

freadだとバッファリングされるからその分遅いのかと勝手に思ってたらそんなところから間違ってたとはすまんw
0822デフォルトの名無しさん
垢版 |
2021/10/22(金) 00:41:05.61ID:bIdSm1HR
BB抜きが有ってGG抜きが無いのは差別
0823デフォルトの名無しさん
垢版 |
2021/10/22(金) 00:43:55.21ID:bIdSm1HR
>>821
fread最強でFA
0825デフォルトの名無しさん
垢版 |
2021/10/22(金) 02:55:23.69ID:ugOmuUc2
>>822
ジジ抜きもあるよ。
ジジ抜きはジョーカーを使わない。
適当な札を一枚抜いておいて組にならない札を最後まで持ってた奴が負け。
どれが負け札なのか最後までわからないというのがゲームの面白い部分。

ちなみに日本語でジジ抜きと呼ばれているゲームこそが Old maid (行き遅れ、お局様) の本来のルールで、
ペア (結婚相手) がないことを Old maid に喩えた命名になっている。
0826デフォルトの名無しさん
垢版 |
2021/10/22(金) 05:43:15.83ID:I4IH0MDY
C++20ちょっと書き始めたらvscodeのインテリセンスが何でもないところにエラーの波線出しまくってくる
0829デフォルトの名無しさん
垢版 |
2021/10/22(金) 13:37:10.17ID:I4IH0MDY
>>828
OS: Windows 8.1 (64 bit)
コンパイラ: MinGW GCC 11.1.0

文句を言ってくる拡張機能は多分普通の"Microsoft C/C++ 拡張機能"でコードの例としては
https://wandbox.org/permlink/Fcqjvfqt8rWVqren
こんな感じ

エラーは
operator<=>: 戻り値の型だけで識別される関数はオーバーロードできません
requires(1個目): こちらでは requires 句は許可されていません (テンプレート関数ではありません)
vec: エイリアス テンプレート "vec" の引数リストがありません
v: ';' が必要です
という感じ

まあエイリアスのやつはC++17でも言えるけど
0830デフォルトの名無しさん
垢版 |
2021/10/22(金) 23:23:13.68ID:Q/4+pM2R
Pythonのリストのように不定型の配列を作るにはどうすればいいですか?

vector<int> a;
vector<double> b;
vector<vector<any>> hoge;
hoge.emplace_back(a);
hoge.emplace_back(b);

みたいなことをしたいですが、エラーになりました。
最終目的は、
void f(vector<vector<any>>, vector<vector<any>>)
のような不定型配列を複数引数に取る関数を作りたいです。
0832デフォルトの名無しさん
垢版 |
2021/10/23(土) 01:05:44.90ID:UQ/XjfNb
>>830
出来るといえば出来るんだが、動的型っぽいことを C++ でやろうとすると煩雑だよ。
std::any は何でも格納できるが使うときには結局は元の型として取りださないといけない。
格納することが出来たとして、その後にどういう風に使うのかによってデザインの仕方がかわってくる。
0834ハノン ◆QZaw55cn4c
垢版 |
2021/10/23(土) 01:34:50.09ID:0KDU0Kot
>>832
うん、実用に供するまでには結構大変そう、使い道がわからん…
0835はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/23(土) 01:57:47.58ID:UQ/XjfNb
>>834
クラスの設計段階で抽象クラスとの継承関係を作っておくだとかいった方法で多相にするのが
旧来からの方法で、それができるならそのほうがまともなものになると思うんだが、
そうは言ってもユーザーからは弄れない既存のクラスをどうしても使いたいということも無くはない。

根本的な部分をいじれないときに場当たり的にどうにかするよりは std::any や std::variant を使ったら
少しはマシかもねという程度の話で、あまり積極的に使うようなものではないというのが私の感触だな。
0837デフォルトの名無しさん
垢版 |
2021/10/23(土) 10:04:52.59ID:rMqegMI3
>>832
その後の使い方は、基本的には
全要素をany_castでstringにして使うつもりです。
不定型可変長のデータを受け取ってcsvファイル出力に使いたい感じです。
0840デフォルトの名無しさん
垢版 |
2021/10/23(土) 11:40:12.00ID:KcnUiVki
>>835
>>833じゃないけど>>833のdump()を例えば
template<class... Args>
void dump(const std::variant<Args...>& e) {
std::visit([](const auto& x){
std::cout << " " << x << std::endl;
}, e);
}
template<class V>
void dump(const std::vector<V>& v) {
for (const auto& e: v) {
dump(e);
}
}
みたいにするんなら
class Dumpable {
virtual void dump() = 0;
};
みたいな抽象クラス作って素直にArgsの各classが継承(実装)した方がいいと思うってこと?
0841はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/23(土) 13:07:50.50ID:UQ/XjfNb
>>840
そう。 クラスごとに違う挙動が必要ならその違いはクラスの中に隠蔽されているべきで、
クラスを使う側で分岐するのはなんかちょっとあれだなという感じ。

型を調べて分岐するようなコードが嫌だから動的な型を調べる機能を意図的に入れなかった話は D&E にも書かれてる。
(最終的には typeid が導入されてしまったけど……)
ただそれは「型を追加したくなったら分岐も増やすのはめんどいしミスしそう」みたいな話なので、
十分に賢いユーティリティが標準で用意されている今ならそれほど強い動機でもないんだけどね。
0842デフォルトの名無しさん
垢版 |
2021/10/23(土) 13:12:23.67ID:quaWTEll
C++はパラメトリック多相が無いからこういうのは面倒だよね。
とりあえずはstd::vector<std::function<std::string()>>に[v](){ return std::to_string(v); };
あたりを入れとくのが簡単かね。

conceptを「その制約を持つクラスの総称クラス」としてshared_ptrあたりで指定できるようになると便利なんだけどなぁ。
concept_shared_ptrとか用意してくれんかね。
0843はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/23(土) 13:16:46.64ID:UQ/XjfNb
>>837
any_cast での取り出しは「元の型」でなければならず、
string に変換可能な型であっても any_cast<string> は出来ない。
(やったら例外が飛ぶ)

最終的に文字列になると決めているなら文字列にしてから格納したほうがすっきりするんじゃないの。
0845デフォルトの名無しさん
垢版 |
2021/10/24(日) 08:17:03.78ID:mo2+vXTQ
>>771-772
以下のような場合についてBarクラスがRAIIであるというだけでどう例外安全にできるのかお考えをお聞かせ願えますか
void foo() {
 {  // 何かのコードブロック (try { } catch { } のtry{ } とかでも良い
   Bar x, y, z;
    (例外を生じる可能性があるコード)
   アプリケーション固有の別スレッドXにイベントなりシグナルを送る
 }
}

>>723
上に書いたようなケースを踏まえてっ例外安全に言及している>>720>>721に対して
理解しいないまま捨て台詞を残して逃走した>>722とか、
0846デフォルトの名無しさん
垢版 |
2021/10/24(日) 08:20:03.55ID:mo2+vXTQ
>>772
コードブロック内のreturnがあるかもしれないんならチェックすれば良いやん?
>>763は普通の人ならチェックするでしょ、という主張

ところが>>722のような例外安全主義者ときては、RAII = 例外安全、で脳がショートしているのや
多分周りも能力に忖度して大した課題を与えていないんだと思う
0847デフォルトの名無しさん
垢版 |
2021/10/24(日) 08:40:20.31ID:i4dOTOfz
上では例外安全にするとかしないとか言っていたような気がしたが少し主張が変わったのかな。

- 例外安全を求めるのは当然
- RAIIを使えば比較的例外安全を保証しやすい
- だからといってRAIIを使えば自動的に例外安全になるわけではない

結論としてはこんな感じだと思うが。
0849デフォルトの名無しさん
垢版 |
2021/10/24(日) 09:13:23.68ID:1SVJ9Wvp
そりゃ例外安全もRAIIも魔法じゃないんだから使えば即安全になるというわけじゃないわな
「ちゃんと使えば」をすっ飛ばして>>845みたいなことを言い出すのも一種の思考停止だろうと思うわ
0850デフォルトの名無しさん
垢版 |
2021/10/24(日) 09:51:02.52ID:v4numFpL
>>845
Barのデストラクタの責務は自分が確保したリソースをリークしないことだけだ
オブジェクトの外側でやってるスレッド間通信のことなんかBarは知らんし別に手当するだけの話

逆に聞くがRAIIを嫌がってBar* x = new Bar;とかにしたらなんか事態改善すんの?スレッド間通信を簡潔に書くための役に立つの?
0851デフォルトの名無しさん
垢版 |
2021/10/24(日) 10:24:44.80ID:P2kmr3bK
そもそもRAIIが例外安全のためっていうイメージ全くないんだけど
リソースのお片付け(≒メモリリーク防止)が主目的ちゃうん?
0852デフォルトの名無しさん
垢版 |
2021/10/24(日) 10:36:38.75ID:i4dOTOfz
例外が発生するとリソースを片付け損ねる場合があるってのが例外安全を欠く一番よくあるケースだと思うけど。
主目的がどうとかは別として。
0853デフォルトの名無しさん
垢版 |
2021/10/24(日) 10:45:51.44ID:NLtlOSxj
>>845
例外を生じた場合でもXとなんらかの通信を行うべきなら
thread_connectionみたいなクラスを作ってデストラクタに整合性を保つためコードを書くのがいいかな
「アプリケーション固有の〜を送る」の部分にはそのオブジェクトのメソッド呼び出しにしておく
例外発生時にはデストラクタによってXスレッドに異常を通知してXスレッドが持つ状態の整合性を確保してもらう

Xに通知するのが単なる終了通知なら(成否を区別して処理しなくていいなら)全部デストラクタでいいかもね
0855デフォルトの名無しさん
垢版 |
2021/10/24(日) 11:38:44.49ID:IQSwOnqn
例外でデストラクタ呼ばないケースなんてあるんですか?
プログラム自体が止まるのは別として
0857デフォルトの名無しさん
垢版 |
2021/10/24(日) 14:38:53.43ID:KyFc3YJo
これg++ 9.3だとstd::endlがなぜかconst variant<>と思われてエラーになってるみたいなんだけど、なぜ?

#include <variant>
#include <iostream>
using namespace std;
template<class C, class... Args>
C& operator<<(C& out, const variant<Args...>& v) {
visit([&](auto& x){out << x;}, v);
return out;
}
int main() {
cout << endl;
return 0;
}

https://godbolt.org/z/dbodW3xfG
0859はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/24(日) 18:37:46.86ID:SzIAMYLD
>>857
std::endl は関数テンプレートなので型と比較しようとするとインスタンス化に失敗するというエラーだと思う。
(std::endl を普通に使うときは左辺の型を利用して推論される。)
型を明示して渡せば variant との比較に失敗して通常の改行として解釈してくれる。

#include <variant>
#include <iostream>
using namespace std;
template<class C, class... Args>
C& operator<<(C& out, const variant<Args...>& v) {
visit([&](auto& x){out << x;}, v);
return out;
}
int main() {
cout << static_cast<std::ostream&(*)(std::ostream&)>(std::endl);
return 0;
}
0860デフォルトの名無しさん
垢版 |
2021/10/24(日) 19:35:48.44ID:KyFc3YJo
>>859
う〜ん、よく分かりませんね。確かに勝手にendlは[with _CharT = char; _Traits = std::char_traits<char>]なbasic_ostreamを
引数にとって返すと想定しちゃってましたが、その時点でインスタンス化しようとしてエラー出す理由が分からない・・・

例えばテンプレート引数を直指定しても

#include <variant>
#include <iostream>
using namespace std;
template<class C, class... Args>
C& operator<<(C& out, const variant<Args...>& v) {
visit([&](auto& x){out << x;}, v);
return out;
}
int main() {
cout << endl<char>; // ここが違う
return 0;
}

同様にエラーのままでした。castしたときだけなぜ判定失敗してくれるのかもう少し考えてみます。
ありがとうございました。
0861はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/25(月) 00:43:36.43ID:dRHq7DJG
>>860
左辺が曖昧だからかもしれない。
左辺の型を std::ostream で固定すれば通る。

#include <variant>
#include <iostream>
using namespace std;
template<class C, class... Args>
std::ostream& operator<<(std::ostream& out, const variant<Args...>& v) {
visit([&](auto& x){out << x;}, v);
return out;
}
int main() {
cout << endl<char>;
return 0;
}

でもこのとき型変数 C は不要だなと思って class C を削るとエラーになるんだよな。
なんだかよくわかんないね。
0862デフォルトの名無しさん
垢版 |
2021/10/25(月) 02:18:03.94ID:LmZJdmU+
>>861
度々ありがとうございます。再現確認したところ、確かに余計なテンプレート引数が1つあるだけでこのエラーが出ないみたいですね。
試しに元のコード(>>857)に余計なパラメータを1つ入れるだけでも通りました。

#include <variant>
#include <iostream>
using namespace std;
template<class T, class C, class... Args> // ダミーパラメータT追加
C& operator<<(C& out, const variant<Args...>& v) {
visit([&](auto& x){out << x;}, v);
return out;
}
int main() {
cout << endl;
return 0;
}

ほんとによく分かりませんね。
castの件は第2引数のvがテンプレート関数でなければ弾けるということのような気がします。
https://onlinegdb.com/ol3BYChIx
0863デフォルトの名無しさん
垢版 |
2021/10/25(月) 02:19:56.83ID:LmZJdmU+
最後のコードは右上の設定ボタンから -std=c++17 を追加することで実行できます。
0864デフォルトの名無しさん
垢版 |
2021/10/25(月) 13:57:01.70ID:p1HT8A4i
iostreamのシフト演算子オーバーロードは文句を言われてるがrangesのoperator|のオーバーロードはどうなんですかね
0865はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/25(月) 14:01:06.87ID:dRHq7DJG
感覚的にはまあ順当だろうと思う。
日付やパスで / を使うのに比べればよっぽど……。
0866デフォルトの名無しさん
垢版 |
2021/10/25(月) 15:38:37.13ID:x4U5y7kU
組み込みの意味を持たないオーバーロード専用演算子があれば良かったのにな
用意しておかなかったのはC++の初期デザインの失敗だったと思う
0867デフォルトの名無しさん
垢版 |
2021/10/25(月) 16:09:42.75ID:SLeimCOK
意味を持たない演算子が意図せず呼ばれてしまうくらいならコンパイルエラーになったほうがマシでは
0868はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/10/25(月) 17:28:55.78ID:dRHq7DJG
ところで Haskell で一定の記号の組み合わせは何でも新しい演算子として定義できる仕組みがある。
!#$%&*+./<=>? あたりとその他 Unicode 内いくらかも含めた組み合わせで演算子を作っていい。
優先順位も決められるし左結合か右結合かも決められる。
事実上無制限に違う字面の演算子を作れるんだよ。
<?+> とか #-. とか <<-~ みたいな演算子が実際に使われてるわけ。
こういう極端なのはさすがにあまりうらやましくはないよな……。

>>866
かといって有限の演算子をある程度に多く用意したところでオーバーロードを許すなら
どこかで全然違う意味で使われることもあるのは避けようがないし、
C++ くらいにスッパリと諦めるのもそれはそれで思い切りが良くて良いと思う。
0869デフォルトの名無しさん
垢版 |
2021/10/25(月) 17:51:03.08ID:s1VnbLSn
演算子ってのはwellknownだからこそ意味があると思うんだけどな
演算子のオーバーロードもその“意味”から大きく逸脱しないことを求めていたと思うし
意味を持たないオーバーロード専用演算子ってのは
プログラマーによって意味が真逆になりかねないから危険だと思う
そんなことするぐらいなら普通に名前を付けて関数定義したほうがマシに思える
0872デフォルトの名無しさん
垢版 |
2021/10/25(月) 20:01:58.87ID:VZsrHh6g
>>866
リザーブの演算子持っとけって言いたいんだろうけどこう言う奴はいくつ持ってても足りねーとか言うからw
0873デフォルトの名無しさん
垢版 |
2021/10/25(月) 21:34:55.28ID:3IW01+t9
演算子オーバーロードって自分で書くにはいいけど他人のコードを読むのが地獄だな。
0874デフォルトの名無しさん
垢版 |
2021/10/25(月) 21:35:04.23ID:EqTxifVC
while (fread(&x, sizeof(double), 1, fin) > 0) {
fprintf(fout, "%5.4f\n", x);
}

こんな風に書くとコベリティ君がfreadは読み込んだバイト数を返すが使っていませんみたいなこと言い出すんだが
は?使ってますけど?みたいな気持ちしかないんだけど
何を求められてるんだろうか。
0877デフォルトの名無しさん
垢版 |
2021/10/26(火) 08:08:42.05ID:a/qQal0X
演算子に限らず、ある関数を特定の名前空間の内部だけ使えるように限定できたっけ?
「あるスコープだけこういう使い方」ならまだ混乱も少ないかね。
0881デフォルトの名無しさん
垢版 |
2021/10/26(火) 08:27:02.14ID:cqUp+YH+
>>878
名前空間の外にお漏らししないようにできたっけ?
同じ名前空間にクラス定義しなければADLも気にしないでいいのかしらん。
0885デフォルトの名無しさん
垢版 |
2021/10/26(火) 12:31:52.75ID:E+rw0Wy/
>>882
そうそう、そんな感じ。

実際には演算子を閉じ込めたい名前空間の中でクラスを定義しなければADLは影響しないけど、もし定義するとしてもこの技法で回避できそうだね。
0888デフォルトの名無しさん
垢版 |
2021/11/01(月) 17:04:38.20ID:uZUsIwlp
std::function を引数にとる関数を作ってるんだが、参照で渡すのとコピーで渡すのでどのように動作が変わるかわからない
参照で渡して良いですか
0889デフォルトの名無しさん
垢版 |
2021/11/01(月) 17:28:34.89ID:2TKPTRzu
std::funcて中身は関数ポインタ―でしょ
コピーで済むものを参照で渡す必要はそもそもないんじゃないの
受け取り先で書き換えて返すなら別だけど
0894はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/01(月) 17:58:12.22ID:w5vOXkrp
>>893
仮引数の側を std::function の参照にしたところで、実引数の側が std::function ではないときは
変換して一時オブジェクトを作ってからその参照をとる形になるんだよ。
これは std::function に限らない一般原則。
どちらにしても新しいオブジェクトを構築するので参照にする意味がない。
0895デフォルトの名無しさん
垢版 |
2021/11/01(月) 18:35:36.43ID:XqzqlHR8
クラスのメンバーにstd::functionをいくつか用意しておいて、
条件によりどれかのstd::functionを引数に取るprivateなメンバ関数とかなら参照にする意味はあるかもしれないw
0896デフォルトの名無しさん
垢版 |
2021/11/01(月) 19:28:38.40ID:Qg2QcgLf
この流れで質問をば。

std::functionだと単体のR opetator()(Arg...)しか指定できないけど、複数のメソッドを指定できるように拡張するにはどうしたらいいかしらん?

継承じゃなくてtype erasure を使ったgeneral smart pointerとでもいうようなやつが欲しいんだけど、どこかに実装ないかなぁ。
0898896
垢版 |
2021/11/01(月) 20:35:42.39ID:0sJcc+2w
anyだとメソッドを呼び出せないから機能が足りないですな。
メソッド呼び出しできるインターフェイス付きanyみたいな感じ。
用途は「指定したメソッドがあれば継承関係無しでブチ込める親クラスみたいなanyみたいなshared_ptr」だけど。
0900896
垢版 |
2021/11/01(月) 21:35:17.71ID:0sJcc+2w
Haskellの型タイプというのがイメージに近いか。

具体例をだしてみると、
class A { public: string test1() { return string("A1"); }; string test2() { return string("A2"); }; };
class B { public: string test1() { return string("B1"); }; string test2() { return string("B2"); }; };
vector<generic_ptr<string test()>>c;
c.push_back(make_shared<A>());
c.push_back(make_shared<B>());
c[0]->test1(); // A1
c[1]->test1(); // B1
c[0]->test2(); // A2
c[1]->test2(); // B2
みたいに、anyみたいに雑多なオブジェクトをブチ込むけど、
anyとは違ってそのまま共通メソッドを呼び出せるようにする、
というのが狙いね。
0902896
垢版 |
2021/11/02(火) 00:28:12.27ID:F29rpsLU
>901
ありがとう。こういうのもあるのね

……でも BOOST_TYPE_ERASURE_MEMBER を使ったコンセプトがWandboxで上手く動かないなぁ。
もうちょっと試してみるか。
0903デフォルトの名無しさん
垢版 |
2021/11/02(火) 10:51:55.89ID:7a5iqwfV
std::thread で作られるスレッドって
スタックサイズはデフォルトいくつなん?
変更とかできるん?
0905デフォルトの名無しさん
垢版 |
2021/11/02(火) 11:48:47.80ID:LR6fq+wY
linuxならulimit -sかpthread_attr_setstacksizeで設定できる
ただ確保されるのは仮想メモリなので現実的にはその設定あんまり使い所がない
そしてC++とか関係ない
0911デフォルトの名無しさん
垢版 |
2021/11/05(金) 00:18:59.36ID:2vTbLoUN
基底クラスに定数持たせるけど値は継承先で決めたい。
例)Carクラスには計算に使うが変更はしない定数 weight hight width があり、それは継承した車種クラス毎に異なる、など。
下記でコンパイル通るようですが、定数増えると見づらく、もっとスマートなやり方あったらご教授願いたく。


class Car
{
protected:
const double weight, height, width;

public:
Car(double w, double h, double wd)
: weight(w)
, height(h)
, width(wd)
{}
};

class CarA : public Car
{
CarA() : Car(1000.0, 1.8, 1,8) {}
};
0913はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/05(金) 01:26:19.60ID:8QrXrM3i
値が const であるだけでなく static であって欲しいという意図なんじゃないかと想像する。
0919デフォルトの名無しさん
垢版 |
2021/11/05(金) 06:25:31.61ID:8h2e+y9J
>>912
引数が数値ばかりで10個とかあると確かに何を指定してるのかぱっと見わかんなくなりそう
C++なら>>918に一票だけど参照する時に ( ) が要るからこう言うケースだとC#のプロパティが欲しくなる
0921デフォルトの名無しさん
垢版 |
2021/11/05(金) 08:22:45.14ID:OHT8JXtH
>>911
Builderパターンとか?
面倒だったらDirectorクラスは省略しても問題なさそう。
類型的な車種ごとにBuilderを派生させてデフォルト値を決めといてもいいかと。
0922デフォルトの名無しさん
垢版 |
2021/11/05(金) 12:38:49.71ID:gSSLx8YQ
>>919
参照するときに()ていうのは
a=car.weight(); ていうこと?
a=car.weight; と表記したいならoperator=をオーバーロードすればいいかと
0924はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/05(金) 13:57:04.43ID:8QrXrM3i
>>923
C (C99 以降) には有るからついでに C++ でも使えるようにするのは gcc 的にはたいした手間でもなかったんだろうと思う。
0925はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/05(金) 14:01:00.76ID:8QrXrM3i
ところで C の designated initializer では配列要素を指示することも出来るんだけど、 C++20 にはこれは入らなかったんだね。
↓ こういうの。

const char *foo[5] = {
[2]="bar"
};
0926デフォルトの名無しさん
垢版 |
2021/11/05(金) 14:04:47.27ID:XqgFcDRs
c++17以前でも引数を構造体にまとめれば{}で区切って記述できるようになるから多少マシにはなるよね
IntelliSenseが効きにくくなるのが欠点だけど
0928デフォルトの名無しさん
垢版 |
2021/11/05(金) 14:27:51.72ID:7LuUsMxr
そのCの記述素晴らしいよね
C++的でないのはわかるがどうせ初期化時でしか使わんのだしとっとと入れるべきだった
0930デフォルトの名無しさん
垢版 |
2021/11/07(日) 16:47:32.00ID:qipzvPRM
https://ideone.com/d05dJ9
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
#define MAX_SIZE 100
template <class T>
// template <class T, size_t C=MAX_SIZE>
class SizeLimitedAllocator {
public:
typedef T value_type;
using traits = allocator_traits<allocator<T>>;
T *allocate(size_t n) {
if (n > MAX_SIZE) throw bad_alloc();
// if (n > C) throw bad_alloc();
return traits::allocate(_allocator, n);
}
void deallocate(T *p, size_t n) {
traits::deallocate(_allocator, p, n);
}
private:
allocator<T> _allocator;
};
int main()
{
vector<char,SizeLimitedAllocator<char>> vec(MAX_SIZE);
try { vec.resize(MAX_SIZE+1); }
catch (bad_alloc& e) { cerr << e.what() << endl; }
return 0;
}
このコードをコメント側に変更してコンパイルするとこけるんだけど、なんで?
0932デフォルトの名無しさん
垢版 |
2021/11/07(日) 17:56:01.13ID:Mdbpk+F7
>>930
https://en.cppreference.com/w/cpp/named_req/Allocator#cite_note-2
> rebind is only optional (provided by std::allocator_traits) if this allocator is a template of the form SomeAllocator<T, Args>, where Args is zero or more additional template type parameters.

これですかね?
カスタムアロケータ自分で定義したことないのでじゃあどうすればいいかは分かりませんが……
0934デフォルトの名無しさん
垢版 |
2021/11/07(日) 19:23:12.01ID:A2QjBZsT
>>930
SizeLimitedAllocatorの定義にこれ追加すればいいよ
template<typename U>
struct rebind {using other = SizeLimitedAllocator<U,C>;};
0935デフォルトの名無しさん
垢版 |
2021/11/08(月) 00:05:22.17ID:dWDs4ee0
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/ptr_traits.h#L62-L69
この辺の定義にある
定数値という型でないものがテンプレート引数に入ったため、__replace_first_argの下側の定義が使われず
上側の定義が使用されtypeも入らず
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/alloc_traits.h#L80
でrebindできなくなったことが原因でした。
これを回避するためには、>>934のように
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/alloc_traits.h#L51-L57
この下の定義に当てはまるrebind<U>::otherを定義しておく必要があるようです。

定数値でなく型がテンプレート引数に追加された場合は、otherの定義は必要ありませんでした。
0936デフォルトの名無しさん
垢版 |
2021/11/10(水) 17:04:45.91ID:9a0GsOuO
グーグルテストのASSERTの片辺に期待値をマジックナンバーじゃなくマクロ定数で指定すると赤線引いて来やがるんだけどVSだけ?
ビルドは通るしテストもできるから全く問題ないんだけどうぜー
0938デフォルトの名無しさん
垢版 |
2021/11/11(木) 00:05:50.61ID:QjSth2/F
大体のコンパイラはそういう#pragma持ってるだろ
MSVCなら#pragma warning
GCCなら#pragma GCC diagnostic
0939デフォルトの名無しさん
垢版 |
2021/11/12(金) 12:50:12.26ID:DicJ24/v
改行コードとかタブコードとかが含まれた文字列を
\nとか\tとかにエスケープしてくれる関数ってある?
0943デフォルトの名無しさん
垢版 |
2021/11/12(金) 20:51:39.15ID:4Xte/kSq
文字コード周りはカオスすぎて標準も手に負えず匙投げたからライブラリ使った方がいいよ
0944デフォルトの名無しさん
垢版 |
2021/11/12(金) 23:22:09.10ID:qmhW9zZv
>>939
C/C++の場合、1文字単位での文字列処理が得意なので、自作するのも簡単。
0x09 や 0x0a は、SJISやUtf8などの多バイト文字の中には含まれて無いから、
なおさら。
例えば、std::stringでも、新しい文字列変数dstを作って、srcの文字列
から1バイト単位で読み取って、dstに1文字ずつ末尾追加していけばいい。
0945デフォルトの名無しさん
垢版 |
2021/11/12(金) 23:28:15.13ID:qmhW9zZv
>>944
[具体例]
MFCのCStringなら、以下のようにするだけでよい:

CString src = "元の文字列";
CString dst; // 変換後の文字列を入れる変数。
const char *ptr = (const char *)src; // CString の 0 終端文字列の先頭アドレスを取得するための変換関数を呼び出している。
while ( *ptr != 0 ) {
 if ( *ptr == 0x0a ) {
  dst += "\\n";
 }
 else if ( *ptr == 0x09 ) {
  dst += "\\t";
 }
 else {
  dst += *ptr;
 }
 ptr++;
}
0946デフォルトの名無しさん
垢版 |
2021/11/12(金) 23:33:56.40ID:qmhW9zZv
>>945
[補足]
このプログラムは、1バイトずつ読み取っているが、文字符合は、このままでも、
無修正で ASCIIだけでなく、SJISやUTF8やEUCにも対応している。
後者のような符合では、例えば、SJISの"あ"の文字だと、1文字単位ではなく、
1バイトずつ処理され、2回ループが回るが、問題ない。
UTF8だと3回ループされる。
つまり、このプログラムでは、SJISの1文字は、2文字のように
UTF8の"あ"の文字は、3文字のように処理される。
しかし、それでも結果的には問題ない。
なぜなら、0x0aや0x09は、多バイト文字の中には含まれてないから。

ただし、SJISの場合、\ の文字コードが含まれているので注意が必要ではあるが、
今回は問題ない。
0947デフォルトの名無しさん
垢版 |
2021/11/12(金) 23:39:04.51ID:qmhW9zZv
>>946
[補足2]
char は、C言語が登場した時には、「文字」の意味であったが、
今は少なくとも C言語では文字の意味はほぼなく、1バイト(8BIT)の意味である。
そして、C言語でcharが1バイト(8BIT)で無い処理系は、主流ではないので無視
してよい。
Javaなどでは、charが 必ず16BITであるのとは対照的である。
ただし、Javaもサロゲートペアの文字に対しては、charは文字の一部であって
本当の1文字には対応していない。
※結局、どの言語も、1文字を固定長で扱い続けることは避けている。
0950デフォルトの名無しさん
垢版 |
2021/11/13(土) 07:45:14.90ID:xg91cK1y
CStringにせよbasic_stringにせよメモリ確保の多発なんて心配しなくていいよ
JavaのStringじゃないんだから
0954デフォルトの名無しさん
垢版 |
2021/11/13(土) 11:44:37.82ID:wZp5djKL
vectorもそうだけど、倍々にメモリを再配置していくアルゴリズムがそこそこ効率的なので、
たいていの場合はreserveしようがしまいが有意な差は出ないよね
0955デフォルトの名無しさん
垢版 |
2021/11/13(土) 12:34:40.00ID:GR8tTV2x
>>943
ほんそれ
std::codecvt_utf8_utf16とか黒歴史でしかない
0956デフォルトの名無しさん
垢版 |
2021/11/13(土) 12:36:34.59ID:GR8tTV2x
>>944-945
良い子は真似をしないように
0957デフォルトの名無しさん
垢版 |
2021/11/13(土) 12:49:12.18ID:jQtDYU1M
プログラミングとしてはiso2020使ってた頃と大して変わらんよね
低レベルで吸収してくれんとやってられん
0958デフォルトの名無しさん
垢版 |
2021/11/13(土) 13:24:23.81ID:xg91cK1y
ファイル読み取りもシステムコール側が独自にバッファリングしていることが多いから
プログラマ側ががんばってバッファリングしても二度手間だったりする
0959ハノン ◆QZaw55cn4c
垢版 |
2021/11/13(土) 15:53:45.28ID:DyUYxUU0
>>955
utf32<->utf8
utf32<->utf16
で十分だと思っていますが

というか、 utf16 自体が黒歴史…
0961デフォルトの名無しさん
垢版 |
2021/11/13(土) 17:16:26.07ID:kpA91CRo
文字コードなんて事実上iconvが標準だろ
せいぜいicuくらい
他は一部のプラットフォーム固有の関数くらい
制御コードはISO2022でもなければ使わんし、いうてwhite spaceの類は使われてないから気にすんな
真面目にやると文字の境界見つけんのがだるいし、合成文字の扱いも微妙、異常系の仕様も要件次第になるし、Unicodeのバージョンも無限に上がりそうだけどなw
ってわけでC++とか関係ない話だからどうでもいいよ
0966デフォルトの名無しさん
垢版 |
2021/11/13(土) 21:14:20.03ID:aIrFEHKz
自分はHTML5の仕様に従って変換してます!
0967デフォルトの名無しさん
垢版 |
2021/11/14(日) 08:24:14.02ID:gLhea8X6
>>959
結合文字列があるから、結局コードポイントに必ず1文字が対応しているとは限らないし、
何使ってもUnicodeは闇じゃないか。
まあ、UTF32使えばコードポイントがぶっ壊れることは避けられるけれども。
0968デフォルトの名無しさん
垢版 |
2021/11/14(日) 09:14:46.42ID:ybz8bu8o
この場合同じコードポイントでの変換なわけだし一文字がどうとか関係ないが。
0969デフォルトの名無しさん
垢版 |
2021/11/14(日) 10:38:12.94ID:G9ajtZXw
>>948
Perl/Ruby/JSなんかで正規表現を使って置換する場合でも、
同じようなアルゴリズムを使ってるはずだから、これが
特に非効率なわけではないし、代わりになるアルゴリズムで
これよりトータルで効率の良いものも恐らく存在しない。

1.例えば、0x0aと0x09の出現回数を最初に数えれば、必要な
 dstのバイト数を見積もることは可能だが、その場合は、
 二回もパースが必要になるし、プログラムも分かりにくくなる。
 二回パースすることによる速度低下も有る。

2.dstのサイズはsrcのサイズの2倍を越えないので、単純に
 dstの内部バッファをsrcのバイト数の2倍として予約しておけば
 メモリ確保は一回で済むが、srcが巨大な時、メモリを圧迫し、
 余り良いアルゴリズムとは言えない。
0970デフォルトの名無しさん
垢版 |
2021/11/14(日) 10:52:13.79ID:G9ajtZXw
>>951
文字列のバッファは、不足すると2倍、2倍、・・・で確保されていくので
確保される回数は、最終的な文字列のバイト数を N としたとき、大体、
log2(N) 回程度となり、バッファがコピーされるトータルのバイト数は、
b = a + a*2 + a*2^2 + a* 2^3 + ... + a* 2^k
k = log2(N) 程度
a = 文字列クラスの内部バッファの初期バイト数。
となり、大体で言えば、2N を越えない。
1 + 2 + 2^2 + 2^3 + ... + 2^k
は 2進数で考えれば、全てのビットが 1 に成っている整数で、
2^{k+1} = 2*2^k = 2*2^{log2(N)} = 2 * N
であることに注意する。

ただし、bの値は大体で書いたので、厳密には少し違うだろう。
0971デフォルトの名無しさん
垢版 |
2021/11/14(日) 10:59:39.62ID:G9ajtZXw
>>970
1 + 2 + 2^2 + 2^3 + ... + 2^k
= Σ_{i=0}^k 2^i
= (1 - 2^{k+1}) / (1 - 2)
= 2^{k+1} - 1
である。途中、等比数列の和の公式:
等比数列の和 = 初項 * ( 1 - 公比^項数) - ( 1 - 公比 )
を用いた。
0972デフォルトの名無しさん
垢版 |
2021/11/14(日) 11:04:20.53ID:G9ajtZXw
>>971
誤: 等比数列の和 = 初項 * ( 1 - 公比^項数) - ( 1 - 公比 )
正: 等比数列の和 = 初項 * ( 1 - 公比^項数) / ( 1 - 公比 )
0973デフォルトの名無しさん
垢版 |
2021/11/14(日) 12:08:34.21ID:p964tW2k
俺は数年前業を煮やして自前のstringクラスを作ってしまった(´・ω・`)
・sjis/utf8/utf16/utf32対応で比較・代入などどの組み合わせでも問題なく動く
・どの文字コードでも同じハッシュ値を生成する
・char型がsjisなのかutf8なのかはdefineで決める
・テンプレートベースのformatを用意してprintfを置き換え
みたいな
0976デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:30:12.63ID:mwYTHPjW
えー
コンストラクタで各種文字コードのバイト列を受け取れるようにして内部保持形式はUTF32でよくない?
0977デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:42:53.43ID:p964tW2k
それだと大きめのテキストファイルを開いたときなどいちいち変換が入って遅くなりそうだから…といっても実際にはどっちが効率良いのかまでは比べてないけど
異なる文字コード同士比較する時なんかはコードポイント単位で読み出して結局utf32ベースで処理するしな…
0978デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:44:30.36ID:E00roTgy
>dstのサイズはsrcのサイズの2倍を越えない

しね
0979デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:59:19.66ID:5aeLrxCA
プログラマーは3種類しかいない
文字コードが分からない一般プログラマー
文字コードを理解したと勘違いしている地雷プログラマー
そして人類が文字コードを理解するのは不可能だと悟った上でなんとか事故が起こらないように心を砕く真の専門家だ
0980デフォルトの名無しさん
垢版 |
2021/11/14(日) 14:17:19.40ID:p964tW2k
>>976
あーあとは、これのstring_viewバージョンがあって、関数のパラメータをconst mystring_view& strみたいに受けると、どんな対応してる文字なら(リテラルや対応してるクラス含めて)なんでも参照として受け付けるから便利なんだよね
0982デフォルトの名無しさん
垢版 |
2021/11/14(日) 15:13:11.67ID:p964tW2k
実質的にはほとんどなにも変わらないと思うけど、無駄なコピーが減る場合もあるので付けておくに越したことはないと思う
0983デフォルトの名無しさん
垢版 |
2021/11/14(日) 15:45:24.64ID:p964tW2k
まぁ、でも参照もコストゼロってわけじゃないから、場合によっては遅くなることもあるか…
0986はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/14(日) 17:38:21.62ID:A4GQ1/1N
参照で受け取るときには const を付けないと右辺値を受け取れないんだよ。

&& にしたら逆に右辺値しか受け取れないし、
テンプレートにするのも面倒くさいし、
const 参照で不都合がないならまずそれを選ぶのが常道になってる。

積極的にそうする必要はなくても手癖でやるよね。
0987はちみつ餃子 ◆8X2XSCHEME
垢版 |
2021/11/14(日) 17:44:17.95ID:A4GQ1/1N
>>985
const 無しから const 付きの参照へは暗黙の型変換が許されるがその逆はない。
const 付きにしたらそれがずっと伝わっていくってことだ。

元のオブジェクトが const でないなら const_cast で const を剥がして書き換えるのは一応は有りなはずだが、
かなり行儀が悪いしな。
0989デフォルトの名無しさん
垢版 |
2021/11/14(日) 18:02:00.71ID:nLCz7RQY
責任ベースのconstは有り得るのでは?
privateが在るんだから。
0990デフォルトの名無しさん
垢版 |
2021/11/14(日) 18:05:38.66ID:leu9kbhs
というか伝播しなかったら困るのでは?
お行儀悪くconst_castしない前提なら
ある関数の引数がconstだったら、その関数が呼び出す関数もまたconstであるという保証は大切だろうし
0991デフォルトの名無しさん
垢版 |
2021/11/14(日) 18:45:07.42ID:nLCz7RQY
もちろんそれは大切ですよ。
伝搬しなかったら意味ないし。
0992ハノン ◆QZaw55cn4c
垢版 |
2021/11/14(日) 19:45:46.13ID:5CSGBVhH
K&R2 にも const はありますが全然使わなかったなあ…volatile 同様キワモノだとおもっていました(爆)
0993デフォルトの名無しさん
垢版 |
2021/11/14(日) 22:33:34.47ID:oUoND4t/
C++20からコルーチン入るけどコルーチンの返り値に関数内の変数の参照返すの問題になるかな?

hoge& test(){
hoge tmp;
for(int i=0;i<10;++i){
co_yield tmp;
}
}

//返り値は実際はgeneratorとかになるかもしれない
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 98日 5時間 44分 33秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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