21/08/09 10:57:31.60 JaaB5Egp.net
前スレ
C++相談室 part156
スレリンク(tech板)
2:デフォルトの名無しさん
21/08/09 11:24:40.26 M3I2CbwW.net
前スレの >>997
キューが溢れないようにするのなら
スレッドが実行中かどうかを確認するのではなく
キューサイズを見るほうが確実じゃないですか?
3:デフォルトの名無しさん
21/08/09 11:43:30.76 GC6B710d.net
>スレッドが実行中か確認したいってどんなときなのかな?
たとえばゲームでセーブするとき、
メインの処理はブロックしたくないので別スレッドで実行しつつ「セーブ中です」みたいな表示を出し、終了したら消す
みたいな時かな
4:デフォルトの名無しさん
21/08/09 11:48:24.98 OWI9S7jW.net
>>3
それはセーブするスレッドのほうが開始と終了を通知すればよくない?
そうデザインするもんじゃないの?
できないときもあるのかもしれんが。
5:デフォルトの名無しさん
21/08/09 11:56:53.44 GC6B710d.net
>>4
もちろん方法ならいくらでもあると思うけど、別スレッドのインスタンス1つで全部済むなら、そっちの方がすっきりするし楽でしょ
6:デフォルトの名無しさん
21/08/09 12:12:57.14 GC6B710d.net
>>4,5
あぁ、いやそうじゃないか
ゲームのあらゆる部分をスレッドセーフで設計すれば良いのかもしれないけど、
ゲームのメインの状態遷移なんてわざわざマルチスレッド化するような重い処理でもないので、
その辺の表示とかはシングルスレッド前提で書いてるわけよ、もちろんそのほうが楽
7:だからw
8:デフォルトの名無しさん
21/08/09 12:17:21.54 qYrd5+ip.net
この「実行中」が実際にタイムスライスが割り当てられている状態を意味しているんであれば
OSにもよるが実装が大変な割に実際に役立つシーンは限られるような。
>>4であればjoinableで十分だろうし。
9:デフォルトの名無しさん
21/08/09 12:25:08.93 DVzh2mox.net
別スレッド処理の進捗を他スレッドから閲覧するためのパラメータを使っってる時点で、お察し
10:デフォルトの名無しさん
21/08/09 12:40:21.77 S8n0VVLE.net
前スレ997は色々勘違いしてそうな気がする
普通pushしようとしてキューが満杯なら何らかの同期メカニズムで自分を待ち状態にする
pop側はpopしたらその同期メカニズムに対して待ちを解除するだけだからスレッド自体が実行中かどうかなんて見る必要がない
11:デフォルトの名無しさん
21/08/09 13:35:16.98 eF2Q2UUf.net
std::condition_variable
12:ハノン
21/08/09 13:52:46.20 .net
正直いって pthread の条件変数は私には理解が難しく、私は安易に win32api のクリティカルセッション&シグナルを多用してしまうのです
ただし、スタベーションに陥ることが多々あり、どうもクリティカルセクション・シグナルでは駄目なパターンがあるかもしれない、とヒヤヒヤしています‥‥
13:デフォルトの名無しさん
21/08/09 14:01:28.39 TRAo/ccI.net
>>2
別に
Producer(pushする側)がこれからpushするのを待っている場合、
Consumer(popする側)はキューサイズ(キューの中の要素数)を見ても
Producerが待っているのかどうかの情報を得られない
なぜなら、まだpushしていないからな
14:デフォルトの名無しさん
21/08/09 14:14:45.62 TRAo/ccI.net
>>9
>pop側はpopしたらその同期メカニズムに対して待ちを解除するだけ
そういう実現方法も(pop側が行った待ち解除がキューイングされれば)成立する鴨、と>>997にちゃんと書いているもーん
15:デフォルトの名無しさん
21/08/09 14:32:36.91 JaaB5Egp.net
>>5
>>4って新規スレッド1個で全部済むと思うんだけど……
16:デフォルトの名無しさん
21/08/09 14:33:19.09 S8n0VVLE.net
>>13
いや、スレッドの実行状態なんて見てもしゃーないって話
pop後にpush側が実行中だとしてもそのチェック直後にpushするかも知れん
要するにスレッドの実行状態の変化は排他制御できないから意味がないって話
pop前にいちいちスレッドをsuspendしてチェックしてからresumeするとかするならできるかもしれないけどw
17:デフォルトの名無しさん
21/08/09 14:34:07.65 aCXIbwxy.net
std::vectorの部分ベクトルの切り出しって絶対O(要素数)の計算量かかりますよね?
18:デフォルトの名無しさん
21/08/09 14:40:14.51 fi8SjIox.net
「部分ベクトルの切り出し」とは何かを定義せよ。
19:デフォルトの名無しさん
21/08/09 14:47:54.30 eF2Q2UUf.net
こういうの?
std::vector<int> a{ 4, 6, 4, 9 };
std::vector<int> b(a.begin() + 1, a.begin() + 2);
20:デフォルトの名無しさん
21/08/09 15:11:52.58 KzU8BZnC.net
参照できればいいのか、コピーがいるのか、切り出し位置はわかってるのか、検索を伴うのか、
その辺の条件もなしに計算量の議論なんて出来んわ
21:デフォルトの名無しさん
21/08/09 16:11:11.49 6v1cUfUr.net
クラスAの内部にクラスBがある (入れ子クラス) として、B
22:からAのメンバにアクセスするテクってないんですかね? アクセスしたいメンバをstaticにはしたくないです
23:デフォルトの名無しさん
21/08/09 16:20:25.36 GC6B710d.net
>>20
AへのポインタをBに定義して、コンストラクタかなんかで渡せばいいのでは?
24:はちみつ餃子
21/08/09 16:48:43.56 OWI9S7jW.net
>>20
クラスの中でクラスを定義しても A の名前空間の中に B が定義されるってだけ。
B のオブジェクトを作っても A のオブジェクトが存在しないなら存在しないオブジェクトのメンバにはアクセスできない。
A のオブジェクト (インスタンス) と B のオブジェクトの間には勝手に関係が出来たりもしない。
関係ないのに関係あるように見えて初心者が混乱してるのはどっかの質問サイトでも見たことがある。
よく理解できてないならまずはクラスの定義を入れ子にせずにやってみるのがオススメ。
25:デフォルトの名無しさん
21/08/09 16:52:51.13 S8n0VVLE.net
>>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());
26:デフォルトの名無しさん
21/08/09 16:59:35.77 eF2Q2UUf.net
>>19
コピーか参照かは1要素あたりの処理量なので
コンテナの計算量には関係ない
27:デフォルトの名無しさん
21/08/09 17:00:48.11 hJGoZPOe.net
絶対レビュー通らないウンココードでよいなら
(char*)this + offsetof(A, b)でなんとかならんのか
28:デフォルトの名無しさん
21/08/09 17:33:38.90 GC6B710d.net
class Aをtemplate化して、class BでAを継承すれはメンバにはアクセスできるけど、たぶんそういうことがしないんじゃないんだろうなw
コンテナクラスのイテレータから親クラスインスタンスのメンバにアクセスしたいとかか?
29:デフォルトの名無しさん
21/08/09 17:48:31.00 eF2Q2UUf.net
リファレンサを作るときなんか親オブジェクトへのポインタ使うね
30:デフォルトの名無しさん
21/08/09 20:07:17.09 XVy1LhuX.net
>>23
普通にコンポジションで実現できる条件だよな
メルプラネットの奴らも同じこと言いそう
31:デフォルトの名無しさん
21/08/10 00:55:38.92 rk6SLsdN.net
親オブジェクトへのポインタをうっかり共有ポインタにすると循環参照の原因になる(小並感)
32:デフォルトの名無しさん
21/08/10 03:53:30.08 mPLpHQ1a.net
+=の引数が1のときは++を呼ぶようにする方法ってありますか
33:ハノン
21/08/10 04:41:55.83 .net
>>30
自分でそう書くのがいいのでは?
(n == 1) ? x++ : x += n;
34:デフォルトの名無しさん
21/08/10 08:16:11.83 JssHBcjd.net
>>30
遅くなる可能性があるから気にしない。
コンパイル時に解決できるなら++使っても同じだし、実行時に解決するようだと1かどうかの判定が増えて遅くなる。
35:デフォルトの名無しさん
21/08/10 12:11:16.71 OMlKC5pQ.net
TCPIPのソケット通信プログラム作ろうと思っているのですが、
コネクションを維持し続ける場合のデメリットって何がありますか?
36:デフォルトの名無しさん
21/08/10 12:42:43.27 ZRv1Vy3I.net
>>32
後出しになって申し訳ありませんが、*、!=、++、+=、- 辺りが定義されたイテレータを持つ自作のデータ構造を範囲for文で走査することを考えています
それ自体は想定した通りにできたのですが、その範囲for文をomp並列化するとイテレータのインクリメントが ++ でなく
37: +=1 で行われるようになります で、その自作データ構造では ++ よりも += の方が重い実装になっているので、+=1 よりは ++ の方を使ってほしいです omp に特有の仕様に思えるので、普通に += の冒頭で引数が1かどうかの分岐を入れることにしようかと思います ありがとうございました
38:デフォルトの名無しさん
21/08/10 14:57:46.78 W7aMf5pX.net
マルチスレッドのキューのサンプルをSTLで作りゃったーしたったわ、
URLリンク(ideone.com)
↓ここのC#のサンプルプログラムの移植
// URLリンク(atmarkit.itmedia.co.jp)
フラグの必要性は意味を取り違えていたわサーセン、
しかしこれフラグ(runningFlag)無しでやるとしたら終了時にConsumerがいちいちProducerが
join可能か調べる(std::thread::joinable())ことになってスレッドより先にプログラムした人が終了したくなるお
フラグで済むのに、
39:デフォルトの名無しさん
21/08/10 15:21:27.23 W7aMf5pX.net
Windowsのイベントオブジェクトと条件変数の違いまとめ
URLリンク(dev.activebasic.com)
40:デフォルトの名無しさん
21/08/10 15:28:07.54 W7aMf5pX.net
と思ったがやっぱ当初の意味(Producerが待っているのかどうか)のフラグが無いと、
キューが空になった後のnotifyで、1万個あるかもしれない仕事の無いConsumerが次々起床され、
巡り巡ってようやくProducerが起床されるみたいな非効率が生じる余地があるやんけ;;;
やっぱ当初の漏れのフラグ必要という意見で正しかったのかもしんない
漏れは天才なのかもしんない、
かもしんない運転、
41:デフォルトの名無しさん
21/08/10 18:25:35.80 W7aMf5pX.net
つかその前に、漏れの天才eyesが改造元とした@IT様のサンプルプログラムに
スレッドのディスパッチ依存で終了できなくなることがあるという恥ずかしいバグを発見した、
論より証拠:
URLリンク(ideone.com)
変更点は、Consumerを1個にして、Producerの側のある個所にsleepを入れただけ
(マクロ CAUSE_STOPPING_FAILURE_BUG で条件コンパイルで有効にしている個所
これでConsumerスレッドが終了できなくなる
対策は、同ソースコードの BUGFIX_STOPPING_FAILURE_BUG マクロを有効にしたら宜しい
天才の判断である
42:デフォルトの名無しさん
21/08/10 18:42:35.68 mYAwPqTL.net
>>34
すみません。この件なんですが、
void operator += (int n){
if(n == 1){
// ここ
}else{
……
}
}
「ここ」で演算子++を呼びたいときってどう書いたら良いでしょうか
++の中身をコピペしても良いのですが、
this -> ++
みたいなノリで呼び出せた方が都合が良いです
43:デフォルトの名無しさん
21/08/10 19:06:35.71 W7aMf5pX.net
というわけで最終的な版を貼る、
URLリンク(ideone.com)
ProduceとConsumerそれぞれに対する起床条件を分離すた、
日本語ではいくら説明しても一向に理解の光が射さなかったボンクラ学生レヴェルの>>15でも
100行足らずのソースコードなら読めるんじゃないの
知らんけど
44:デフォルトの名無しさん
21/08/10 19:11:32.09 cMFKuo8t.net
>>39
++(*this);
または
this->operator++();
45:デフォルトの名無しさん
21/08/10 19:24:28.15 mYAwPqTL.net
>>41
ありがとうございます
前置/後置の別が自分�
46:フ中でよく付いていませんが、教えていただいたことに基づいて調べてみます
47:デフォルトの名無しさん
21/08/10 19:37:16.72 Lbev+Y0v.net
>>40
で、そこで取れると良い「スレッドの実行状態」って結局何なん?
48:デフォルトの名無しさん
21/08/10 20:32:27.09 W7aMf5pX.net
「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や
とれると良い、ではなく取ることが必須や
なぜなら、WIN32APIのイベントは1回だけキューイングされるので投げたら投げっぱなしでもそのうち
受け取ってもらえるが、(pthread系統のしくみである)状態変数はそうではなく、
起床信号を投げつける前に相手が信号をキャッチ可能なのか(待ちに入っているのか)知る必要がある
なお、イベントのキューイングの有無によって話が変わる旨はすでに書いたある(>>997
上記のことを書いてあるというのに理解もせずにしつこく同じことを繰り返し言ってきたのが>>15
49:デフォルトの名無しさん
21/08/10 21:01:08.35 Lbev+Y0v.net
>「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や
それって具体的にどういうものを想定しているんだろう。
もともとの話はstd::threadに追加したい機能だったと思うけど、この説明だけじゃ全然想像がつかない。
50:デフォルトの名無しさん
21/08/10 22:11:54.85 W7aMf5pX.net
なんか元にしたコードにまだ問題があった気配orz
MAX_QUEを1にすると高い頻度でProducerとConsumerが両方待ちに入ってしまいハングアップする、、、
対策版は多分これ↓で良いんジャマイカ……
URLリンク(ideone.com)
(何が起きていて、どうしてこれで対策なのかはコメント参照、
>>45
>>「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や
>それって具体的にどういうものを想定しているんだろう。
今回のサンプルコードでは具体的にはありません(キリ
しいて言えば!runningFlagならConsumerが自身を待ちに入れない(∵Producerがもう起こしてはくれない
というのはあるが、>>35に書いた通りフラグ以外の方法でも同じ判定を行える
言っていることにブレがあるのは今日pthreadを勉強したばっかりやし、
天才なので大目に見てホスイ、
51:デフォルトの名無しさん
21/08/10 22:25:26.70 W7aMf5pX.net
でもまあコメントを読んでいただければ、pthread系のしくみだと
起こす対象のスレッドが何をしているのかについて常に配慮が居るということをご理解いただけるのではないかと思う
今回はたまたま見込みでnotifyして話が通るからスレッドの実行状態を表す変数が具体的に生じなかっただけ
52:デフォルトの名無しさん
21/08/10 22:47:59.90 C0wcAbjz.net
すみません。
自作プログラムが特定のPCだけ同じ場所でntdll.dllのエラーで止まるのですが、何が原因と考えられるでしょうか?
他のPCでは問題無く進み、エラーを起こすPCのメモリにも異常は見つかりませんでした。
53:デフォルトの名無しさん
21/08/10 23:06:02.90 OOQ3UOoB.net
>>48
未初期化変数があって無効なアドレスにアクセスしたとかじゃね
確実なことを言うためには例外コードが知りたい
あと問題の箇所のソースコードも
54:デフォルトの名無しさん
21/08/10 23:24:57.75 C0wcAbjz.net
ソースはすみません、ちょっと出せないです
エラーコードは0xc0000005でしま
55:デフォルトの名無しさん
21/08/10 23:30:51.53 OOQ3UOoB.net
はいメモリアクセス違反ですね
デバッガでがんばって調べてね
56:デフォルトの名無しさん
21/08/10 23:32:41.60 C0wcAbjz.net
あざす
57:デフォルトの名無しさん
21/08/10 23:34:52.75 5fGESjxl.net
他の言語にはスレッド実行中か判定するAPIあるしstd::thread作った人達だってそのくらいのこと知ってたでしょ
boost::thread時代にそういった要望もあっただろうし
それでもあえてstd::threadにはスレッド実行中を調べる機能を付けなかった
本質的に必要な機能ではないと
58:判断したんじゃないの?
59:デフォルトの名無しさん
21/08/10 23:44:13.15 rk6SLsdN.net
スレッドそのものの終了状態を知る需要はあまりなく、スレッド内で行われるユーザー定義処理が終わったかどうかが重要だからでしょ
60:デフォルトの名無しさん
21/08/10 23:50:54.98 Lbev+Y0v.net
>>47
>起こす対象のスレッドが何をしているのかについて常に配慮が居るということをご理解いただけるのではないかと思う
それがwaitで待っている状態かそうでないかを意味しているんだとしたらそれは正しくない。
チェックした次の瞬間にwaitする可能性もあるわけなんで。
61:デフォルトの名無しさん
21/08/11 01:24:38.33 qkzYmFIh.net
>>55
>チェックした次の瞬間にwaitする可能性もあるわけなんで。
無い
チェックと処置をmutexによる単一のロック期間の中でアトミックに行うのだから>>55は全くナンセンスな問題提起
>>53
thread::joinable()があることは書いたもーん
62:デフォルトの名無しさん
21/08/11 01:28:13.23 qkzYmFIh.net
問題だらけだった@IT様のサンプルコードだけど
これまともに実装するとしたら条件変数をConsumer x NとProducerの計N+1個設けて、
さらにConsumerそれぞれが待っているのか動いているのかを示すフラグを設けて
全部動いていたらProducerを待たせる
Consumerが待ちに入る直前にProducerにnotifyかけてキックする、みたいな
スレッドプールを手で実装するみたいな話になりそう……
でここまでやるならConsumerの状態変数が実体としてコードに現れる
63:デフォルトの名無しさん
21/08/11 01:44:51.77 01hIEDa4.net
何を主張したくてごちゃごちゃ言ってるのかさっぱり見えないし途中で変わったりしてるようでもあるので、
続けるならそもそもどういう主張をしているのかいっぺんまとめてほしい。
64:デフォルトの名無しさん
21/08/11 08:13:22.18 SyYdmIb8.net
>>56
std::threadから取得する「スレッドの実行状態」の話をしているんだが。
それをmutexでアトミックに操作する???
65:デフォルトの名無しさん
21/08/11 09:56:36.95 8ERcfmko.net
C++ってiPhoneアプリ作れる?
66:デフォルトの名無しさん
21/08/11 12:11:01.26 sOdrsbt7.net
>>60
作れる。QtやUnityで。
67:デフォルトの名無しさん
21/08/11 12:13:04.52 sOdrsbt7.net
iPhone専用でいいなら、そもそも、Appleが提供している標準開発環境だけでも
C++で作れる。
iPhoneの標準開発言語はSwiftだが、SwiftはC++と相互に呼び出せるから。
ただし、それだけだと面倒かも知れない。
そういう場合は、Qtで作れば。
68:デフォルトの名無しさん
21/08/11 12:52:41.17 MU7UJMps.net
std::vector で insert するとき
v.insert(v.begin() + n, hoge);
とかすると思いますが
このときの n の型って何ですか?
int ?
unsigned long ?
size_t ?
あとこういう型を調べるときって
vector のどことか iterator のどこを調べると判りますか?
69:デフォルトの名無しさん
21/08/11 13:03:37.14 19rzwYjH.net
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]が簡単だと思う
70:デフォルトの名無しさん
21/08/11 14:01:06.77 OqxISI0I.net
>>59
ID:W7aMf5pX = ID:qkzYmFIh はスレッドの状態として
・その瞬間の状態: Run/Ready/Wait/...
・終了してるかどうか: thread::joinable で取得できる
を混同してる(わざとかどうかは知らんが)
あと条件変数とスレッドの状態も混同してるので
> チェックと処置をmutexによる単一のロック期間の中でアトミックに行うのだから
なんて意味不明なことを言い出してる
これ以上続けるなら>>58が言うように本人にまとめてもらわないとますますグダグダになるだけだと思う
71:デフォルトの名無しさん
21/08/11 14:15:21.29 EWMgwFeS.net
std::thread使ったことないから自信無くて黙ってた�
72:ッど thread::joinable()って別にスレッドが終了したかの判定ではなくない? 他スレッドでの実行を管理していない状態の(空の)オブジェクトが作れるから、そういう空の状態かどうかの判定関数であるように読めた fstream::is_open()的な……
73:デフォルトの名無しさん
21/08/11 14:23:39.88 01hIEDa4.net
>>63
暗黙変換があるから n の型としてはすべての整数型があり得る。
基本的には、生ポインタで実装される可能性もあるものなので ptrdiff_t だと思っておけばいい。
正確な型が必要なら difference_type とか iter_difference_t とかで調べればわかる。
74:デフォルトの名無しさん
21/08/11 14:56:54.71 OqxISI0I.net
>>66
> thread::joinable()って別にスレッドが終了したかの判定ではなくない?
もちろん正確にはスレッド変数がスレッドと関連づいてるかどうかの判定
彼は>>35辺りでスレッド終了判定と思い込んでるフシが見られるのでそう書いてある
75:デフォルトの名無しさん
21/08/11 15:08:15.20 MU7UJMps.net
>>67
ありがとうございます
>>64
>現物で調べるならVisual Studioの[F12]が簡単だと思う
それで判るのは自分で定義した可能性の高い n の型ですよね?
知りたいのは v.begin() + n に要求されている型のことです
76:デフォルトの名無しさん
21/08/11 15:28:09.46 EWMgwFeS.net
>>68
やっぱりそうですよね
じゃあ>>65の2個目の中黒の内容については引用??
例のコードではjoinableなんか使ってないし>>7が書いたのを試しもせずに真に受けた感じなのかな
77:デフォルトの名無しさん
21/08/11 15:29:37.31 EWMgwFeS.net
>>69
v.begin().operator+(n)とでも書き換えてoperator+で[F12]しろということではなかろうか
78:はちみつ餃子
21/08/11 15:43:43.66 QcAq7ivU.net
>>69
ランダムアクセスイテレータには difference_type (またはそれに暗黙に型変換出来る何か) を足すことができて、
その結果の型はイテレータ自身と同じ。
URLリンク(timsong-cpp.github.io)
79:デフォルトの名無しさん
21/08/11 15:52:06.26 SyYdmIb8.net
>>66
>thread::joinable()って別にスレッドが終了したかの判定ではなくない?
実際にそのスレッドが実行中か待ちか終了しているかを表しているわけじゃないことはその通り。
で、たぶんそれで十分だからjoinable以上の機能は用意されなかった。
ところがそれが役に立つ場面があるよと言ったのが前スレ>>997
このスレの>>35と同一人物かどうかは知らんが。
80:デフォルトの名無しさん
21/08/11 15:54:21.05 19rzwYjH.net
>>71
そういうこと
81:デフォルトの名無しさん
21/08/13 02:38:58.72 tLa9gek2.net
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 したポインタを返したいのですが問題ありませんか?
82:デフォルトの名無しさん
21/08/13 02:56:15.88 nopi39s7.net
>>75
shared_ptr<char *> だと、たぶんやりたいことはできてない。
shared_ptr<char[]> の間違いなんだろうと思うけど、この時点でコンパイルすら試してないのが見て取れる。
参照カウンタの動きは挙げられたソースだけじゃ読み取れないけど、無限に増えるなんてことはまず起こらない。
shared_ptr の use_count() で取れるから試してみればいい。
問題があるかどうかも自分で試してみればいい。何を「問題」とするかこちらにはわからないし。
83:デフォルトの名無しさん
21/08/13 09:51:25.31 BE9FMbqU.net
個別の事例で心配ない、問題ないという返答を得たとしても理解が深まらない。
shared_ptr のメカニズムを理解できないと何度でも心配になるだけ。
�
84:ヌういう理屈で参照カウンタが無限に増えると思ったのかを説明してみて。 考え方に間違いがあれば指摘するよ。
85:デフォルトの名無しさん
21/08/13 11:40:57.21 UG8FRdqC.net
char *mystrcat(char *a, char *b)
{
// a に b を結合して
return make_shared<char []>(a);
}
じゃいかんの
しらんけど
86:デフォルトの名無しさん
21/08/13 14:30:41.36 vEVo7A6C.net
適当な質問者と適当な回答者
ゴミとゴミをあわせてもゴミはゴミ
87:デフォルトの名無しさん
21/08/13 18:27:35.00 tLa9gek2.net
shared_ptr<char []> c(a);
return &c[0];
88:デフォルトの名無しさん
21/08/14 08:57:21.71 dlgzlAXX.net
namespaceってどのように使うものなんですか?
存在意義がわからない。
89:デフォルトの名無しさん
21/08/14 09:56:52.00 2Gpa2MRC.net
>>81
大規模ライブラリを設計するときに重宝する機能
詳しい経緯は知らないがグローバルスコープの識別子名の競合を回避する目的で導入されたと思う
namespaceがないC言語時代にいくつからの大規模ライブラリを組み合わせたときに何が起きがちだったか知っていれば納得出来るはず
どんな機能もそうだが、自分が必要と思った時に使えば良いだけだよ
存在意義が分からないならお前にとっては必要のない機能ということだから、気にする必要はない
90:デフォルトの名無しさん
21/08/14 10:45:32.18 MjnqNUAd.net
Cにnamespaceが導入されないのは何故なんです?
91:デフォルトの名無しさん
21/08/14 10:48:18.77 isR1pnnS.net
>>75
蛇足だけど、理由がなければshared_ptr<char[]>の代わりにshared_ptr<str>にしたほうがいいな。
// a に b を結合して
return a
がすごく怖い。
92:デフォルトの名無しさん
21/08/14 11:05:20.03 HmVXtcJk.net
>>83
namespace
93:デフォルトの名無しさん
21/08/14 11:07:32.50 HmVXtcJk.net
>>83
namespaceを導入するということは :: だのマングリングだのADLだの色々付いてくるからな
94:デフォルトの名無しさん
21/08/14 11:09:29.69 sh47n3w4.net
>>83
マングリングが必要になってしまうから、ってのが大きいだろうな。
95:デフォルトの名無しさん
21/08/14 11:16:28.29 Wd8wuOU/.net
C++を本格的に学ぼうと思って本を数冊買ったが、言語仕様が複雑な割には知らないとエラー起こすだろ
っていう項目が多くてビビってる。あと、きれいなコードを書くのに尋常じゃない経験が必要なんじゃないか
96:はちみつ餃子
21/08/14 11:34:44.96 xM4RG8+9.net
全部知らなくてもわかる部分だけでまあまあ使えるというのが C++ の方針なので
最初から綺麗に書こうと思わないほうがいいと思う。
綺麗に書けないと考えるより汚くても普通なんだと考えると気が楽でしょ。
97:デフォルトの名無しさん
21/08/14 11:41:20.52 HmVXtcJk.net
構造体の中に関数が書ける、というコアの中のコアな部分の使い方・考え方さえ憶えるというより慣れれば
あと他のは追加で憶えればいいってだけ
ただし、その追加が今とんでもない量になってて
禿本の初版からやってる俺でさえ憶えきれなくてもがいてる
98:デフォルトの名無しさん
21/08/14 11:47:19.11 fhp8ilcT.net
いいかい学生さん、 他人のコードをな、 他人のコードをいつでも読めるくらいになりなよ。
それが、人間えら過ぎもしない貧乏過ぎもしない、 ちょうどいいくらいってとこなんだ。
99:デフォルトの名無しさん
21/08/14 13:15:40.19 MjnqNUAd.net
>>88
エラーが起こったらまだマシだな
イクときはだまってイクからな
100:デフォルトの名無しさん
21/08/14 13:23:47.33 sh47n3w4.net
他人のコードを読んで学ぶのに一番向いてない言語だよなC++は。
101:デフォルトの名無しさん
21/08/14 13:48:08.91 fhp8ilcT.net
オーバーロードが悪いんですよ
102:デフォルトの名無しさん
21/08/14 14:19:07.48 EcmTnCEO.net
>>93
perl に比べたらまだマシ
103:デフォルトの名無しさん
21/08/14 17:38:14.88 sh47n3w4.net
perlは文法が複雑なだけで、知らない書き方に出会ったらそれを調べれば�
104:「い。 C++はコードの断片だけ見ても動作を想像できないことがあるから厄介。
105:デフォルトの名無しさん
21/08/14 18:45:25.98 lbIZmRLc.net
ぶっちゃけスマートポインターって面倒だよね?
106:デフォルトの名無しさん
21/08/14 18:54:41.75 fhp8ilcT.net
スマポに限らず面倒なテンプレートクラスだらけだよ
107:デフォルトの名無しさん
21/08/14 18:56:25.80 fRH2bKcn.net
ぶっちゃけどんなときに面倒だと感じる?
108:デフォルトの名無しさん
21/08/14 19:58:29.67 x6Wgppy9.net
スマートポインタに慣れたら自分で解放しなきゃならないmallocやnewの方がよっぽど面倒
109:デフォルトの名無しさん
21/08/14 20:04:27.45 HmVXtcJk.net
>>98
クラステンプレートな
110:デフォルトの名無しさん
21/08/14 21:41:33.25 fhp8ilcT.net
autoが便利すぎて反復子の型を明示していたころのC++には戻れそうにない
111:デフォルトの名無しさん
21/08/14 22:18:40.56 cML6JT7R.net
11よりは前は書きたくないね
112:デフォルトの名無しさん
21/08/15 00:20:00.85 YeWgyy60.net
QZ案外初心者やなw
でも言ってることは全面的に賛成
ポインタや参照、クラス等の基本を抑えてからでないとスマポや、C++11からの要素(右辺値参照含む)の使い方もわからんと思う
113:デフォルトの名無しさん
21/08/15 06:30:24.80 AkVzvB4L.net
autoもそうだが ->戻り型やusingエイリアスもだね
typedefには戻れない
114:ハノン
21/08/15 09:34:41.47 .net
>>103
確かに罰ゲームの一種になるかも‥‥私も少しずつ採り入れていくようになっていますし
>>104
もう永遠の初心者だと思っていますので、ならば、初心者の気持ちがわかるコメントでコントリビュートするのもありかと、ふつふつと
115:デフォルトの名無しさん
21/08/15 14:37:33.11 Qb5ISoeo.net
>>104
なにこれ?
QZ「~」
名無し「QZ初心者やな。でも賛成」
っていう自演をやろうとしたが、一個目のQZのレスをコテつけ忘れで投稿してしまったのか?
あるいははちみつとQZを同一視している?
いずれにせよとんでもない皮肉だな笑
116:ハノン
21/08/15 15:29:20.83 .net
>>107
いちいち反応しなくてもよろしい
>>108
つ鏡
117:デフォルトの名無しさん
21/08/15 17:48:49.44 pJ9UilRh.net
>>107
それ、以前俺が書いたカキコを勝手にコピペされただけだよ
118:デフォルトの名無しさん
21/08/15 17:52:57.61 /OoKg6VD.net
クッソささやかな体面保つためだけの自演も失敗とか本当にみじめないきものだな…
119:デフォルトの名無しさん
21/08/15 18:00:11.34 /ZNLC/hj.net
これか。どういう意図のコピペなんだろうかね。
スレリンク(tech板:595番)
120:はちみつ餃子
21/08/15 18:12:10.32 oR5NZ4bd.net
>>111
ブラウザが記憶してたのを再度投稿してしまったとかそういうしょうもないミスじゃないかな。
JaneStyle のメモ欄で以前のレス内容を貼り付けたりそのまま投稿できたりする機能があるよ。
121:デフォルトの名無しさん
21/08/15 18:15:56.65 pJ9UilRh.net
だから勝手にコピペされたっつってんだろクソ餃子め
>>104は俺じゃないから
3行目を引用したかったのか変な自演したかったのかは知らん
122:はちみつ餃子
21/08/15 18:21:10.51 oR5NZ4bd.net
>>113
すまぬ。
本人によるものでなくてもなんらかの意図でメモしてたものを
うっかりということは起こりそうなデザインにはなっているので、
意図によるものでなくただのミスじゃねという部分が主旨。
123:デフォルトの名無しさん
21/08/15 18:25:05.27 pJ9UilRh.net
(´・ω・`)そうか
124:デフォルトの名無しさん
21/08/16 15:03:34.95 Gh+OcB3l.net
>>107
なんで突然はちみつ?
125:はちみつ餃子
21/08/16 15:17:56.99 5E5Krdno.net
>>116
現時点でこのスレにコテ (+トリップ) 付きで書き込んでいるのがはちみつ餃子と QZ だけだからだろ。
126:デフォルトの名無しさん
21/08/16 19:18:38.03 QgSHgEhC.net
(unsigned) intの数を受けたら何らかの演算をして (unsigned) long longの数を返す、(unsigned) double の数を受けたら何らかの演算をして (unsigned) long double の数を返す、みたいのって逐一オーバーロードを書くしかないですよね?
要するに、大きいデータ型に格上げして何らかの演算をして返したいってことなんですが
127:ハノン
21/08/16 19:34:40.64 .net
>>118
演算子のオーバーロードにしても関数のオーバーロードにしても、返り値の型を指定することは出来なかったかと
思いつくのは演算前の引数にあてがうキャストのオーバーロードですね
128:デフォルトの名無しさん
21/08/16 19:55:44.02 AiYiQHL1.net
引数をテンプレートにして、引数Tのビット数と整数型かどうかを見て、一段階大きい型を戻り値の型とすることは出来る
129:ハノン
21/08/16 20:16:27.49 .net
>>120
pls kwsk
>>119 普通にコンストラクタのほうがいいですか‥
130:デフォルトの名無しさん
21/08/16 21:59:33.60 AiYiQHL1.net
ごめん、めんどい・・というか
sizeof(T)と整数or浮動小数点数のbool(is_integralとかで取る)を受け取る構造体の中でtype(戻り値の型)を定義、とか考えてたけど
結局Tのサイズごとに特殊化するから手間変わらん、てのと
関数の中身が長くなるなら、オーバーロードした関数からテンプレート版(戻り値の型と引数の型がテンプレート)を呼んで、そこで中身書けば一回で済むね
131:デフォルトの名無しさん
21/08/16 23:40:17.97 cwTPPWgm.net
>>118
ふつうに long long や long double を引数で受け取るって演算して返す関数を書けば
その通りの動作になりそうなんだけど、何か気に入らないの?
2つ関数書くのが嫌だってこと?(やりたいことが少なくとも2通りあるのに?)
132:はちみつ餃子
21/08/17 00:20:49.88 yPn/BtRt.net
大きい型というのは一段階大きい型という意味なのかな?
型の大きさは処理系 (アーキテクチャ) 依存だし、
ポータブルに書こうと思ったら思ったよりも面倒な感じ。
主要なアーキテクチャだけ対処できればいいなら
8 → 16 → 32 → 64
の拡張が出来ればいいので用意するパターンはそんなに多くはない。
ちなみに Windows の long double は double と同じ大きさだよ。
133:デフォルトの名無しさん
21/08/17 02:08:49.72 rNAqXouz.net
何種類か関数があるならtraitsを作成するのもありじゃない?
134:デフォルトの名無しさん
21/08/18 04:11:58.97 ReVsRUuR.net
関数読んだら1段階デカい型が返ってくるなんて使う側でも面倒が起きそうだな
135:デフォルトの名無しさん
21/08/18 04:23:43.76 TZ94eDdV.net
まぁ、戻り値にも使用できるテンプレートの追加の型を関数内でconstexpr的に定義出来たらいろいろ面白いことが出来そうではあるなw
136:デフォルトの名無しさん
21/08/19 15:14:48.98 9cCAU3aU.net
話は勝手に変わるけど、
{ 1,2,3,4,5 }
のような書き方が initializer_list になる場合とならない場合を全て知りたいけど
良く分からないので、誰か教えてくれまいか。
137:デフォルトの名無しさん
21/08/19 15:21:14.80 9cCAU3aU.net
>>128
的を外しているかも知れないけど、その書き方をAと書くとすると、どんな文脈でも
A自体が最初に必ずいったん initializer_list<T> になった後にそれぞれの文脈で処理されるという
ことなのか、あるいは、
auto x {・・・};
auto x = {・・・};
auto x = TYPE {・・・};
func({・・・});
のようにいろいろな書き方や文脈が変わるとそもそも A は意味論的にすら
initializer_list<T> を経由せずにそれぞれ独自に解釈されて処理される
のか、どちらなんだろう????
138:デフォルトの名無しさん
21/08/19 15:24:22.53 9cCAU3aU.net
あと、良く分からないのが、
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)が呼び出されるのだろうか?
139:はちみつ餃子
21/08/19 16:38:31.07 z/GAGLjl.net
>>129
> initializer_list<T> を経由せずにそれぞれ独自に解釈されて処理される
initializer_list を経由しないことはある。
おおざっぱには initializer_list を受け取る文脈では initializer_list だし、
推論が必要なとき (auto やテンプレート) にも initializer_list に推論されるが、
そうでないときは initializer_list を経由しない。
140:はちみつ餃子
21/08/19 16:48:40.83 z/GAGLjl.net
>>130
優先順位がある。
1. 2. 3. のいずれも initializer_list としての解釈が「優先される」。
initializer_list を受け取るコンストラクタが存在しなければ
三引数のコンストラクタが呼出される。
141:デフォルトの名無しさん
21/08/19 16:54:44.67 9cCAU3aU.net
>>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 を受け取るコンストラクタでも受け取ることは不可能??
142:はちみつ餃子
21/08/19 17:08:54.15 z/GAGLjl.net
>>133
(initializer_list を受け取るコンストラクタが無ければ) いずれも 3 引数のコンストラクタが起動されるが、
5. は 3 引数のコンストラクタでオブジェクトを構築した上で a にコピーする。
(コピーコンストラクタ、またはムーブコンストラクタが起動する。)
ただし RVO が有効な状況ではコピーやムーブはが省略されるので 5. は 4. と同じ。
そしてこの場合には関係ないが、波括弧によるコンストラクタ起動では引数の暗黙の型変換を許さない
といった重要な違いがある。
(initializer_list を受け取るコンストラクタが有る状況でも) 4. と 5. は initializer_list とは解釈されない。
143:デフォルトの名無しさん
21/08/19 17:14:28.81 9cCAU3aU.net
>>134
1. 2. 3. は、initializer_list を受け取るコンストラクタでも受け取ることが可能?
4. 5. は、initializer_list を受け取るコンストラクタでも受け取ることは不可能??
については?
144:はちみつ餃子
21/08/19 17:19:50.55 z/GAGLjl.net
>>135
それが区別できるだけのルールは既に提示したつもり。
145:デフォルトの名無しさん
21/08/19 17:21:53.70 9cCAU3aU.net
>>136
すまん。もう一度明言してくれるとありがたい。
146:デフォルトの名無しさん
21/08/19 17:27:44.09 td+NCu9W.net
template <int N> void test(std::bitset<N>& arg);
int main()
{
std::bitset<1ull> lvalue;
test(lvalue);
}
これ、Nが推定できないのはなんで?
147:デフォルトの名無しさん
21/08/19 17:28:31.68 td+NCu9W.net
すまん、自己解決
unsigned long long Nが正解だった
148:はちみつ餃子
21/08/19 17:30:02.71 z/GAGLjl.net
>>135
> 1. 2. 3. は、initializer_list を受け取るコンストラクタでも受け取ることが可能?
はい。 可能です。
> 4. 5. は、initializer_list を受け取るコンストラクタでも受け取ることは不可能??
はい。 不可能です。
ところで >>134 で、オブジェクトを構築した上でコピーするのは 5. と述べたけど 3. もそうやな。
149:はちみつ餃子
21/08/19 17:33:59.90 z/GAGLjl.net
>>138-139
正解は size_t だよ。
size_t が具体的にどの整数型に対応するかは処理系定義なので
もちろん unsigned long long と等価なこともあるだろうけど。
150:デフォルトの名無しさん
21/08/19 17:40:36.29 9cCAU3aU.net
>>136
念のため、その「述べた」はずのルールがどの文章だったのか教えてもらえれば
ありがたい。
151:デフォルトの名無しさん
21/08/19 22:54:32.78 CH0dz2ka.net
vector<long long>を取る関数にvector<int>を渡すと、その引数はvector<long long>にキャストされる
で、vector<int>を取る関数にvector<long long>を渡すのはNG
この理解は合ってますでしょうか
152:デフォルトの名無しさん
21/08/19 23:03:24.64 /B0HDd6y.net
間違ってる
vector<long long>とvector<int>には何の関係もない
intとstringに関係がないのと同じくらい関係ない
153:デフォルトの名無しさん
21/08/20 11:13:55.26 5K/SmrCp.net
pair<int, int> は pair<long long, long long>にキャストできるけど
vectorにそういうコンストラクタはないな
154:デフォルトの名無しさん
21/08/20 12:13:09.91 ssGfr3Zr.net
>>103
VS6.0の頃は地獄だったよ
forループの変数は生キノコるわ例外出たら自動変数の破棄全部ぶっ飛ばすわでMSはクソの集大成だと確信していたわ
155:デフォルトの名無しさん
21/08/20 12:42:32.36 5K/SmrCp.net
例外処理が2系統、数え方によっては3系統あるのがね
156:デフォルトの名無しさん
21/08/20 15:19:34.50 Pb4opnB5.net
STOUT を STDOUT に空目してこそプログラマ脳
「ミロ」そっくりの缶ビール 子どもが誤飲し販売禁止に(豪) - Yahoo! JAPAN
URLリンク(article.yahoo.co.jp)
子どものみならず大人にも大人気のココア味の麦芽飲料「ミロ」は、世界中で愛されている。このほどオーストラリアの企業が、
ミロにそっくりのパッケージデザインで缶ビールを製造したことにより「子どもが間違えて飲んでしまった」という苦情が届いた。
これにより同製品の広告使用禁止が言い渡されたことを『news.com.au』などが伝えている。
問題の缶ビールは、豪ビクトリア州にある企業「Howler Brewing Company」の「Chocolate Milk Stout」というチョコレート風味の黒ビールだ。
缶のデザインは有名な麦芽飲料「ミロ」を真似たもので、お馴染みの緑色を背景に製品名や販売会社を示す文字の色やフォントまで同じデザインとなっている。
同社はこれまでにも、Instagramや炭酸飲料「スプライト」など認知度の高いロゴデザインを真似た製品を作り出している。
157:デフォルトの名無しさん
21/08/20 17:52:50.79 BMARPdQo.net
関数オブジェクトじゃなくて関数を記述するメリットってなんかある?
テンプレートは近々関数オブジェクトの方でも使えるようになるんでしょ?
158:デフォルトの名無しさん
21/08/20 19:08:22.19 n19OoAH+.net
>>149
タイプ数が少ない、くらいかね。
159:デフォルトの名無しさん
21/08/20 20:12:20.52 BMARPdQo.net
>>150
じゃあそのうち「関数はレガシーな書き方なので関数オブジェクトを使用するようにしましょう」とか言われるようになるの?
160:デフォルトの名無しさん
21/08/21 00:32:59.41 E2GGZp0E.net
>>149
複数の関数から呼ばれる関数どうすんのさ
グローバル変数や引数にいちいち入れるの?
161:デフォルトの名無しさん
21/08/21 00:37:37.24 E2GGZp0E.net
>>146
forの変数スコープは回避策あったやん
98年発売なんでもうちょっとどうにか出来たのではとも思うが
162:デフォルトの名無しさん
21/08/21 00:45:38.19 E2GGZp0E.net
あ、すまんラムダじゃなくて関数オブジェクトか
確かにタイプ数くらいしか思いつかんけど
テンプレートは既に使えるのでは?関数テンプレートに出来て関数オブジェクトに出来ないテンプレートの使い方あったっけ
163:デフォルトの名無しさん
21/08/21 10:46:43.63 +K/WXdke.net
>>148
日本でも煙草を真似したデザインのチョコレート菓子があったけど
間違って煙草食った子供が死んだとか裁判になったとか聴かないな
おそらくあったんだろうな
164:デフォルトの名無しさん
21/08/21 12:15:51.53 t0h3aTQf.net
>>154
実体化の制御かね。
関数テンプレートは使用されない限りエラーにならない。
SFINAEもそうじゃなかったっけ?
165:デフォルトの名無しさん
21/08/21 13:42:38.53 E2GGZp0E.net
クラステンプレート内の普通のoperator ()だとそうだね
operator ()がテンプレートの場合ならほぼ関数テンプレートと同じ事出来るとは思うけど
文法上、明示的にテンプレート引数指定する際、関数と共通の書き方には出来ないな・・
166:デフォルトの名無しさん
21/08/21 20:47:50.56 7GAoG1Iq.net
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています
Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます
Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ
なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?
Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
URLリンク(nim-lang.github.io)
Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ
ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる
「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
167:デフォルトの名無しさん
21/08/21 22:35:53.53 o/sUihIV.net
質問です。
std::array ary = { 1, 2 };
↑の{}で初期化すると、
要素数を自動推論できるようにするにはどう実装すればいいんでしょう?
168:デフォルトの名無しさん
21/08/21 22:55:48.18 +FOhqLVw.net
推論補助だと思う
URLリンク(cpprefjp.github.io)
169:デフォルトの名無しさん
21/08/22 01:17:33.04 maGRuunL.net
>>155
食ったところで飲みこまずにペッペッて吐き出すだろ
170:デフォルトの名無しさん
21/08/22 04:31:26.04 Roj0wExz.net
g++ -std=c++17
171:デフォルトの名無しさん
21/08/22 12:59:29.57 0Cz6ueFz.net
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています
Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます
Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ
なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?
Nimの実験的特徴 バージョン1.5.1
URLリンク(nim-lang.github.io)
第二プログラミング言語として Rust はオススメしません Nim をやるのです
URLリンク(wolfbash.hateblo.jp)
Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる
「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
172:デフォルトの名無しさん
21/08/22 18:45:30.76 gNvESTNy.net
std::chrono::time_point::time_since_epoch()が返すエポックタイムの原点はいつですか?
もし具体的に規定されていないとしても、
ミリ秒パートが0であることは保証されていますか?
173:デフォルトの名無しさん
21/08/22 19:20:25.99 gNvESTNy.net
ある意味自己解決しますたorz
URLリンク(cpprefjp.github.io)
>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が保証されているのかどうかがはっきりしませんぬ、
174:デフォルトの名無しさん
21/08/22 19:28:39.82 VeL/IzCV.net
生年月日をUNIX時間で表現できないオッサンはこのスレにどのくらいいるの?
175:デフォルトの名無しさん
21/08/22 21:27:04.43 gNvESTNy.net
生年月日ならミリ秒まで言える必要は無いが
ログの時刻を極力正確に(WindowsのGetLocalTime()と同じ時刻で)記録したいのでつ∀`;)
176:デフォルトの名無しさん
21/08/23 04:13:32.16 F733kpwr.net
1970年以前生まれの50代以上のオッサン
177:デフォルトの名無しさん
21/08/23 16:50:49.24 Rrt4HCug.net
B.C.
A.D.
B.E.
178:デフォルトの名無しさん
21/08/23 22:05:26.78 xWEF4I0D.net
B.E.って何ですか
UCとSEとかRCとかじゃないの
179:デフォルトの名無しさん
21/08/23 22:52:48.51 xWEF4I0D.net
ていうかsystem_clockはC++17以前からtime_tと相互変換できるのに(system_clock::from_time_t()、system_clock::to_time_t())、
エポックがどの時間を指しているかは未規定とかおかしくね↑?
180:デフォルトの名無しさん
21/08/23 23:20:43.35 AuTnTHJo.net
別におかしくない
変換時にエポックの差の分ずらせばいいだけだろ
181:デフォルトの名無しさん
21/08/23 23:31:13.03 sPTJEjpv.net
そんなことよりなんでtime_tは符号なしなん?
64bit拡張するときに符号ありにしとけば166みたいな煽りを受けずにすんだのに
182:デフォルトの名無しさん
21/08/24 00:03:00.26 24MephMZ.net
符号なし使うのは総じてセンスないよね
183:デフォルトの名無しさん
21/08/24 07:17:43.25 NEyNeI43.net
符号付き整数はwrap aroundしたときの挙動が処理系依存か何かだったはず……
ハードウェア例外を生じるやつがあるらしい
184:デフォルトの名無しさん
21/08/24 07:52:57.66 4Ohx7QuI.net
>>173
純粋にプログラミングスキルの話と受け取った>>167に謝れ
185:デフォルトの名無しさん
21/08/24 08:21:39.19 NErefsYh.net
>>175
オーバーフローしたときにラップアラウンドさせる使い方が数値計算としては特殊だからねぇ。
186:デフォルトの名無しさん
21/08/24 15:27:02.85 WZMj7UxV.net
>>167
ntp使え
187:デフォルトの名無しさん
21/08/24 17:48:36.53 DexxKsi1.net
>>174
time_tを符号なしにしたやつはアフォだと思うが
それをもって符号なしを使うやつ全員が例外なくアフォというのは
早まった一般化という誤謬だ
188:デフォルトの名無しさん
21/08/24 22:08:27.39 OPjw/0cg.net
>>160
なるほど!ありがとうございます
189:167
21/08/25 00:50:22.37 MXKFEwSS.net
そういやーまだご存命の方もいらっしゃるんでしたね
>>179
符号付きにしたら2038年問題が2004年問題になってた
人類は間に合わなかった
190:デフォルトの名無しさん
21/08/25 07:34:23.44 VHSVWUHA.net
30年も猶予があったのにな
191:デフォルトの名無しさん
21/08/25 10:43:26.33 M5WZn8fZ.net
ヒトラー「2036年、人類と云われる者は居なくなっている」
192:デフォルトの名無しさん
21/08/26 16:49:35.75 WPRv8+9f.net
関東大震災だって100年も猶予があっても何もしない國ですし
193:デフォルトの名無しさん
21/08/26 21:09:02.54 xnTAPql6.net
色々やってるぞ
庶民を助ける政策をやってないだけで
194:デフォルトの名無しさん
21/08/27 17:50:19.96 BFKMFKNN.net
URLリンク(twitter.com)
最近はC++の発表資料を公開すると「Rustでいいじゃん」というコメントがたくさんつくのか…。
Rustへの言及とか一文字も書いて�
195:ネいのに。 普及活動だと思うけど、さすがに嫌がらせチックに見える。 https://twitter.com/moriyoshit/status/1430795812552863744 C++の件に限らず、旧来からある言語の長所短所を理解せずに、 表面的に新言語を推す発言を見ると、 果たして当人は新しい言語の方も理解できているのだろうか、 という疑念をもってしまう... (deleted an unsolicited ad)
196:デフォルトの名無しさん
21/08/27 19:27:10.45 wbifwX7a.net
>>186
Rustはいらんけど、制約を強化してコンパイルエラーを増やしたc++--は欲しいなぁ。
スライシングはすべてコンパイルエラー、ダウンキャストはメンバー関数とフレンド関数のみ使用可能
new deleteはメンバー関数とフレンド関数のみ使用可能(global operator new/deleteは廃止)
といったメモリ周りの制約強化は欲しい。
197:デフォルトの名無しさん
21/08/28 14:03:18.97 dCOU+NEa.net
Rustを使って欲しいなら、そう言えばいいのに
人のすることを小馬鹿にするような態度で来るから敵と見られるんだよ
コミュ障にも程がある
198:デフォルトの名無しさん
21/08/28 18:35:03.00 iJLWqDs6.net
インテルコンパイラの-fastには-staticが含まれてるけど、なんでスタティックリンクは速いの?
199:デフォルトの名無しさん
21/08/28 18:49:01.71 Ovc44+68.net
ライブラリ使うときのロードの手間がなくなるからね
200:はちみつ餃子
21/08/28 23:41:54.59 V8MBAFoh.net
スタティックリンクにすると最適化の情報が増えるというのもあると思う。
C/C++ では翻訳単位ごとにコンパイルしてからリンクするという工程を踏むから、
コンパイル時には他の翻訳単位の情報を知らず、他の翻訳単位の情報を利用した
最適化が出来なかった。
今では LTO が当たり前になって、リンク時にあらためてコンパイラに戻して最適化
させる仕組みがあるんだけど、バイナリ自体が別物だとその仕組みを使えない。
201:デフォルトの名無しさん
21/08/29 13:13:16.45 h29TClHM.net
std::threadってスタックサイズを指定できないってマジ?
仮想メモリを使えない組み込み用途だとどうすんじゃ……
202:デフォルトの名無しさん
21/08/29 13:20:14.34 kSqJuAzn.net
native_handle()関数で環境に応じたスレッドハンドル(linuxならpthread)を取得できるから、スタックサイズを設定するところだけ環境ごとに用意して切り替えればいいよ
203:デフォルトの名無しさん
21/08/29 13:28:41.66 h29TClHM.net
Windowsみたいにスレッドハンドルを生成したときはスタックサイズ指定済のとき、みたいな
組み込み用OSがあったらどうすんじゃ……
204:デフォルトの名無しさん
21/08/29 13:46:08.60 h29TClHM.net
とわいえμITRONのcre_tsk()は
>cre_tsk でスタック領域を明示しない場合のタスクのスタックや割込みハンドラ/割込みサー
>ビスルーチンのスタックは、OS が用意する「スタック用メモリ」から割り当てられます。
>スタック用メモリのサイズを定義する STKMSZ の標準値は 0 で、この場合、main 関数が使って
>いる処理系のデフォルトのスタック領域(スタックセクション)を、OS のスタック用メモリとし
>ます。この場合の実際のスタックサイズは、リンカでのセクション設定とスタートアップルー
>チンでの初期スタックポインタ値で決まります。
みたいなことが書いてある
C/C++界隈はみんな頭おかしい……
205:デフォルトの名無しさん
21/08/29 13:55:46.65 h29TClHM.net
ゴメ勘違いcre_tsk()(IDがOSが自動割り当てのやつはacre_tsk())は
第2引数に与えるT_CTSK構造体でタスクごとにスタックサイズを指定できたわ;;;
なんでstd::threadではできないんじゃ……
206:デフォルトの名無しさん
21/08/29 14:18:20.52 vSvS+48a.net
コイツ前スレでも連レスしてたムーブ全く理解してないバカだよね?
NGしたいからトリップつけてください
207:デフォルトの名無しさん
21/08/29 14:25:04.60 x8xWTwL3.net
>>192
標準じゃ無理でしょ
全てのスレッドを変えたいならリンカのオプションとかで指摘できる環境もあるけど
boost::thread使って
boost::thread::thread_attribute::set_stack_size()
で設定するがよろし
>>193
native_handle()関数でハンドル取れると言う事はスレッド開始してる
開始済みスレッドのスタックサイズを変えられる環境って聞いたことない
208:デフォルトの名無しさん
21/08/29 14:30:52.45 AWkeWwKB.net
>>196
ほんと組み込み屋は馬鹿だな
209:デフォルトの名無しさん
21/08/29 16:52:45.64 h29TClHM.net
>>197
完璧な理解をサンプルコード付きで示したやろうが;;;
論点はなんでムーブに置き換えられるケース(明示的にstd::move()したら明らかに効率的なコードになる
において最適化でムーブにならないのか?なのだが高度すぎるのか文盲か故に>>197が付いてこれていないだけ
>>197はブーメラン
210:デフォルトの名無しさん
21/08/29 16:54:56.72 h29TClHM.net
もっとも天才の漏れは答えにたどりついたがな
ムーブコンの実装がコピコンの実装より効率的である保証が無い以上、
置き換え可能なケースであってもコピコンからムーブコンへの機械的置き換えは正当化されない
211:デフォルトの名無しさん
21/08/30 14:34:41.72 jKIf8Vzq.net
天才のインフレ
212:デフォルトの名無しさん
21/09/01 16:43:13.53 Uxp79PtR.net
Rustみたいにコンパイル時にいちいち参照のチェックするんじゃなくて
C++で最終的に完成したバイナリに対してメモリサニタイザーを一回動かす
ってのではだめな理由ある?
213:デフォルトの名無しさん
21/09/01 20:16:57.41 dG55Jwur.net
>>203 動かしたフロー以外のフローについて不安が残るし、サニタイザーの精度がどれほどかという問題もありそう。
214:はちみつ餃子
21/09/01 23:35:30.93 3mB0e8fG.net
>>203
ものによって賢さの程度が違うから一概には言えないけど
基本的にはサニタイザは実際に起こった問題を検出するものなので
入力値次第で問題が有ったりなかったりするようなケースを検出できなかったり、
言語仕様上で未定義なものがたまたま問題ないアクセスになってしまうようなケースも
検出できないかもしれない。
問題が起こっていて再現条件が分かっているときに検証するツール、つまりデバッグ用のツール
としてはサニタイザは有用だし、ごく基本的なテストツールとしても使えるけど、
Rust のライフタイムチェックほど網羅的ではない。
215:デフォルトの名無しさん
21/09/02 05:18:49.53 90/tsZBA.net
一言でまとめると動的試験てことだな
216:デフォルトの名無しさん
21/09/03 09:16:16.79 6YHhlfzl.net
MozillaのFireFoxの場合、わざとクラッカーがセキュリティーホールを見つけ出して
そこを付いてくるから、普段の実行テストでは一度も発見できなかった
メモリーバグが問題になるが、普通のアプリの場合、ユーザーがわざとバグを
付くことはないから、そのようなホールはあまり関係ないと思う。
テスト駆動開発とかアジャイル開発とかも、普段使いで問題が無いかをテスト
することで大部分のバグが無い状態で開発していこうとする考え方。
それでもほとんどのメモリーバグは無い状態になっている。
メモリーバグがあると、普段使い的なテストをしても発覚することが多いから。
昔から言われているメモリーバグの問題点は、再現性が有る場合でも、バグが
ある行とそれが発覚した時期とがずれていることがあるから。
デバッグモードでコンパイラが自動的にチェックするコードを入れていれば、
それはなくなるはず。
Rustはその意味で、経験法則的にFireFoxみたいな特殊なものでは意味があるが
一般アプリでは余り意味が無い。ブラウザの特殊性は、世界中のクラッカーが
セキュリティーホールを探してわざとその穴を付いてくること。一般アプリでは
それがないので、隠れたバグは隠れたままになっていることが多くて、
テストで出てこなかったバグは実際問題的には余り問題となら無い事が多い。
217:デフォルトの名無しさん
21/09/03 09:22:40.61 6YHhlfzl.net
>>207
例えば、ダングリングポインタ(Use After Free)は、ptrがどこかでまだ使用中なのに、
free(ptr)としてしまうこと。しかし、そのfree()をした時点ではアプリはダウン
しないし、ptrに対して読み書きした段階でもまだ発覚せず、ptrが指すメモリー
アドレスを別の目的で使用してしまって、お互いに読み書きがある種の干渉を
起こしてしまって、データがめちゃくちゃになり、それによってどこかで不具合
が生じた時点で発覚する。
なので、バグの根本原因であるfree(ptr)を実行した行がどこかを探し出しにくいと
される。
しかし、このバグの場所とバグが起きた場所のずれは、デバッグビルド時に速度を
落としてチェックすれば本当は防げるはず。
218:デフォルトの名無しさん
21/09/03 09:24:49.55 6YHhlfzl.net
>>208
チェックと言っても人間が手で書く必要は無く、コンパイラがチェックコードを
自動生成できるはず。
219:デフォルトの名無しさん
21/09/03 10:00:52.25 yL2Kwy6+.net
根拠のない決めつけばかりで気持ち悪い。
220:デフォルトの名無しさん
21/09/03 10:16:16.17 lmzB7IZ6.net
>>207
世の中にはテスターという職種の人がいてだな
221:デフォルトの名無しさん
21/09/03 10:46:20.27 yJUEU9nq.net
>>207
任意のファイルを読むアプリはファイルのパーサーの脆弱性をついてユーザ権限でコードを実行される可能性がある
どちらかと言えばアプリよりサーバとしてアクセスを受け付けているプログラムの脆弱性をつかれて攻撃コードの実行を許してしまうことが多い
さらに上のような場合でも、アプリやサーバのプログラム自体に脆弱性があるのではなく、使用しているOSのAPI側の実装の脆弱性をつかれる可能性がある
こういうアプリやサーバやOSのコードの脆弱性にMSやGoogleは悩まされている
222:デフォルトの名無しさん
21/09/03 11:00:44.84 yJUEU9nq.net
Valgrind と言う動的解析ツールを調べて見るといい
うちはC++のプログラムは基本これを通すことになってる
商用ならもっといいツールもあるかも知れない
そういうのを利用しても充分でないから静的解析するRustが注目されている
223:デフォルトの名無しさん
21/09/03 11:27:43.59 6Xh4x7Us.net
商用の静的解析ツール使ってると、正直メモリ関係のバグなんてありえないと思えるくらいいろいろ見つけてくれるよ
224:デフォルトの名無しさん
21/09/03 11:44:23.16 9y+1HwQb.net
コンパイル時間に糸目を付けなければ、静的解析はもっと出来る。
225:デフォルトの名無しさん
21/09/03 11:47:10.63 lmzB7IZ6.net
> メモリ関係のバグなんてありえないと思える
lintの副作用がモロに出てるなw
226:デフォルトの名無しさん
21/09/03 15:20:21.54 MvVz2a9W.net
言うまでもない事だが完璧なメモリチェッカーは存在し得ない
停止問題と同値だからな
227:デフォルトの名無しさん
21/09/03 15:50:45.07 6Xh4x7Us.net
完璧無理っておまえの毛髪の量がプログラム停止に与える影響が読めないとかそういう話だろ?
限定的な範囲で正しけりゃ十分だよ
228:デフォルトの名無しさん
21/09/03 16:54:40.55 lmzB7IZ6.net
ゴールポストは動かしちゃダメだよ
229:デフォルトの名無しさん
21/09/03 17:38:29.50 6Xh4x7Us.net
無限遠のゴールを設定するのはアホだべ
230:デフォルトの名無しさん
21/09/03 17:51:18.36 xmwLNRYX.net
スクリプト言語も普通にクラッシュ
231:することあるから
232:デフォルトの名無しさん
21/09/03 17:52:37.20 xmwLNRYX.net
OSのコアダンプ出力とリブートに救われる手のひらの孫悟空
233:デフォルトの名無しさん
21/09/03 18:28:35.67 iCLUv6gH.net
rustでもメモリアロケーション失敗するとパニックになる、てリーナスが突っ込んでいたろ。
c++の場合はどうなんのかな。
234:デフォルトの名無しさん
21/09/03 20:13:28.89 USKNPKWa.net
CoverityとVectorCASTは使ったことあるけど検知レベル最高にしても見逃すリークや二重フリー, ダングリングはそれなりにある (そもそもコードの構造が悪い場合も多いが)
検知レベル上げ過ぎると逆にFalse Positiveも増えるし
235:デフォルトの名無しさん
21/09/04 07:59:49.00 kFVsNuY8.net
無限遠のゴールポストを動かすって
こいつ文系か?
236:デフォルトの名無しさん
21/09/04 08:08:40.61 N/QuNfWR.net
まあ見つからないのは間違いなく書き方が悪いよな
237:デフォルトの名無しさん
21/09/04 19:04:52.86 7+pvijvQ.net
∞の概念が理解できるならそいつはもう文系ではあるまい
238:デフォルトの名無しさん
21/09/04 19:11:19.50 ICKB9ww0.net
ε-N論法
239:デフォルトの名無しさん
21/09/04 22:28:42.31 mLTAxmCN.net
超久しぶりにC++の参考書 買った。
いまってC++20までいってるんでしょ?
時代遅れもいいところだから勉強しようと思ってw
ただ読む気がおきない。
「pythonでいいか」って思いが・・・ww
240:ハノン
21/09/04 23:52:57.58 .net
>>223
URLリンク(tabesugi.net)
C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。
C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら
Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、
それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる:
- うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が
安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、
もはや笑えるレベルを超えている)
- 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに
効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の
コードがその素晴らしいオブジェクトモデルに依存していて、直すためには
アプリ全体を書き直さなきゃなんない。
言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
241:デフォルトの名無しさん
21/09/05 00:05:05.82 yIsM5ONG.net
バカが使いこなせる言語ではないからな
242:デフォルトの名無しさん
21/09/05 00:27:52.33 eMsTCIh+.net
linusに言われると返す言葉もないが、その後の文脈にある
『もし C++ で書かれた VCS が欲しいのなら、Monotone を見てみるといい。
ほんとに。連中は「本物のデータベース」を使っているよ。
「素敵なオブジェクト指向ライブラリ」も使ってる。「ナイスな C++ の抽象化」も
使ってる。そして率直なことろ、一部の情報系の人間が喜びそうな
これらすべての設計上の決定のために、できてきた結果はゲロゲロで
保守不可能なカオスだ。
でもあんたはきっと git よりも気に入るだろう。保証するよ。』
な感じでC++を気に入って、夢を見ていたいんだろうね。
243:デフォルトの名無しさん
21/09/05 00:53:47.56 66hkUr5p.net
「オレはC++を使いこなせている」と思い込む素人を生温かく見守るスレはここですね
244:デフォルトの名無しさん
21/09/05 01:42:41.34 eMsTCIh+.net
>>223
URLリンク(lkml.org)
コレのことだと思うけど、どういうケースを想定しているの?
245:デフォルトの名無しさん
21/09/05 06:00:11.76 fsFc+8nQ.net
昔、バカでも使える言語でプログラマ人口増やしましょうてなことやってたな
BASICじゃないぞ、あれは初心者用で、バカ用じゃない
計算を数式で書くのは理系だけだから
英文で書けるようにして文系でも使えるようにしようという試みがあった
で、狙いどおり本当にバカプログラマを量産できた
それでいいことあったか?
C++はアレの逆をいっているわけだ
246:デフォルトの名無しさん
21/09/05 06:45:24.37 ClPlKiJv.net
Qtを使ってるから、C++一択だな。
247:デフォルトの名無しさん
21/09/05 12:24:02.01 cBh+EO/A.net
namespaceと多態性はCだけではやりにくい
248:デフォルトの名無しさん
21/09/05 12:47:17.91 0Cj96kG7.net
静的なディスパッチの充実がCに必要なのではないか
249:デフォルトの名無しさん
21/09/05 14:17:57.22 cBh+EO/A.net
>>234
Linuxはモノリシックカーネルなので動的メモリ確保を伴うような軟弱な
モジュールもカーネルのうちに入ってしまっているからメモリ不足ぐらいで
パニくられると手の打ちようがないから困るという話なんじゃないの(適当
OSはリソース管理を放り投げて停止することは許されないから
伝統的なやり方では起動時に非常用のメモリブロックをアロケートしておいて
メモリが枯渇したら非常用のメモリブロックを使うみたいな手段がとられる(と思う
がパニックされたらそこまで行きつかない
※ 個人の感想です
250:デフォルトの名無しさん
21/09/05 14:38:48.42 eMsTCIh+.net
>>239
具体的に何かのケースを想定して言ってるわけじゃないのか。
ぶっちゃけOSをC++で書くならカーネルでnew/malloc/mmapとか使う実装はしないだろうし、処理系が使うランタイムにも依存するけど基本その辺はカスタマイズできるようになってると思う。
rustでもそんな感じで処理系次第って話だと思う。
251:デフォルトの名無しさん
21/09/05 14:44:00.68 LgQhIBwq.net
>>230
馬鹿除けのために C++ じゃなくてあえて C を使うのは良いね
URLリンク(www.youtube.com)
252:ハノン
21/09/05 17:28:18.83 .net
>>241
>>230 の類の話は昔からいわれていたもので、これも有名ですね
URLリンク(www.kh.rim.or.jp)
インタビューア(以下「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」という言葉は、プロジェクト管理者の胸に刺さったナイフをグリグリ回すためだけに発明されたんじゃないかと思うな。
253:デフォルトの名無しさん
21/09/05 17:47:40.38 eWmYSwWp.net
>>242
とっくに否定済みのデマを貼るな
URLリンク(www.stroustrup.com)
254:デフォルトの名無しさん
21/09/05 18:05:24.16 Lkm6/1Sl.net
URLリンク(ideone.com)
これが、シングルトンとして抜けている理由を教えて下し亜。
コードのストックにするために書いたのですが、そもそもシングルトンってなんでしたっけ?
255:ハノン
21/09/05 18:06:53.16 .net
>>243
誰が書いたかなどどうでもよく、その内容についてはどう思いますか?
256:はちみつ餃子
21/09/05 18:10:26.36 vh6AiUnJ.net
>>244
関数テンプレートが結果的に引数の数が違う関数として展開される。
引数の数の違いが結果の違い。
257:デフォルトの名無しさん
21/09/05 18:23:29.28 cBh+EO/A.net
>static std::shared_ptr<T> O = std::make_shared<T>(A...);
の部分って、Singleton()の初回呼び出しが複数のスレッドから同時に起こってもき
ちんと排他してくれるんでした
っけ
また排他してくれるとしても最速(そのアーキテクチャ(マルチコアかもしれない)で最も適切)
であることを気体していいんでしたっけ……
つまり生成に成功した後は排他不要なわけで、無駄にロックを取りに行きたくない……
258:デフォルトの名無しさん
21/09/05 18:24:18.83 yIsM5ONG.net
>>242
おまえホント頭悪いな
259:デフォルトの名無しさん
21/09/05 18:27:31.03 cBh+EO/A.net
みたいな配慮がシングルトンにしたとたんに必要になる
メインの処理が始まる前に普通の初期化関数呼び出しでOを生成したらそれで済むのに、、、
260:デフォルトの名無しさん
21/09/05 18:28:54.12 0Cj96kG7.net
>>247
呼ばれたところで最後の奴が勝てば問題ないのでは
261:デフォルトの名無しさん
21/09/05 18:47:53.68 cBh+EO/A.net
>>250
ある
>static std::shared_ptr<T> O = std::make_shared<T>(A...);
全体が排他されないとしたら、Oの生成関数(初期化式「O=」の右辺)が複数回、
それも同期的に繰り返し呼ばれるのではなく、非同期的に再入される形で呼ばれかねない
生成関数の中でリソース確保するとしたら先の呼び出しで確保したリソースの
ハンドルがdunglingにならないように配慮が必要になる
非同期的再入ということは、Oが生成→破棄→生成→破棄、にならず、
生成→生成→破棄→破棄になりかねないから、デストラクタをちゃんと書いたらリークしないとか
そういう認識で当たったらバグる
問題山積や
メインの処理が始まる前に普通の初期化関数呼び出しでOを生成したらそれで済むのに、、、
262:デフォルトの名無しさん
21/09/05 18:50:05.34 nyuo1Vq1.net
>>245
お前の質問なんかどうでもいいからデマを貼るな
263:デフォルトの名無しさん
21/09/05 19:08:04.86 UYU4AxET.net
>>247 URLリンク(timsong-cpp.github.io)
264:デフォルトの名無しさん
21/09/05 19:10:36.36 2jP3+tuQ.net
>>246を踏まえるとこんな感じか
関数テンプレートだけで済ます方法はあるのかな?
URLリンク(ideone.com)
265:ハノン
21/09/05 21:38:19.52 .net
>>248
はい、頭も性格も悪いと思います、しかし >>242 の中のどういうところが悪いとお考えになったのか教えていただくと嬉しいです!!
266:デフォルトの名無しさん
21/09/05 22:21:15.62 TAzC3d8r.net
>>255
そもそも、C++の生みの親で、それに関する書籍を出してその中でC++を
良い言語と自負して(それ以上の言語が出来ないというような主張も幾度もして)
解説し、まだ推進しようとしている人が、C++を徹底的に卑下するかどうかを
疑問に思ってないことも頭が悪いと思われる原因の一つ。
267:デフォルトの名無しさん
21/09/05 22:29:24.50 15q7gB85.net
実際、C++は、特に初期の頃はCより全面的に優れていると誰でも思えるような
物であって、ちゃんと世界的に認められて広まっていたのに、その部分まで
全否定するようなことをインタビューで答えるわけがない。
その後に追加されて機能は人により評価が分かれて全面的に優れているとは
思えるようなものではなくなっていた。
だから、C++11は、好きな人も居れば嫌いな人も居る。C++98より全面的に
優れていると言えるかどうかは人により評価が分かれるので、好みにより
文壇の様なものが生じている。
268:デフォルトの名無しさん
21/09/05 22:30:49.67 cBh+EO/A.net
>>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の糞コードは直しても仕方が無い
269:デフォルトの名無しさん
21/09/05 22:36:38.84 66hkUr5p.net
メモリを自動解放するfinally機能さえあればCでも大丈夫とは思う
270:デフォルトの名無しさん
21/09/05 22:50:33.49 yIsM5ONG.net
URLリンク(imgur.com)
271:デフォルトの名無しさん
21/09/05 22:52:01.95 cBh+EO/A.net
とオモタがcontrol enters the declaration concurrently のときは初期化のcompletionまでshall waitで、
ただしrecursivelyだとイカン(未定義動作)と書いてあるのか……
つまりSingleton()関数内の初期化式「O=」の右辺がSingleton()を呼び出す場合か
まあ確かにWindousみたいに特殊な仕様のクリティカルセクションでもない限りデッドロックしそう
272:デフォルトの名無しさん
21/09/05 23:09:38.17 eTOvJaZ9.net
>>251
そうか
まあ仕様的にはスレッドセーフだわ
関係ないけど参照したグローバル変数に値が入っとらんで困ったことがあった
273:デフォルトの名無しさん
21/09/06 00:30:26.82 62gS+LUW.net
>>258
なんかスレッド安全性の問題にしたいようだけど、
そもそも>>244の第一の問題点は2番目のSingletonの呼び出しだけ別のオブジェクトを指してしまっている点だよ
stdoutの2行目だけ0になってるだろ?
その原因の説明が>>246というわけだ
すべての関数・クラスを最初からスレッドセーフな設計にしないといけないわけじゃない
274:デフォルトの名無しさん
21/09/06 04:31:29.75 HRRCwLhx.net
>>263
>>258じゃないし、よく分からないけど
URLリンク(ideone.com)
ではダメなの?
275:デフォルトの名無しさん
21/09/06 04:31:59.38 G2BRvA3h.net
ビャーネ・ストロヴストルップその人のインタビューだとは私も考えてませんよ、これはブラックジョークというべきでしょう、まあC++er が気を悪くする理由は理解できますが
それに私も GNU Multi-Precision Library を使うときはC++のラッパの方を使います。C インターフェースの方は使い難くって使い難くって、これはもう罰ゲームですね‥‥
だから演算子のオーバーロードも控えめに使えば有用という立場です、紹介することと賛成することとは別だと思います
スレリンク(tech板:84番)
276:ハノン
21/09/06 04:40:03.34 .net
テステス
277:デフォルトの名無しさん
21/09/06 07:17:56.24 7SReNX2q.net
>>263
スレッドセーフでなくともよいシングルトンとか
>メインの処理が始まる前に普通の初期化関数呼び出しでOを生成したらそれで済むのに、、、
で良くね?
>>264
>>263じゃないが非アトミックな操作(初回か否かチェックして初回なら初期化する)
であることが明示される分その書き方の方がマシ
必要なら排他する、不要ならしないという判断ができるから
>すべての関数・クラスを最初からスレッドセーフな設計にしないといけないわけじゃない (>>263)
という願いも叶うYO!
278:デフォルトの名無しさん
21/09/06 08:08:09.17 62gS+LUW.net
>>264
確かに普通こんな感じだな
テンプレート別々にすることだけで頭止まってた
>>267
そうだな
書いてはみたがC++でシングルトン使う意味は無いと思う
あれはグローバル変数の無いJavaでグローバル変数を使うためのハックだとか聞いたし
じゃあもう普通にグローバル変数使えばよくね、と