22/05/21 21:23:29 kYXfaM+5.net
前スレ
C++相談室 part160
スレリンク(tech板)
2:はちみつ餃子 ◆8X2XSCHEME
22/05/21 21:24:45 JD6rd3hb.net
>>1
乙
3:デフォルトの名無しさん
22/05/21 21:44:08.96 G0xPeqqL.net
C(ちんちん)+(ぷら)+(ぷら)
4:デフォルトの名無しさん
22/05/22 00:57:58.97 SQ8NOhuX.net
おいおいまだ続けんのかよ!
5:デフォルトの名無しさん
22/05/22 03:20:20.13 sZoQvYay.net
ODRってC++処理系の仕様?
処理系はODRの記述を含まない仕様だけあればその通り作ったら
合理的な手間で検知可能な範囲のODR違反コードをエラーにする
ふるまいになるというのが当然で、つまりODRは仕様の結果であってODRを仕様に含めるのは論理的に冗長という印象
どっちかというとODRは正しく動くためにプログラマーが従わねばならないルール、という認識やったわ、
この観点ではinlineがODRの例外というのは例外も糞もなくてそんなプログラムは書いたらあかんからODR違反
コンパイラが合理的な手間でそれを検出できなかったり、それがあってもコードの動きに破綻が無いこととは関係無い
的な、
6:デフォルトの名無しさん
22/05/22 09:08:20 1lbS1FjX.net
ちんちん!シュッ!シュッ!シュッ!
7:はちみつ餃子 ◆8X2XSCHEME
22/05/22 09:12:58 9X/55aF0.net
>>5
One definition rule は仕様に項目がある。
URLリンク(timsong-cpp.github.io)
インライン関数は同じアドレスを持つ (事実上統合することの要求) というのも仕様にある動作。
URLリンク(timsong-cpp.github.io)
no diagnostic と書いてある部分については (可能であれば処理系も検出するけど) どちらかというとユーザに対する要求というニュアンスはあるかも。
8:デフォルトの名無しさん
22/05/22 19:47:14.24 WUnKKX5R.net
有料無料関係なしで最高のIDEってなに?
9:ハノン
22/05/22 19:52:14.59 rj0GqvkC.net
>>7
>インライン関数は同じアドレスを持つ (事実上統合することの要求)
それはもうインラインではないですね…
そうではなくて、extern なインライン関数をリンクする際には、同一のアドレスであるべき、という意味でしかないでしょう、つまり私の実装案
スレリンク(tech板:996番)
>実装的には inline のついた関数定義が外部にリンクされる可能性があれば、すなわち extern な iniline 関数があれば、リンクのためのコード体を、各所に inline に展開されるコード体とは別に(こっそり)用意しておく、見たいな感じで十分に実装可能ですね
を支持する内容であり、extern な inline 関数において定義を持たないコンパイル単位にでは inline の指示があっても inline しなくてもいいといっているに等しいですね‥‥
7.1.2.4
(略)外部リンクをもつインライン関数は、すべての翻訳単位で同じアドレスを持たなければならない。
外部インライン関数内の静的ローカル変数は、常に同じオブジェクトを参照する。
externインライン関数の本体内の文字列リテラルは、異なる翻訳単位で同じオブジェクトを指す。
10:はちみつ餃子
22/05/22 20:04:27.44 9X/55aF0.net
>>9
見かけ上は同一に見える (アドレスを取らずに呼び出すときに限ってインライン化できる) ことを保証するという意味だよ。
インライン化できる条件を整えておきたいということと矛盾しない。
11:デフォルトの名無しさん
22/05/22 20:07:42.95 ZvvsRMN9.net
>>8
俺が通ってる外国のコミュニティでその質問が出ると毎回Visual StudioでFA?って回答が帰ってくる
ネタで言ってるのか本気で言ってるのかは知らない
12:はちみつ餃子
22/05/22 20:15:45.42 9X/55aF0.net
>>8
人によって使いやすさって違うからアドオンとかドキュメントの量とかが重要になってくるんだよ。
いくら潜在的に良い出来栄えであってもちょっとしたカスタムを全部自分で書かなきゃならないようでは面倒くさすぎる。
どこをどういじればいいのかいちいちソースコードを見ないとわからないのではダルい。
なんだかんだ不満があってもユーザ人口の多いものは全体としては良い選択になりがち。 物量重要。
13:デフォルトの名無しさん
22/05/22 20:19:45.26 sBUJB3wj.net
vs以外だとIDEっていうよりエディタとコマンドでやってるイメージ
ボーランドとか死にかけだしなあ
14:はちみつ餃子 ◆8X2XSCHEME
22/05/22 20:25:35 9X/55aF0.net
>>13
LSP が現れたせいで処理系と統合された開発環境の価値が薄れた感がある。
15:デフォルトの名無しさん
22/05/22 20:37:44 WUnKKX5R.net
>>11
ググった感じだと海外では無料版が多いように感じたw
>>12
日本も海外もEclipseとかが人気みたいなのでEclipseから使っていきます
レスサンクスです
16:デフォルトの名無しさん
22/05/22 20:39:19 rj0GqvkC.net
>>10
つまり >>9 に同意する、ってことでしょう?
17:はちみつ餃子
22/05/22 20:50:26.55 9X/55aF0.net
>>16
>>9 の
> 定義を持たないコンパイル単位にでは inline の指示があっても inline しなくてもいいといっているに等しい
が結論だとしたらそう。 同意する。
むしろ定義を持つ翻訳単位でもインライン化しなくていい。
だから残る inline の意味は ODR の例外として機能するって部分になるわけ。
18:デフォルトの名無しさん
22/05/22 22:42:48.81 rj0GqvkC.net
>>17
なるほど。私の元の主張に反するのですが、規格上はそのように誘導されてしまうのですね…‥(呆然)
19:デフォルトの名無しさん
22/05/22 22:53:10.16 j/hmX3ds.net
www.youtube.com/watch?v=uaUmAUMvs2o
20:デフォルトの名無しさん
22/05/28 13:34:18 kIghR+Cp.net
C++入門書でオススメがあったら教えてください
21:デフォルトの名無しさん
22/05/28 13:51:21.59 y4EmUyIA.net
昔からC++を使ってる人が多いから最近の入門書なんて誰も知らん
URLリンク(cppmap.github.io)
22:デフォルトの名無しさん
22/05/28 14:07:22.40 kIghR+Cp.net
>>21
多謝多謝!
23:デフォルトの名無しさん
22/05/28 15:19:08.43 72vE6z5l.net
禿本の5、来ないね・・・
24:はちみつ餃子
22/05/28 15:44:53.73 IqCM7SI4.net
C++ はそれなりに歴史が長いから仕様も変わってるし思想や習慣の変化もある。
上述で私は「inline は ODR の例外の意味!」と主張したけどさ、 D&E を読むと (inline 指定導入初期の判断としては)
「コンパイラによるインライン化の判断がザコなので指定できるようにした」
という意味のことを書いてあって、大元はやっぱりインライン化の指定なんだよね……。
色んな事情が絡むし、単純に C++ が巨大なのでどうせ一冊でちゃんとした理解にはならないと思う。
適当なやつをどれから読み始めてもいいんじゃないかね。
まあ、あまり古い奴は避けた方がよいだろうというのが最低限の基準かな。
25:デフォルトの名無しさん
22/05/28 16:12:25.28 m/lYnlWz.net
C 言語でなぜかC++のコメント行がいつの間にか許されている不思議
26:デフォルトの名無しさん
22/05/28 16:25:05.55 gMoQJtfo.net
なぜかってC99でサポートされたからではなくて?
27:デフォルトの名無しさん
22/05/28 17:21:17.26 DrsyU/Zk.net
違うでしょうなあ。
28:デフォルトの名無しさん
22/05/28 19:31:09.65 72vE6z5l.net
> いつの間に
情弱からはこう見えるようだな
29:ハノン
22/05/28 20:36:31.97 HcUv+Nxj.net
>>24
ふむふむ。なかなか一筋縄ではいかない大人の事情ってのがてんこ盛り、ってことですね
私もそろそろ C++ をやり直そうかな‥‥
30:デフォルトの名無しさん
22/05/31 21:24:16.90 YEMisgK+.net
このコードがコンパイルできないんだけど、なんで?
struct hoge {
std::map<int, std::unique_ptr<struct hoge>> m = {};
void x() {
struct hoge &r = *this;
r = *(m.begin()->second.get()); // ここがまずい
}
};
31:デフォルトの名無しさん
22/05/31 21:37:16.47 Cpwrpvdc.net
コピーコンストラクタが�
32:トばれて、最終的にmapのunique_ptrがコピーできないってことか。。。 C++98の人間だし10年以上離れてたから最近のC++まったくわからんわ・・・
33:デフォルトの名無しさん
22/05/31 21:49:44.41 prs/eEEO.net
>>30
あたりめえだろ
バカかお前
34:蟻人間
22/05/31 22:00:19.02 eSF5ElRz.net
rは*thisの別名。
*thisの所有物を*thisにコピー。だめ。
*thisよりも高位じゃないと。。。
35:はちみつ餃子
22/05/31 22:30:18.12 +LJ4L5Ht.net
根拠。
URLリンク(timsong-cpp.github.io)
コンテナを代入するとき、コンテナの要素の型は CopyAssignable であり、
コンテナに対して CopyInsertable であることを要求する。
36:デフォルトの名無しさん
22/05/31 23:45:41.75 xnVZpK0y.net
>>(前スレ)695
のFFTで2^(2^34)-1を計算する奴
URLリンク(ideone.com)
を倍速で動くようにしたったわ……!
↓↓↓
URLリンク(ideone.com)
オリジナルが2200秒なところを962秒で計算完了
出力結果は一致
メモリ消費量はオリジナルと同等(完全in-place、sinテーブルは1GB(計算時間と誤差が劣化するがシュリンク可能))
37:デフォルトの名無しさん
22/05/31 23:48:59.95 xnVZpK0y.net
さすがに天才の漏れも三角関数って何だっけというあたりからスタートしたので
日数がかかってしまったが、いまやバッタフライ演算を完全に理解したから
純アルゴリズム的には最善の実装になっていると言える(希ガス、
(参考)
基礎からの周波数分析(9)-「高速フーリエ変換(FFT)」
URLリンク(www.onosokki.co.jp)
あとはメモリアクセスの時間局所性を改善して1000倍にする、
38:デフォルトの名無しさん
22/06/01 00:23:05.24 0xwrfx4r.net
こういうのに燃えてるような人が日本を支えていたのかもな
39:デフォルトの名無しさん
22/06/01 07:38:09.36 g+4BWW21.net
過去形でワロタ
40:デフォルトの名無しさん
22/06/01 08:08:59.08 X1odZl5o.net
スペアナ以外に使い道あるのか
41:デフォルトの名無しさん
22/06/01 09:38:46.33 0/3ltNwW.net
>>37
アホか
数論変換も知らんゴミが夏休みの自由研究やってるだけ
42:デフォルトの名無しさん
22/06/01 10:00:14.05 vvQTEkHX.net
>>36
漏れや希ガスというタイポや、バタフライ演算とかいう大学2年の信号処理の課題で出る程度のアルゴリズムを自信満々に書いちゃうあたり、かわいそうな人なのかな
43:デフォルトの名無しさん
22/06/01 10:09:19.65 IxX6jh1U.net
その辺はタイポじゃなくて20年近く前の2ch語なのじゃ……
イタいことには変わりないが
44:デフォルトの名無しさん
22/06/01 10:31:05.57 RHCtS9cS.net
41がむしろ異常にみえる
45:デフォルトの名無しさん
22/06/01 10:39:26.49 m3Paz3vX.net
最近は大学2年で信号処理やってるのかい?
46:デフォルトの名無しさん
22/06/01 11:39:44.35 vvQTEkHX.net
>>44
うちは二年前期の専門科目だった
47:デフォルトの名無しさん
22/06/01 11:40:41.11 XFKMacmT.net
>>43
どう異常に見えるのか書いてない時点で…
48:デフォルトの名無しさん
22/06/01 13:51:18 pJ9e03Xl.net
template <class T> void F(const T &t){ auto x = t; }
って関数があった場合、autoで推論(導出?)されるxの方はconst T&になるの?
ついでにここらへん分かりやすい資料があったら教えてほしい。
49:はちみつ餃子
22/06/01 14:22:19.84 YMgHeGpL.net
>>47
テンプレートの実引数推論と同じ規則が適用される。
つまり
template<class U> void foo(U u);
というテンプレートが仮にあったとして、これに
foo(t);
としたときの U の型がその場合の x の型になる。
故に x の型は T であって const も参照もつかない。
50:デフォルトの名無しさん
22/06/01 22:01:40.23 g+4BWW21.net
auto&にすればconst参照も推論されるし、右辺値も取り得るならauto&&にしておけば間違い無いんだっけ
51:はちみつ餃子
22/06/01 22:56:35.59 YMgHeGpL.net
auto& x = t;
と書いた場合には上述 (>>48) の規則に当てはめると
template<class U> void foo(U& u);
と同等の推論をするし、
auto&& x = t;
と書いた場合には
template<class U> void foo(U&& u);
と同じ推論になるわけだね。
52:デフォルトの名無しさん
22/06/02 02:04:50.78 uWYOiZpw.net
じゃぁ、あらゆる場面でauto&&と書くのはあり?
53:デフォルトの名無しさん
22/06/02 08:19:43.47 X8QTJG9M.net
駄目
54:デフォルトの名無しさん
22/06/02 10:55:52.02 MPFVtYTL.net
>>36
>>44-45
URLリンク(www.youtube.com)
55:デフォルトの名無しさん
22/06/02 10:56:54.96 MPFVtYTL.net
バッタフライってバッタとハエのことか
56:デフォルトの名無しさん
22/06/02 11:39:13.84 2jh3vW7l.net
バッタのフライだよ
昆虫食
57:デフォルトの名無しさん
22/06/02 22:50:27.49 W32R/zzX.net
>>37-46
んまー藻前らの言う通り
>>(前スレ)695 のオリジナルのプログラムが書き方が変にIQ高すぎたせいで
漏れが普通に書いたプログラムの方が速かったということかもしれませ
んね、
しかしこれをここから2^3倍にするというのが真の天才の仕事なので
ご気体くだち、
58:デフォルトの名無しさん
22/06/02 22:51:31.90 W32R/zzX.net
なお^がべきなのか排他的論理和なのかは結果を見て決める、
59:デフォルトの名無しさん
22/06/03 06:03:05.77 2JsQlaOH.net
operator^をべきにするやついたら当然シバくよな
60:デフォルトの名無しさん
22/06/03 06:10:12.11 3ErUtwIg.net
addメンバ関数の引数(x)の所有権を、クラスの中の配列(vec)に移動させたい場合、std::moveをどこで使えばいいかわかりません。
struct A{
vector<vector<int>> vec;
void add(vector<int> &&x){
ここで、std::moveを使ってpush_backに渡すべきか、渡さなくてもよいのか、わかりません。
1) vec.push_back(std::move(x));
2) vec.push_back(x);
どっちが正なのか?・・・
};
~~~~
vector<int> x;
A a;
a.add(std::move(x));
61:デフォルトの名無しさん
22/06/03 07:50:26 AsLopwGr.net
moveでなくてforwardが正しいです
62:デフォルトの名無しさん
22/06/03 08:54:35.11 I7UEGKwl.net
>>59 move 使わないと移動しないでしょ。アドレス見るなりして確認できるはず。
>>60 「移動させたい」と言ってるんだから move で正しいでしょ。
63:デフォルトの名無しさん
22/06/03 09:14:32.48 wV0TqfjJ.net
>>56
相変わらずタイポしてて草
64:はちみつ餃子
22/06/03 09:33:30.85 ysQR9TY9.net
>>59
C++ の常識的な設計としてはには >>60 が主張するように forward を使うべき。
右辺値か左辺値かによって適切に切り替えが成されるので。
「常に」ムーブさせたいのであれば >>61 の述べる通りだが、
その場合は a.add(std::move(x)); の move は不要。 (有っても害はないが……。)
左辺値でも add がムーブするなら右辺値にキャストする意味はない。
65:デフォルトの名無しさん
22/06/03 09:48:25.29 IxeUpLcv.net
push_backが適切にやってくれるだろうし素人がここで手入れするところではないな
66:デフォルトの名無しさん
22/06/03 09:49:48.62 I7UEGKwl.net
>>63 a.add(std::move(x)) の move 外したらコンパイルエラーになるでしょ。
67:デフォルトの名無しさん
22/06/03 09:56:37.41 IxeUpLcv.net
そりゃド素人が作成した自作関数に&&しか定義してないからでしょ
68:はちみつ餃子
22/06/03 09:59:10.91 ysQR9TY9.net
>>65
ああそうか、すまん。
変な思い違いをしていた。
69:デフォルトの名無しさん
22/06/03 11:21:49 2JsQlaOH.net
xをコンストラクタに渡すならemplaceじゃね?
70:59
22/06/03 14:58:35.62 3oYQiySt.net
これでいいってことですか?
void add(vector<int> &&x){
vec.push_back(std::forward(x));
};
あと、
>「常に」ムーブさせたい
という言葉が気になるんですが、右辺値を受け取る場合に「ムーブさせない」場合があるんでしょうか?
71:デフォルトの名無しさん
22/06/03 15:42:06.91 g1oXgs2q.net
引数が forwarding reference になるのは型変数の場合だけ
URLリンク(en.cppreference.com)
コンクリートな型の場合 && で取ったら確実に rvalue だから forward は要らん
んで vector<T>#push_back は (const T&) と (T&&) に対してオーバーロードされてるから (後者のバージョンが選ばれるので) move も要らん
つまり >>64 が正解。なんで適当答える前に手元で確認しないのか
72:はちみつ餃子
22/06/03 15:44:21.94 ysQR9TY9.net
>>69
ムーブさせない場合はある。
それとは別に可能なら左辺値にも右辺値にも対応するのが通例なので
それを無意識に前提に入れてしまっておかしなことを書いてしまった。
ごめんね。
73:デフォルトの名無しさん
22/06/03 16:02:28.52 I7UEGKwl.net
>>70 move しなかったら push_back(const T&) になっちゃうでしょ。なんで適当答える前に(ry
74:デフォルトの名無しさん
22/06/03 16:06:42.00 g1oXgs2q.net
>>72
アホか。forwarding reference じゃなくて rvalue reference だっつってんのになる訳ねーだろ
75:デフォルトの名無しさん
22/06/03 16:10:12.85 g1oXgs2q.net
あ、もしかして >>59 の
> a.add(std::move(x));
について言ってんのか?そりゃここには move が要るが今は add の中の話だろ?
76:デフォルトの名無しさん
22/06/03 18:50:26.25 lbrgnw5P.net
>>73
さてはrvalueの挙動理解してないな?
URLリンク(wandbox.org)
rvalueとして受け取った時点でlvalue扱いなんだよ
moveするまで所有権を持っていて、moveで所有権を放棄する。
所有権はT&&を受け取る関数に移る。
77:デフォルトの名無しさん
22/06/03 19:12:19.64 lbrgnw5P.net
>>69
moveさせるとまずいケースがある
URLリンク(wandbox.org)
moveってのは所有権の移動なので、所有権を他に渡した後に使うとまずい
このコードは手元のgccだとこんな感じに壊れる
forwardは2つのモードがあって、forward<T&>かforward<T&&> (or forward<T>) を指定しなきゃいけない。
T& forward<T&>: moveしない
T&& forward<T&&> (or forward<T>): moveする
78:デフォルトの名無しさん
22/06/03 19:43:48.13 +R1h67E5.net
Revive! Vive! unifyde call syntax!! revive!!!
79:デフォルトの名無しさん
22/06/04 12:47:58.32 TQBK1egQ.net
cpp経験のあるエンジニアが面接に来たんですがboost知らないとかあり得るんでしょうか
80:デフォルトの名無しさん
22/06/04 13:11:38.01 FGCXQeDT.net
あり得ません、エアプです
81:デフォルトの名無しさん
22/06/04 13:13:16.94 to7UVp4p.net
でもC++を完全に理解してるスーパーエンジニアが君の会社に来ることはないんだ
82:デフォルトの名無しさん
22/06/04 13:41:01.98 vvbHqYcO.net
boost知ってても使ってないとか黙殺するとかなら有り得るんじゃね
83:デフォルトの名無しさん
22/06/04 13:51:08.17 cj+dvlSK.net
CとCppは似てるらしいけど最初はCから始めて
基礎を身につけた方がいいとかありますか?
84:デフォルトの名無しさん
22/06/04 14:02:22.31 1SIgUGMa.net
まあコンパイル時間が伸びるとかで使わない所も多いしな
85:デフォルトの名無しさん
22/06/04 14:05:58.45 OQ3usAsV.net
C++のほうがコンパイル時の文法チェックが親切なので、g++でコンパイルするのが吉
86:はちみつ餃子
22/06/04 14:18:00.05 Ah6rlskA.net
余談だけど cpp って書いたら C プリプロセッサのことを指す場合もある。
87:デフォルトの名無しさん
22/06/04 14:37:22.59 cj+dvlSK.net
>>83-85
ありがとうございます!勉強になります!
88:デフォルトの名無しさん
22/06/04 14:38:35.97 qJZvQBHL.net
boostつかうひと嫌い
89:デフォルトの名無しさん
22/06/04 14:45:24.57 wH3cIPcT.net
マリオカートの遊び方に縛り入れてんじゃねぇよ!
90:デフォルトの名無しさん
22/06/04 16:03:47.30 OQ3usAsV.net
今どきの人がCの機能を学ぶにしても、最初のうちはC++コンパイラを使ったほうがいい
C++コンパイラは初心者がやりがちな意図しない型キャストに警告を出してくれる
91:デフォルトの名無しさん
22/06/04 16:44:33.09 vvbHqYcO.net
>>82
その通り
ハゲめ
92:デフォルトの名無しさん
22/06/04 21:34:58.76 TQBK1egQ.net
>>79
やっぱ有り得ないですよね
うちの会社はC++使わないんですが、盛り過ぎた経歴は看過できないので二次面接にはC++経験のあるエンジニアに同席してもらいます
93:デフォルトの名無しさん
22/06/04 21:43:09.92 OQ3usAsV.net
>>91
ずっと同じ部署にいてboostライブラリに接する機会がなかっただけじゃないかな
ずっと同じ部署にいたってことは専門性が高くて信頼されてた可能性がある
94:デフォルトの名無しさん
22/06/04 21:48:20.42 nRM2q6cY.net
>>92
はい、私がC++は門外漢すぎて突っ込んだ質問が出来なかった手落ちもあるので、後続の面接ではしっかり見極めたいと思います
C++以外の話でも怪しい部分はありましたし
95:デフォルトの名無しさん
22/06/04 22:16:16.74 IRaDT1CY.net
>>83も書いてるけどboost使わない職場はそれなりにあるから俺もboost使える?って聞かれたら使ったことないからよく知らんって答えると思う
そもそもそんな事で採用決めるような会社はこちらから断ると思うが
96:デフォルトの名無しさん
22/06/04 22:23:56.45 FR2x7OcT.net
はい、職歴に書かれた内容に曇りがないか見極めたかっだけなので、Boostに知見があるかどうかはさほど問題にしてません
97:デフォルトの名無しさん
22/06/04 22:54:17.16 cXL4Xuwo.net
>>78
バカか
boostは標準化されてないだろ
ヘッダ入れ込んでまでわざわざ使うヤツは縛りプレイヤーかマニアだぞ
98:デフォルトの名無しさん
22/06/04 22:56:04 4luU2XzE.net
>>79はネタで言ってるかエアプだと思うよ
boost役に立つものもあるし個人では使うが、仕事で必須かというとそんなことはない
99:デフォルトの名無しさん
22/06/04 22:59:46.47 +8Ow3LIK.net
標準じゃないもん使うのはアホ
人格に問題がある
100:デフォルトの名無しさん
22/06/04 23:04:03.58 BuoePqDI.net
知ってるけどあんまり使ってない、使ったことないから詳しくは知らない、とかならまあ別に普通だけど
知らない聞いたことすらないってのはヤバい
101:デフォルトの名無しさん
22/06/04 23:12:35.97 3rcQlGgA.net
仕事では使わないなあboost
必須のミドルウェアは使うけど
102:デフォルトの名無しさん
22/06/04 23:12:59.31 4luU2XzE.net
>>98
その標準じゃないもん、にはOSのAPIとか目的のソフトに必須のライブラリ群も含んでる?
103:デフォルトの名無しさん
22/06/05 00:13:46.63 /AT5pgYO.net
boostもサードパーティのライブラリも使わんて人は、コマンドラインのパーサーとか任意精度のライブラリとか自分で毎回書いてるのか?
正気か?
104:デフォルトの名無しさん
22/06/05 00:46:57.94 /ywqNijR.net
そんな便利なものは存在しないから標準ライブラリ+Win32でどうにかしてるだけじゃね?
105:デフォルトの名無しさん
22/06/05 01:30:20.47 TqTpE262.net
boost::sort::block_indirect_sort()はstd::sort()より速いので使ってる
106:デフォルトの名無しさん
22/06/05 03:05:51 IC6BDqn3.net
>>102
コマンドラインのパーサー含め、その辺の文字列処理は全部自前の文字列クラスでやっちまうな、俺はw
いちいち文字コードがどうたらとか悩みたくないし
107:デフォルトの名無しさん
22/06/05 05:03:18.77 O5HYGw/G.net
>>95
c++標準の勉強をしていれば単語としてboostを聞いたことあるだろう。
知らないのなら大した勉強はしていないだろうから、せいぜい業務で通り一辺触ったことがあるくらいじゃないかね。
どこまでのスキル求めているかによるけど、業務内容に近い課題を与えてテストしてみたらいいんじゃない?
業務でc++を使わないなら、c++スキルに金を払うわけじゃないから気にすんな。どうせ募集要項にc++とか書いてないんだろ。
108:デフォルトの名無しさん
22/06/05 06:28:02.59 kEvpwCAH.net
自分の知ってる世界がすべてだと思ってる人間の方が危険。
C++が使われる範囲が広すぎるから、言語の経験有無よりもどの分野で開発してたのかを聞くべき。
ガラケー時代のカーネルドライバ書いてたり、携帯キャリア向け機器の組み込みやってた時はboostどころかstlすら使ってなかった。
というか使えなかった。
一方でスマホゲーのバックエンドを書いてた時はboostまみれだった。
109:デフォルトの名無しさん
22/06/05 07:05:01.15 xi1K2Yw5.net
任意精度ってGMP使いませんか?
110:デフォルトの名無しさん
22/06/05 08:31:22.07 sROqatdZ.net
boost知らない人は自分が使ってる環境がC++11/14/17/20なのかも知らないとかありそう
大昔のC++文法しか知らない人とかいるし
面接ではこれも聞いてほしい
111:デフォルトの名無しさん
22/06/05 09:22:33.51 Zl7Pb69A.net
昔はboostでも使わんと正規表現扱えなかったでしょ(ヽ´ω`)
今の子は知らんのかな?
112:デフォルトの名無しさん
22/06/05 10:41:52.09 GvBqEMar.net
edはC++,boostで書かれていた!?
113:デフォルトの名無しさん
22/06/05 10:57:35.83 TqTpE262.net
今や正規表現ライブラリはpcre2使っておくのが最適解でしょ
boostもre2も速度遅すぎ
最速軽量がre2の長所だったのは昔の話
114:はちみつ餃子
22/06/05 11:09:32.30 XG05O5RB.net
Boost 内のライブラリは組み合わせやすかったりもするだろうし、単独で性能が良いというだけが指標ではないだろう。
もちろん性能が良いに越したことは無いが、数倍程度の違いなら全体としては問題にならないことも多い。
115:デフォルトの名無しさん
22/06/05 11:33:39.66 TqTpE262.net
STLでregexクラステンプレートが追加されたのだから各正規表現ライブラリの供給元がstd::regexに準拠したラッパークラスを提供してくれるのかと思いきや、ほったらかしだしなあ
116:デフォルトの名無しさん
22/06/05 13:02:35.05 u0j22vIZ.net
おまいの募集要項にboost使用するって描いてないならおまいが可笑しい
boost以外の部分でC++の知識や使えるかどうかを確認するべき
117:デフォルトの名無しさん
22/06/05 13:05:40.20 u0j22vIZ.net
>>108
mpirだな
118:デフォルトの名無しさん
22/06/05 13:23:08.93 VgN5DVM1.net
ただの文字列なら速さで選ぶのも良いけど、HTMLやXMLのような注釈を含むテキストは、STLやboostを使うのがスマート。
119:デフォルトの名無しさん
22/06/05 13:27:27.15 TqTpE262.net
re2は遅いうえに\1みたいな後方参照をサポートしてないのが痛い
120:デフォルトの名無しさん
22/06/05 13:44:58.69 JAUYaj4s.net
別に即戦力求めてるわけじゃないので開発言語で縛って間口狭くしたくないんですよ でも質疑応答のクオリティ上げるためには突っ込んだ質問って必要じゃないですか 今回はそれが上手く出来なかっただけです
121:デフォルトの名無しさん
22/06/05 15:40:19.58 udiiYXiV.net
ようするに基礎があるかどうかと伸びしろがあるかどうかだろ
今知らなくても調べればすぐ判ることが出来れば問題無い罠
122:デフォルトの名無しさん
22/06/05 16:50:16.03 sROqatdZ.net
本人が経歴盛ってるならクズだが、営業やエージェントが勝手に盛ってることもあるからな
その辺も見極めて大目に見てほしい
123:デフォルトの名無しさん
22/06/05 17:21:37.24 dinbGc5/.net
自分のとこが金をいくら出せるのか考えてからマウント取ってほしいもんだわ
124:デフォルトの名無しさん
22/06/05 17:37:12.61 DpfkldE/.net
対価は市場感より高めに設定していますね
AWSと同じぐらいのはずです
125:デフォルトの名無しさん
22/06/05 17:59:03.07 MGWqyCtZ.net
>>117
そもそもそんな用途にC++ってどうなの?
126:デフォルトの名無しさん
22/06/05 18:15:07.18 VgN5DVM1.net
>>124
ブラウザでctrl+f押してみ。
127:デフォルトの名無しさん
22/06/05 18:28:12.08 dinbGc5/.net
>>123
手取りで1000万くらいですか?
128:デフォルトの名無しさん
22/06/05 19:24:35.36 /AT5pgYO.net
htmlは知らんがxmlの読み書きはC++のプログラムで一般的じゃね
129:デフォルトの名無しさん
22/06/05 22:30:48.15 n7vwmg3m.net
C言語の基本を学んでC++を勉強を始めました
バッファのフラッシュについて教えてください
プログラムは最後に全てのバッファがフラッシュされると思いますが、
std::flashやstd::endlはどういった時に使えばいいのでしょうか?
また、フラッシュの処理時間を考えるとstd::endlよりも'\n'を使った方が軽くなると思いますが、
あえてstd::endlを使う意味はありますか?
このフラッシュという概念はC言語になかったですよね…?
130:デフォルトの名無しさん
22/06/05 22:41:22.00 FJOOY/QK.net
fflush()を知らずにC言語を使ってきたなら気にする必要はない
131:デフォルトの名無しさん
22/06/05 22:53:56.06 ypMgugQ8.net
>>128
キミの疑問の中に答えがあると思うんだが
>プログラムは最後に全てのバッファがフラッシュされると思いますが、
逆に言えばプログラムの途中ではいつバッファの内容がflashされるかわからないってことじゃん
どういった時に使えばいいのか、なんてプログラムの最後ではなく途中でflashしたい時だろ
132:デフォルトの名無しさん
22/06/05 22:55:08.26 JCaRLrt5.net
stderr(バッファリング無し)とstdout(デフォルトでバッファリング有り)のリダイレクト先が同じ(コンソール等)のとき、
printf()とfprintf()の実行順にprintf()とfprintf()の出力結果を並ばせたいときに早速ffush(stdout)の出番が、
あとfflush()せずにabort()したらバッファ上のデータが失われることがある
もっともabort()を呼ぶしかない状況とかはどうしようもない状況なので盲目的なfflush()が適切とは言えないケースも
ありえるかもし
れんが
133:デフォルトの名無しさん
22/06/05 23:00:34.55 JCaRLrt5.net
んまー通常はファイルのクローズでフラッシュされるから明示的にファイルポインタに対してfflush()する必要に迫られることはなさげ
腸人工的なシチュエーション(でありかあまり良い設計でない例)として、
オープンしたままのファイルA、Bにこの順でデータが追記されることを気体するプロセスが他に居るときに
A、Bの順で追記するとき要る?ぐらい??
134:デフォルトの名無しさん
22/06/05 23:11:06 TqTpE262.net
他のプロセスと通信する時に明示的なバッファフラッシュが必要になることがあるよ
135:デフォルトの名無しさん
22/06/05 23:17:22 JCaRLrt5.net
>>133
それは思わないでもなかったが、
1. バッファに入った順で出ていく
2. ほっといてもバッファ内容がどんどん出ていく
3. 通信は送りっぱなしまたはロジカルなハンドシェーク手順
である場合にfflush()が必須というケースが思いつきませなんだ、
136:デフォルトの名無しさん
22/06/05 23:24:31 /ywqNijR.net
1行ごとに結構重い処理をしたり、std::cinが入ってくるタイミングが不定期だったりするときに1行ごとにflushしておくと便利。
C言語でも使うテクニックだけどね
137:デフォルトの名無しさん
22/06/05 23:25:34 TqTpE262.net
送信側(自アプリ)じゃなくて受信側(他アプリ)の都合次第なので
138:デフォルトの名無しさん
22/06/05 23:36:59 JCaRLrt5.net
>受信側(他アプリ)の都合次第
どのような都合かkwsk、
fflush()したら動いて、fflush()しないと止まってしまう通信処理とかはなんかおかしいのでは……
ほっといてもバッファ内容がどんどん出ていく 限りfflush()せずとも送信は成立する
受け取れたかどうかはACKかNAKでも返してもらえばワカルから、
受信タイムうアウト検知ぐらいしかタイミングが関係する要素は無さげ、
139:デフォルトの名無しさん
22/06/05 23:57:14.80 TqTpE262.net
「受け取れたかどうかはACKかNAKでも返してもらえばワカル」ってのがすでに受信側の都合だろ
140:デフォルトの名無しさん
22/06/06 00:02:59.46 NTJIoMOy.net
コンテキストスイッチをきっかけにフラッシュするような仕組みはあるん?
141:デフォルトの名無しさん
22/06/06 00:15:14.95 1jBvtBty.net
それがフラッシュしておかないと停電のときデータ全部持ってかれるんだよな
142:デフォルトの名無しさん
22/06/06 00:19:06.76 68av+k9D.net
とりあえず言っておくが、水がもったいないからと言って水洗トイレを流さずに退出するのはやめたほうがいい
143:デフォルトの名無しさん
22/06/06 00:21:03.22 68av+k9D.net
>>139
小便用トイレだと赤外線で退出を探知して水を流してくれるものもある
144:デフォルトの名無しさん
22/06/06 00:23:36.15 1jBvtBty.net
フラッシュってのはハードディスクにどこまでデータ書いたか正規化する目的で行うから、フラッシュしないで停電モードでクラッシュすると、復旧したときに書いてたデータはゼロバイトのままだったりするが、こまめにフラッシュでデータを確定申告してる場合は書いた分がきちんと残ってたりする
145:デフォルトの名無しさん
22/06/06 00:26:15.98 Wu7kw3Sh.net
これからは税務署に追徴課税されないように足繁く通うことにします。
146:デフォルトの名無しさん
22/06/06 00:28:00.96 1jBvtBty.net
ま、無停電装置つけてたり電源不足などでHDDが頻繁に切断される環境でなければ問題ないけどね
147:デフォルトの名無しさん
22/06/06 00:28:38.87 68av+k9D.net
一休はすでに縄を持って待ち構えてくれているのだから、義満が虎を屏風から追い出せばいいだけ
簡単なことだろ
148:デフォルトの名無しさん
22/06/06 02:46:25.01 ETmHHhEk.net
誤解している人が多そうだけど
fflush()はC標準ライブラリの中のバッファリングデータを全て吐き出すだけであって
システム
149:コールでいえばwriteするだけだよ 一方でカーネルがディスクなどに書き出すのを保証するのはシステムコールではsync/fsyncであってこれはfflush()しても行われない別のもの
150:59
22/06/06 03:12:54.60 hkI7oR+t.net
遅レスすいません。
右辺値参照周りを自分でも見直してきたんですが、
最終的に「vecの要素」に所有権を押し付けるコードは↓で正しいのでしょうか?
void add(vector<int> &&x){
vec.push_back(std::move(x));
};
・std::forwardを使う場合は、型がテンプレートの場合(フォワーディング参照の場合)に使うのが一般的であって、
上では具体的な型(vector<int>)を指定しているので、forwardを使う場合に当てはまらない。
・vector<int> &&xとして引数を受け取っても(右辺値参照として引数を受け取っても)、
右辺値参照自体は左辺値になるので、
vec.push_back(x)としてしまうと、呼ばれるpush_backは push_back(const T&)であり、所有権が移譲されない。
なので、ここでもmoveする必要がある(vec.push_back(std::move(x))
この理解であってますか?
151:デフォルトの名無しさん
22/06/06 08:55:53.89 Ug3DHjCK.net
>>147
sync sync sync
最後に電源切る前に
^C 連打ですね
判ります
152:デフォルトの名無しさん
22/06/06 09:02:16.31 Ug3DHjCK.net
URLリンク(qiita.com)
URLリンク(peng225.)果て部.com/entry/2016/07/30/211726
153:デフォルトの名無しさん
22/06/06 10:28:12 x36Ky4fa.net
WinだとFileFlushBuffersだけで完結する
154:デフォルトの名無しさん
22/06/06 10:28:30 0alNkgKE.net
noexceptの有無で動作が変わるなんてC++ムズすぎィ!
155:デフォルトの名無しさん
22/06/06 11:42:00.12 Ug3DHjCK.net
>>152
>>66
156:デフォルトの名無しさん
22/06/06 11:43:05.77 Ug3DHjCK.net
まあ原因と結果が全然離れた別の場所で起こるっていう意味では難易度高いとは思う
157:デフォルトの名無しさん
22/06/06 12:41:54.06 jOQJjNZV.net
>>148
あってる
158:デフォルトの名無しさん
22/06/06 21:20:45.44 FY57Ayyt.net
>>126
この国は累進課税なのでそのラインは難しいですね
159:デフォルトの名無しさん
22/06/08 00:14:11.77 0qhQo4nk.net
>>66の話は>>59へのだったのか?w
>>155 ほか回答頂いた方
ありがとうございました。
160:デフォルトの名無しさん
22/06/08 00:17:03.29 xZpQpCco.net
moveをやれるヤツはmoveをやる勇気があるヤツだけだ
161:デフォルトの名無しさん
22/06/08 22:59:00.34 lI0dIi5c.net
>>138
話をそらすでないは;;;
通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
受信側(他アプリ)に伝わるやんけ
fflush()全然必須じゃないやんけ
fflush()に関してはやっぱ受信側の都合も糞も無いやんけ;;;
んまー今日日の計算機は速いから、世迷言てんこ盛りの呪術指向プログラミングでも
比較的まともっぽく動くが、
162:デフォルトの名無しさん
22/06/08 23:03:01.67 lI0dIi5c.net
fflush()にはフロー制御で止まっている送信を動かす力は無いし、
ブロック型デバイスの書き込みのトリガーになる保証は無いしで
やっぱ使いどころは>>131みたいに多対1の書き込み(dstが同じ)というケースでの論理的な書き込み順序保証ぐらいしか無さげ
163:デフォルトの名無しさん
22/06/08 23:39:12.93 TQgrAlst.net
>>159
水に流せ
164:デフォルトの名無しさん
22/06/09 19:04:36.80 d61AFL9R.net
受信側の都合どうこうの話は知らんが
>通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
それは送信側がどんどん送り出している場合でしょ
165:デフォルトの名無しさん
22/06/09 19:12:48.98 6LGi7Ubo.net
高機能トイレしか使ったことない人は、何もしなくても離席したら勝手に排泄物が流されていくと思っているからね
166:デフォルトの名無しさん
22/06/09 19:16:36.26 ftpPDZQh.net
停電おこったことないんだろうね
167:デフォルトの名無しさん
22/06/09 21:05:58.36 Y+xZp6wU.net
トイレの水流すのもflushだったなwww
168:デフォルトの名無しさん
22/06/09 21:14:08.39 0SCWcBb2.net
むしろコンピュータ用語のflushの方がトイレからの連想
169:デフォルトの名無しさん
22/06/10 18:08:30 PT4Yy0z8.net
flushつったらズリセンだろ
170:デフォルトの名無しさん
22/06/10 18:15:06.01 q3uEdydr.net
長時間ストリーミング書き込み時にFileFlushBuffersコールしてなかった停電時の悲劇
171:128
22/06/11 13:05:09.88 qY+svW4r.net
なんとなく分かりましたが、C言語でfflush()を使っていなかったので困ることもなさそうです
改行は'\n'を使ってもう少し勉強を進めてから改めて皆さんのレスを読み返そうと思います
返事が遅くなりました、ありがとうございました
172:デフォルトの名無しさん
22/06/11 15:25:15.53 b1p/w9+9.net
URLリンク(ideone.com)
コンパイル通らねー。
173:デフォルトの名無しさん
22/06/11 21:16:14.33 ZeuO2q0P.net
>>163
ソフトウェアー呪術者、、、、
>>163 のような台詞はファイルをクローズしない人に言ったらよい
fflush()しないことにに当てはまらない理由はすでに述べているっつーの;;;
174:デフォルトの名無しさん
22/06/11 21:25:33.69 ZeuO2q0P.net
>>168
左様停電に対して備えたいならI/Oストリームのバッファ階層の操作で満足するのではなくて
ioctlレヴェルの働きかけで掃き出し操作を保証を行うべき、(デバイスによってやるべきことが違う
というわけで論理的思考う能力に乏しい香具師がfflush()万能教にはまっている悪寒、
175:デフォルトの名無しさん
22/06/11 21:47:10.33 ZeuO2q0P.net
ていうかそもそも馬鹿でかいバッファを用意しておいてから停電を恐れるというのはアレな発想でありまして、
真に停電に備えたいなら馬鹿でかいバッファを備えたデータのストリームとは別に、
どこまで書き込みが終わったかというだけの小さいサイズのジャーナル情報を
こまめに書くというのがファイナルアンサーであって
停電の際はジャーナル情報だけ保証して停電の瞬間に馬鹿でかいバッファ上にあったデータは諦めるのが正しいシステム
停電による処理中データの喪失がどうしても嫌ということなら速度の方を諦めてアンバッファーにするかバッファを小さくしてくだち、
176:デフォルトの名無しさん
22/06/11 21:56:10.36 ZeuO2q0P.net
まとめ:
この地球上のどこを探しても停電への備えがこまめなfflush()(笑)ということはありえない
177:デフォルトの名無しさん
22/06/11 22:48:11.94 fc6R3/Uh.net
まだ言うか!
178:デフォルトの名無しさん
22/06/11 23:31:57.10 pfxnOy19.net
小さいサイズでもそれが即座に反映だれるとは限らないけどな
停電に備えるならUPSだろ
何がこまめに書くのがファイナルアンサーだよ
突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな
179:デフォルトの名無しさん
22/06/11 23:44:48.33 /CWj/UNa.net
粗悪なUPS使って電源破損した事あるから良い印象ないな
180:デフォルトの名無しさん
22/06/12 13:55:23.39 0uPAg53b.net
FFTで2^(2^34)-1を計算するやつの倍速化したやつをさらに倍速化したった……!
■ オリジナル
URLリンク(ideone.com)
2200秒
■ C++書き換え版
URLリンク(ideone.com)
2200秒
■ 倍速化
URLリンク(ideone.com)
962秒
■ ブロック6-step algorithm適用
URLリンク(ideone.com)
909秒 (倍速化版の94%) --- OpenMP無効、シングルスレッド
596秒 (倍速化版の62%) --- OpenMP有効、8スレッド
181:デフォルトの名無しさん
22/06/12 13:55:40.64 0uPAg53b.net
なんかもうCPUの帯域全部使い切ってやったぜ、みたいな
達成感みある、
ただし実行時間の2/3ぐらいはファイルの書き出しに使われている模様orz
OpenMP有効化の条件だと
2^(2^31)-1までは1分以内に出て、
以降はVS2019の分析ツールのCPU時間のグラフを眺める限り、
ファイル出力を覗く正味の計算時間は
2^(2^32)-1: 20秒
2^(2^33)-1: 不明(見てなかった)
2^(2^34)-1: 62秒
だったので、ファイル出力を除く正味の計算時間は多分3分ぐらい、
182:デフォルトの名無しさん
22/06/12 14:00:10.22 0uPAg53b.net
OpenMPは昨日始めたのでなんか間違ってるかもしれん……orz
行列の転置が8スレッド使って(2回目以降も)実行時間1/8にならない件について:
URLリンク(ideone.com)
のfftb6::transpose()のコードの書き方だと50%ぐらいにしか短縮されなんだ 。n_
183:デフォルトの名無しさん
22/06/12 14:02:02.73 0uPAg53b.net
つなみにVS2019でOpenMP有効にするには
「構成プロパティー」→「C/C++」→「言語」→「OpenMP のサポート」
で逝ける、
184:デフォルトの名無しさん
22/06/12 14:04:35.42 0uPAg53b.net
>>176
>何がこまめに書くのがファイナルアンサーだよ
NTFSの実装、、、
>突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな
しらそん
それはUPSを買う金もないのに停電とかを引き合いに出してきた香具師に言ってやってくだち
185:デフォルトの名無しさん
22/06/12 14:10:01.25 6VBjP0iK.net
8スレッドで4倍くらいになってほしいね
186:デフォルトの名無しさん
22/06/13 00:27:41.34 HWF8Czmy.net
もちついて考えたら
#pragma omp parallel for firstprivate(i, n1, n2, nb, JJ)
for (pow_t j = JJ; j < JJ + nb; j++) {
const pow_t src_idx = n2 * i + j;
const pow_t dst_idx = n1 * j + i;
dst[2 * dst_idx] = src[2 * src_idx]; // 実部
dst[2 * dst_idx + 1] = src[2 * src_idx + 1]; // 虚部
}
と書いては見たがこのdst[]やsrc[]は実は生の配列ではなくてstd::vector<double>::iteratorなので
共用変数扱いになってスレッド間で排他がかかっているのかもしれん……orz
firstprivate()指示句が(最適化後はポインタとはいえ)C++のオブジェクトを受け取れるかはわからんので
parallel forの前にポインタに置き換えてポインタをfirstprivate()するのが無難鴨、
(同じことはsinテーブルpriroot::nth_root wについても言える)
187:デフォルトの名無しさん
22/06/13 14:39:57 efPEc9j/.net
std::complexは使わないの?
188:デフォルトの名無しさん
22/06/13 15:28:43.59 Wf2qSIvf.net
びーまいべいべー
189:デフォルトの名無しさん
22/06/13 23:36:52.53 dm71PatD.net
並列処理に何でマルチスレッド使ってんだよ
昭和からタイムスリップしてきたのか?
190:デフォルトの名無しさん
22/06/14 00:17:42.26 SQz7DEKB.net
omp って単語を見るとおまんぽにしか見えない
191:デフォルトの名無しさん
22/06/14 01:23:09.85 e+DfEXd1.net
>>187
この問題でasyncプログラミングがどうやってマルチスレッドに太刀打ちするのか教えて
192:デフォルトの名無しさん
22/06/14 16:46:20.69 yDV29Um0.net
教えてください
C++で書かれたDLLがあります
とあるCエクスポート関数を呼び出すと稀に Access Violation 0xc0000005 が発生することがありプロセスが異常終了してしまいます
幸いなことにこの関数は大した仕事をしておらず結果が得られなければそれで困ることもありません(結果が得られれば少し役に立つ程度です)
なのでこの関数の失敗を握り潰したいのですが、C++ でアクセス違反を try-catch で握り潰すことはできるのでしょうか?
それともアクセス違反は致命的なエラーなので必ずプロセス終了に至るのでしょうか?
193:デフォルトの名無しさん
22/06/14 16:54:42.88 Vdns4Gf+.net
またこのネタ掘り起こしたいのか・・・
194:デフォルトの名無しさん
22/06/14 17:18:04.76 NNc5VmHP.net
>>190
.NETは使っとらんの?
195:デフォルトの名無しさん
22/06/14 17:23:59.58 rBU/2bdp.net
URLリンク(docs.microsoft.com)
呼び出し側のコンパイルで /EHa オプションつければ try-catch で握りつぶせるんでね?
196:デフォルトの名無しさん
22/06/14 18:22:20.04 WigeF4Tr.net
>>190
> 幸いなことにこの関数は大した仕事をしておらず結果が得られなければそれで困ることもありません(結果が得られれば少し役に立つ程度です)
そんな関数なら空の関数に差し替えればいいんじゃね
197:デフォルトの名無しさん
22/06/14 18:39:01.73 yDV29Um0.net
>>193
ありがとうございます!
/EHa を付けたらキャッチできました!
いままでは /EHsc が指定されてましたのでオプションの意味の違いを調べてみます
198:デフォルトの名無しさん
22/06/14 19:23:09.63 bI70PJIL.net
DLLが例外出してるのをCで握り潰してるのが原因だろ
199:デフォルトの名無しさん
22/06/15 20:40:34.83 RdmQ7I01.net
素人の質問でごめんなさい。(ここが一番関連ありそうだったので)
バイオインフォマティクスをやっているのですが、例えば主にC++で書かれたUnicycler (URLリンク(github.com))というソフトウェアでは、--threadsオプションで使用するスレッド数を指定できます。
デフォルトだとスレッド数8なのですが、仮にそれを1コアを使って実行した際はどのような挙動になるのでしょうか。
コア数<スレッド数なので失敗するかと思ったのですが、思いの他うまく実行できてしまいます。
一般的にこういう場合、並列 (parallel)処理ではなく並行 (concurrent)処理で、スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか・・・
200:はちみつ餃子
22/06/15 20:45:50.35 VY0KZJ3n.net
>>197
> スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか
せやで。
OS がスケジューリングしてスレッドを交互に実行しとる。
コア数以上のスレッドに分けても実行速度が上がったりはしないよ。
コンテキスト切り替えのコストの分だけむしろ遅くなると思う。
201:デフォルトの名無しさん
22/06/15 21:02:51 RdmQ7I01.net
>>198
なるほど、OS賢いですね。。
つまり1コアでやるときは複数スレッドの処理もできるけど、無難に1スレッドの処理にした方がむしろ速い、ということですね。
勉強になりました!ありがとうございます!
202:デフォルトの名無しさん
22/06/15 21:05:28 74xVOU49.net
各スレッドがio待ちしてるかも知れんし、コア数より多くても早くなる場合もあるんじゃね
gcc動かすときもコア数1.5倍位指定してる
203:デフォルトの名無しさん
22/06/15 21:28:42.61 RdmQ7I01.net
調べてみたらコンテキストスイッチにもプロセスコントキストスイッチとスレッドコンテキストスイッチがあって、
後者の方がコストが格段に低いとありました。
この場合は同一プロセス中の複数スレッドで後者なので、
>>200さんの言っていることもありますし、コア数よりスレッド数を少し多めに設定しても速くなるのかもしれませんね。
実験して確かめるのが一番かもですね。
204:デフォルトの名無しさん
22/06/15 21:38:32.69 vqdnmmaI.net
まあ今の実装は大抵スレッドといいつつプロセスだったりするけどね
205:デフォルトの名無しさん
22/06/15 22:07:11.11 Ltc382Vw.net
>>202
何の話だ?
206:デフォルトの名無しさん
22/06/15 22:21:16.61 5/k7QI1P.net
pythonはそんな感じがする
207:デフォルトの名無しさん
22/06/15 22:28:16.78 Ltc382Vw.net
pythonでもマルチスレッドとマルチプロセッシングは別物だろが
208:デフォルトの名無しさん
22/06/15 22:34:39 Z7kfo4VR.net
Linuxのスレッドはプロセスだと聞いた
209:はちみつ餃子 ◆8X2XSCHEME
22/06/15 22:56:22 VY0KZJ3n.net
そのへんは色んな論が合って今の主流がどうなってんのかよくわからん。
でも一度はプロセスを軽くする方向 (スレッドの実態をプロセスとする方向) になったというのは私も聞いたことがあるような気がする。
(BSD 系の話と混ざってるような気もする。 だいぶんうろ覚え。)
プロセスを軽くするというよりは段階を分けるというか、
プロセスをスレッド的な範囲で使っている分にはスレッド程度の処理しかしないみたいな感じ。
ただ、それは最終的には管理コストが思ったより大きくてそれほど効果的ではないというオチじゃなかったっけ?
210:デフォルトの名無しさん
22/06/15 23:10:10 vqdnmmaI.net
>>203
OSのカーネルスレッドの実装の話だ
211:デフォルトの名無しさん
22/06/15 23:14:22 8Ciw/luQ.net
forkもCoWがあるからオーバーヘッド大したことないんだっけ?
212:デフォルトの名無しさん
22/06/16 06:09:16.40 acnLqVz4.net
>>206
誰に聞いたんだよw
てか、少しは疑うことを覚えた方がいいぞ
>>208
ソース出してみ
>>209
Copy on writeを使わない実装よりは大幅に軽いけどメモリー空間とかを準備しなくて済むスレッドよりは重いよ
213:デフォルトの名無しさん
22/06/16 06:36:56.71 GA9mXaJg.net
>>205
そうだった。勘違いしてた。
pythonで流行りの並列処理をやろうとしたらマルチプロセスだった。何を言ってるのか わからねーと思うが(以下略)
214:デフォルトの名無しさん
22/06/16 07:01:31.35 ilsRfae9.net
>>199
ユニプロセッサでも例えばI/O待ちやユーザ入力待ちしている間にできることをやっとくんだよ
215:デフォルトの名無しさん
22/06/16 07:17:28.07 lg2Mpz7e.net
例えばシングルスレッドのみを利用のサーバーでも
その中で非同期タスクを1万個動かしてクライアント同時接続1万個の処理が可能
ほとんどがネットワーク待ちとディスク待ちだから非同期ならばそれだけ同時に並行処理(≠並列処理)できる
216:デフォルトの名無しさん
22/06/16 07:30:29.25 lg2Mpz7e.net
もし同期プログラミングしか出来ないと
その多数のクライアントを捌くためにスレッド数を増やすことで対応することになるが
スレッドリソースを喰うため大きいためスレッド数を増やせず
スレッドスイッチングも重いため圧倒的に不利となってしまう
217:デフォルトの名無しさん
22/06/16 08:51:16.63 ilsRfae9.net
ネットのサーバーは本質的にマルチタスクで
たとえシングルで力技かましてても外から見て複数のタスクを同時にこなしている
218:デフォルトの名無しさん
22/06/16 09:12:07.56 LWbVArCN.net
1対1スレッドがマルチプロセッサ使えて実装が楽で悪いことないよね
219:デフォルトの名無しさん
22/06/16 09:53:32.18 JxXqg7BH.net
>>216
それは初心者まで
普通は非同期に処理する
220:デフォルトの名無しさん
22/06/16 10:11:35.67 LWbVArCN.net
>>217
非同期のスレッドってどういうのを指すの?
221:デフォルトの名無しさん
22/06/16 11:53:53.45 ilsRfae9.net
マルチスレッドは基本的に非同期だけどな
必要に応じてミューテックスやシグナルで待ち合わせする
222:デフォルトの名無しさん
22/06/16 16:20:36.89 OqC2jk+r.net
ノンブロッキング=非同期でいいのかな
223:デフォルトの名無しさん
22/06/16 16:31:27.35 WGtrzJPY.net
いいよ違うけど
224:デフォルトの名無しさん
22/06/16 17:24:48.01 Vxm/sO96.net
しかしまあどこかにライブラリを作ってる人がいるんだけど、その事実を認識できんプログラマというのはおるよな
225:デフォルトの名無しさん
22/06/16 17:38:45.90 5Mp0JkOM.net
ジャップにはOSS読んだり一次情報確認しにいく文化がそもそも無いからな
226:デフォルトの名無しさん
22/06/16 17:39:26.55 T9ZCQ85W.net
非同期プログラミングでは多くの言語でPromiseもしくはFutureと呼ばれる同じ概念の抽象化を用いて行なう
つまりこれから行われることを期待する未来の約束という抽象化したものに次々と託していくことで
プログラムコードの見かけ上の記述順とは異なり並行して非同期に複数のタスクが走ることで非常に効率的に実行
それらは一つのスレッド内で何十も何千も非同期に並行して動かすことが可能であるがマルチスレッドを使えばさらにそのコア数倍を動かせる
>>216
それだと効率が悪すぎてお子様向け
227:デフォルトの名無しさん
22/06/17 01:35:07.48 UGOae7/Q.net
プログラマー目指してるんですが、C++やるなら03と11の両方勉強しておいた方がいいですか?
228:デフォルトの名無しさん
22/06/17 01:42:46.88 OGNvxC9Z.net
はて?
C++11やればC++03もカバーしたことになるからC++11以降一択だよ
細かいことはコンパイルエラーが出てから考えればいいんだよ
229:デフォルトの名無しさん
22/06/17 03:02:19.62 2abskYGH.net
今C++03の案件とかあるんかな
あっても正直関わりたくないな
230:デフォルトの名無しさん
22/06/17 05:01:48.39 GnlLskBw.net
autoなしで書きたくない
231:デフォルトの名無しさん
22/06/17 05:20:26.86 zopwF6/i.net
何を言うとるか
今憶えるべきはC++20に決まっとろうが
232:デフォルトの名無しさん
22/06/17 09:56:39.22 UGOae7/Q.net
C++11を勉強しておけば良さそうですね
独習C++をやります
ありがとうございました
233:デフォルトの名無しさん
22/06/17 13:24:12.81 SEHo94h9.net
c++11で書いたコードをC++20でコンパイルしようとしたらエラー出まくりんぐ
教えてエロい人
234:デフォルトの名無しさん
22/06/17 13:40:57.68 zopwF6/i.net
実例出してくれれば解説できる・・・かも知れないw
235:デフォルトの名無しさん
22/06/17 14:29:06 sTQyUMOv.net
ソースを貼らないワカランゴよ
236:デフォルトの名無しさん
22/06/17 15:09:02.12 SEHo94h9.net
スマソ、C++11じゃなくてC++14だた
vector<int> unkos;
for each (auto unko in unkos) { }
これがエラー出てコンパイル通らない
環境が壊れてるんかな?
IDEはVS2022 17.2.4
237:デフォルトの名無しさん
22/06/17 15:34:14.31 tDJ88+fU.net
C#かなんかと混ざってない?
vector<int> unkos;
for(auto unko : unkos) { }
238:デフォルトの名無しさん
22/06/17 15:55:37.01 SEHo94h9.net
しょっちゅうC++とC#往復するから頭おかしくなるな
でもコードスニペットで自動的にfor each (auto unko in unkos)みたいな構文に補完されるんだよね
てか以前までこれでビルド通ってたし
VSのバグかな?
239:蟻人間
22/06/17 16:03:50.87 GnCwfahh.net
拡張子間違ってない?
240:デフォルトの名無しさん
22/06/17 16:10:31.33 SEHo94h9.net
確認したけど.cppと.hで試してる
C++17まではビルド通るけどC++20にするとエラーだわ
241:デフォルトの名無しさん
22/06/17 16:18:22.80 G79h5Zer.net
C++11 以前はもう忘れていいとは思うけど
以前と以降の違いは知ってた方が良いとも思う
242:デフォルトの名無しさん
22/06/17 16:19:50.60 2abskYGH.net
for each inはmsvcの独自拡張らしいな
243:デフォルトの名無しさん
22/06/17 16:20:08.55 G79h5Zer.net
>C++17まではビルド通るけど
マジか?
244:デフォルトの名無しさん
22/06/17 16:38:08 SEHo94h9.net
>>240
やっぱVS固有の話だったか
>>241
マジ
ただおま環かも
245:デフォルトの名無しさん
22/06/17 17:16:26.61 iqIqAnpY.net
参照&とか、左辺値とか、moveとか、copyとか、体系的に学びたいんだけど、
その辺、いいKindle本ない?
オススメない?
246:デフォルトの名無しさん
22/06/17 17:24:24.76 G79h5Zer.net
その質問が出て来る時点で既に体系的に知ってるだろ
247:デフォルトの名無しさん
22/06/17 17:42:51.03 2abskYGH.net
C++の書籍紙の本ばっかだよな
ネット上のドキュメント漁れって事なんだろうけど
248:243
22/06/17 18:07:25.78 iqIqAnpY.net
C++をclassの使えるCとしか使ってなくて(そんなに使ってない)、
んで参照&を使った左辺値?を見よう見真似で使ったんだけと、うまくいかなくて(結局ポインタを使った参照を使いました)
あとRustの本読んだらmove、copyを知って、その概念はC++でもあるとどこかで見て、体系的に知りたいと思いました。
Webだと細切れなのでKindle本で読みたいと思います。
オライリーのEffective modern C++なんか適当でしょうか?
でもKindleないんだよなぁ
249:デフォルトの名無しさん
22/06/17 18:20:30.66 sBNVv+WO.net
kindleはないけど
オライリーは公式に電子書籍あるよ
250:デフォルトの名無しさん
22/06/17 18:22:00.18 OGNvxC9Z.net
所有や共有の機能が欲しいなら shared_ptr 使えば良いだけだろ
251:デフォルトの名無しさん
22/06/17 18:41:26 sTQyUMOv.net
>>234
こ、こんな裏技が((( ;゚Д゚)))
252:デフォルトの名無しさん
22/06/17 18:48:02 OGNvxC9Z.net
それはつまりinが予約語になっているってことでもあるのかな
253:デフォルトの名無しさん
22/06/17 18:53:09 aIhMpcwB.net
C++/CLIなんじゃないの
254:デフォルトの名無しさん
22/06/17 19:29:48.79 SEHo94h9.net
いや、たしかにC++プロジェクトやぞ
数年前から使ってるVSプロジェクトではC++14→ビルド通る、C++17→ビルド通る、C++20→エラー
今新規で作ったVSプロジェクトではC++14→エラー、C++17→エラー、C++20→エラー
意味フすぎて漏れそう
URLリンク(docs.microsoft.com)
調べたらfor each構文は非推奨とは出てきたけど
ほならね、コードスニペットで非推奨の構文出すなやと言いたい
しかもそれでビルド通らねえ
まあVSアプデが原因っぽい感じするし、大人しく推奨の構文使うようにするよ
お騒がせしてスマソ
255:デフォルトの名無しさん
22/06/17 19:38:58.95 bL392TY5.net
>>251
多分それが正解
URLリンク(docs.microsoft.com)
256:デフォルトの名無しさん
22/06/17 19:41:36.72 bL392TY5.net
>>252
property String^ MyStringProperty;
みたいな構文見た時点で気づけよ...
257:デフォルトの名無しさん
22/06/17 19:48:56.19 sTQyUMOv.net
>>254
両方使えるって書いてあるけど
> この非標準のキーワードは、C++/CLI プロジェクトと C++ ネイティブ プロジェクトの両方で使用できます。 ただし、これを使用することはお勧めしません。
258:はちみつ餃子
22/06/17 19:50:56.98 Ic1RtTnb.net
>>246
「江添亮のC++入門」は比較的ハードルが低く基礎を理解できるように書かれてると思う。
(別途学習する前提で継承まわりをごっそりと省いたりしてるけど……)
元になった原稿は無料で公開されてて、 Markdown で書かれているので
適当なツールを使えば Kindle で読める形式にもできるんじゃないかな。
259:デフォルトの名無しさん
22/06/17 19:59:43.68 SEHo94h9.net
>>254
コード読めるのに文章読めないの?
260:デフォルトの名無しさん
22/06/17 20:05:32.50 wjEVmEJW.net
C++/CLIはC++20で見捨てられてるので強制的にC++17としてコンパイルされる
昔から使ってるvcxprojなら知らん間に追加のオプションつけてたり、今のVSで規定値が変わったりしてるだろうからビルドが通らないのもありうる。
ちょっとしたプログラムならwandboxとかでgcc/clang試してみてもいいんじゃない?
MSVCは独自拡張とか、標準ライブラリでも新しいバージョンのものを先行実装してたりするよ
261:はちみつ餃子
22/06/17 20:06:26.13 Ic1RtTnb.net
MSVC を使ってないからよう知らんけど拡張を抑制するオプションとかないの?
262:デフォルトの名無しさん
22/06/17 20:22:45.13 k/CpGzsk.net
C++/CLIはC++ではないのだよ!
263:デフォルトの名無しさん
22/06/17 20:37:27.17 2abskYGH.net
日本語読めない奴が多いなしかし
264:デフォルトの名無しさん
22/06/17 23:05:28.99 nJOnHnXa.net
C++/CLI捨てられちゃうのか
じゃあ今後C#とかとのグルーには何使えばいいの?
265:デフォルトの名無しさん
22/06/17 23:21:00.48 cGGfCEhk.net
漢は黙ってP/Invoke
266:デフォルトの名無しさん
22/06/17 23:39:45.06 OGNvxC9Z.net
中国人じゃない
267:人はどうすればいいですか?
268:デフォルトの名無しさん
22/06/17 23:43:23.56 +i8GyaaY.net
中国人に非ずば人に非ず。
269:デフォルトの名無しさん
22/06/17 23:57:35.61 OGNvxC9Z.net
PCREやbregonig.dllなどのPerl互換正規表現ライブラリでは、日本の漢字と中国の汉字が同じ\p{Han}に一絡げにされてるから注意しなよ
270:デフォルトの名無しさん
22/06/18 20:22:14.05 jYGrUTdl.net
ユニコードだからってことじゃなくて?
271:デフォルトの名無しさん
22/06/19 08:07:25 w/1mSXjt.net
www.mercari.com/jp/search/?keyword=hr400p
こういう安い中古チューナ買って、Coinyをスカパープレミアム放送のICカード化して、
スカパープレミアムのチャンネル全部見れるし、USB HDDに録画フリー。
【avoCADO】 Coiny card Part4【仮想通貨】
スレリンク(avi板)
272:デフォルトの名無しさん
22/06/19 09:39:07.73 G0R2gGHa.net
誤爆かな
273:デフォルトの名無しさん
22/06/19 15:42:17.20 pCkywCXr.net
夏休みの自由研究の成果を今ここに発表するのぜ、
2^(2^34)-1を計算するプログラムを最終的にオリジナルの9.26倍高速化すた、
↓↓↓先週のやつ↓↓↓
■ V3: ブロック6-step algorithm適用
URLリンク(ideone.com)
実行時間全体: 389.157479 sec
計算時間のみ: 185.163833 sec
↓↓↓先週のやつの改良版↓↓↓
■ V3.1: ブロック6-step algorithm適用、parallel for粒度変更(粗くした)+workメモリサイズ調整
URLリンク(ideone.com)
実行時間全体: 349.057446 sec
計算時間のみ: 151.493976 sec
計算時間のみ比較でオリジナルの9.26倍速、
274:デフォルトの名無しさん
22/06/19 15:42:37.86 pCkywCXr.net
計測条件:
CPU: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
メモリ32 GB
OS: Windows 10 Pro 64 bit
コンパイラ: Visual Studio 2019でビルド(x64)
OpenMP 有効(omp_get_max_threads() == 8)
計算結果は最後(2^(2^34)-1)のみ出力
(↑ソースコードのSAVE_ITM_RESULTマクロ定義をコメントアウト。元に戻せば前と同じになる。)
275:デフォルトの名無しさん
22/06/19 15:44:13.95 pCkywCXr.net
つなみに同じような調子で時間計測すると、(コードはV3.1のSHOW_CSM_TIMEを参照されたい、
■ V0: オリジナル
URLリンク(ideone.com)
実行時間全体: 1586.875607 sec
計算時間のみ: 1403.402228 sec
■ V1: C++書き換え版
URLリンク(ideone.com) (※ FIGとRADIXはそれぞれ5と100000に訂正
実行時間全体: 1611.894164 sec
計算時間のみ: 1421.579748 sec
■ V2: 倍速化(バッタフライ演算で書き直したやつ。OpenMP非使用
URLリンク(ideone.com)
実行時間全体: 622.790273 sec
計算時間のみ: 435.143622 sec
やったわ;;;
つまりV2はV0より3.23倍速く、V3.2はV0より9.26倍速いから2^8倍を達成したのであった、
276:デフォルトの名無しさん
22/06/19 15:57:54.28 pCkywCXr.net
じつはさらにL2キャッシュ利用帯域最大化版というのを作ってみたのやが
どうもV3と同等かやや遅くなるorz
■ V3.2: L2キャッシュ利用帯域最大化版
URLリンク(ideone.com)
実行時間全体: 399.591214 sec
計算時間のみ: 191.301385 sec
やっていることは、NをL2キャッシュサイズの1コア割り当て分の半分に収まる複素数の数、として、
巨大桁数のFFTを(2*N×N)桁のFFTに分解して個々の(2*N×N)桁のFFTを6-step algorithmで解いているのですだが
なんかコピーしつつ転置するの回数が増えるので速くならないみたい
あとV3.1が速かったりV3.2がEXPN_L2CHACHE_SZを18からいくら増やしてもそれ以上遅くならないのは
Intel(R) Smart CacheテクノロジーがL2キャッシュとL3キャッシュ間の帯域をうまいぐあいに有効活用してくれているっぽい
ここらになってくると詳細は調べようが無いので漏れもソフトウェアー呪術者にならざるおえない
277:デフォルトの名無しさん
22/06/21 20:57:53.90 MIxQo51/.net
そっか頑張ったね
278:デフォルトの名無しさん
22/06/21 21:17:43.90 EegZBjzo.net
相変わらず漏れとか加齢臭するスラング使ってんのか
279:デフォルトの名無しさん
22/06/21 21:26:26.57 5USpVKBQ.net
初老の漏れ易いジジイなんだろ
察して差し上げろ
280:デフォルトの名無しさん
22/06/21 23:41:17.67 Nd0elFbL.net
内容に関係のないクソみたいな指摘しかできないお前らも大概終わってるけどな
まあこんなとこじゃなくてブログとかSNSにまとめろよとは思う
281:デフォルトの名無しさん
22/06/22 00:04:15.50 nUS9+NCG.net
ジジイだから周りのこととかスレの流れとか見えてないんだろう
前頭葉が加齢で萎縮して空気を読む能力が衰えたのかな
282:デフォルトの名無しさん
22/06/22 02:07:39.75 mxrPsC3u.net
>>277
> 内容に関係のないクソみたいな指摘しかできない
ハァ?
文盲じゃなかったら本人だろコイツ
1の乗根じゃなくて整数環でFFTした方が誤差の意味でも速度の意味でも劇的に改善するって何度も指摘してるんだが
283:デフォルトの名無しさん
22/06/22 03:38:43.09 y9JQQK81.net
>>279
これ前スレからの流れなのか知らんかったわすまんな
どうりで批判が多いわけや
284:デフォルトの名無しさん
22/06/23 16:48:56.08 gevVgEYw.net
どうでもいい言葉尻に突っかかるやつ
若さを自慢したつもりになってるの?
尻の青さをバカにされてるだけだよ
285:デフォルトの名無しさん
22/06/23 18:18:04.50 5dy8Tjxk.net
プログラマの発言じゃないな
プログラムは1文字のタイプミスで全く違う挙動になるのだから
286:デフォルトの名無しさん
22/06/23 18:26:17.60 rC+mT8P4.net
偶によくC++読み書き出来ない奴がレスしてるんだけどどっから湧いてきてんの
287:
22/06/23 21:32:27.41 m7vQCh0J.net
いよいよ Java のクラスライブラリを C++ に移植しようと思っていますが、需要はありますか?
そろそろ共通のクラスライブラリが確立されてもいいと思っているのですが、あまりそんな話がないのが不思議です
288:デフォルトの名無しさん
22/06/23 22:23:51.49 R7SBWA0E.net
需要あるのでよろしくお願いします
289:デフォルトの名無しさん
22/06/23 22:27:04.30 YY1MWhdq.net
がんばれ!
290:デフォルトの名無しさん
22/06/23 22:59:01.86 lRxLFmXq.net
stdやboostじゃ不足か?
291:デフォルトの名無しさん
22/06/23 23:46:22.08 Q9NpIN8Z.net
>>284
見せてもらおうか!!
◆QZaw55cn4c謹製ライブラリの性能とやらを!!
292:デフォルトの名無しさん
22/06/24 00:00:51.28 KtheM8QT.net
>>287
OO な各言語で名前と機能が共通するライブラリの必要性を痛切に感じているのです
提供されるクラスライブラリが共通であれば、各種言語の純粋な潜在的能力に応じた評価が可能となります
293:デフォルトの名無しさん
22/06/24 00:02:46.32 KtheM8QT.net
>>288
性能よりも、各言語で名前と機能の紐づけが共通することを優先します
294:デフォルトの名無しさん
22/06/24 00:17:55.81 0z9KCe6G.net
Javaクラスどうこうよりもfinallyステートメントをどうするかなんでは
295:デフォルトの名無しさん
22/06/24 10:21:14.00 ZX81zd9Z.net
>>291
ああ、それ、ありましたね finally か、結構重たい課題ですね
296:デフォルトの名無しさん
22/06/24 10:44:21.40 K2we1Lar.net
お願いですから名前は短くしてくださいね
297:デフォルトの名無しさん
22/06/24 13:31:54.09 dbAYBMOA.net
>>282
template <typename T> を template <class T> と書いただけでジジイ呼ばわりするようなもんだぞ
誰もtypoの話なんかしてない
あ、1人だけいるのかw
298:デフォルトの名無しさん
22/06/24 14:41:08.15 frIgvkyi.net
?
typename と書く方が文法的に新しいの?
299:はちみつ餃子
22/06/24 15:47:15.76 STd+R5JH.net
>>295
いいえ。 少なくとも ISO の規格としては最初から有りますし (型引数のところに書く分には) 機能的な差もないです。
だから、 >>294 は単なる表記の揺らぎにすぎない (どちらが間違いというものでもない) 例として出しているんだと思います。
300:デフォルトの名無しさん
22/06/24 18:40:02.03 dbAYBMOA.net
>>295
CでC89以前にK&R Cがあったように
C++でもC++98以前にARM C++があった
ISO限定で言うと餃子の言うようになるが
もっと遡るとtypenameは後からできたもので
ARM C++では<class T>という書き方しかできなかった
301:デフォルトの名無しさん
22/06/24 21:00:22.61 VuV41aeC.net
三十年くらい前にC++primerだったかな?
「typenameとclassならclassのほうで書いとけ、
なぜならタイプ数が少ないから」
みたいに書いてるところがあって(半分ジョークなんだろうな)
最初にそれで刷り込まれてるからclassでしか書いたことない
302:デフォルトの名無しさん
22/06/24 21:15:01.67 uqZOpMdD.net
structと書くことも
303:デフォルトの名無しさん
22/06/24 22:03:13.47 JvzMg+3d.net
C++ってstaticメソッド継承されますっけ?
Parent.Hoge()ってChild.Hoge()としても呼べます?
あるスクリプト言語を使ってた時にどうやら継承されてなかったようで、言語ごとに違うのか気になりました
304:デフォルトの名無しさん
22/06/24 22:13:15.23 zVbF8VlC.net
はい。
305:はちみつ餃子
22/06/24 22:31:13.16 STd+R5JH.net
型引数は class と書いてあってもクラスに分類されない型 (スカラ型など) を受け取れるのでなんか変な気分ではあるな……。
それでも私は class キーワード派だけど。
306:デフォルトの名無しさん
22/06/24 22:46:12.30 TGTBUWMm.net
modern C++ designの著者は、ユーザー定義型のみを想定してる場合はclass,
組み込み型も想定してる場合はtypenameにしてると書いてたな
307:デフォルトの名無しさん
22/06/24 23:16:18.24 jv7PClvp.net
今はそういうのはコンセプトの仕事だからなあ
308:デフォルトの名無しさん
22/06/25 10:55:48.71 23CjKpU2.net
>>300
private とか protected とか知ってるか
309:デフォルトの名無しさん
22/06/25 11:54:25 xaZtK0Rm.net
private踏んだりしたらエラーメッセージ見れば済む話だと思うが
class継承のときのpublicつけ忘れでprivate扱いになるのはやらかしてそう
class C{
public: static void f(){}
};
class D : public C{};
int main(){D::f();}
310:デフォルトの名無しさん
22/06/25 12:22:32.29 UASxpJXI.net
>>306
エラーにならんが、何が言いたい?
311:デフォルトの名無しさん
22/06/25 13:43:07.60 xaZtK0Rm.net
>>307
class継承のpublic忘れるとエラーになるよと言う話
2箇所あるpublicのどっちか消してみなよ
312:デフォルトの名無しさん
22/06/25 13:45:13.45 KYOYlq4y.net
static関係なくね?
313:デフォルトの名無しさん
22/06/25 13:48:22.71 23CjKpU2.net
publicつけ忘れで
314:デフォルトの名無しさん
22/06/25 13:49:20.71 23CjKpU2.net
>>309
staticもつけ忘れたのか
どんくさいなお前
315:デフォルトの名無しさん
22/06/25 17:46:22.26 x+PfXs9r.net
>>279
数論変換はしばし待たれよ卿、
NTT有名素数modとしてよく使われるのは
998244353 = 2^23 * 119 + 1
やそうやがこれ単独では2^23桁で表せる数値までの計算しかできないことは確定的に明らか
10^5進数表記をとったとして2^(2^34)-1はで表して
1034331189 > 2^29 桁 >> 2^23桁
なのでストレートにやるとしたら足りないのであっる
一方Six-step algorithmを導入したらば2^15桁までのFFTで済むから、NTT化が射程に入ってくる
というわけで漏れは天才の判断としてまず1の累乗根のFFT×Six-step algorithmを
OpenMPで激速化することを極めんとしているわけや;;;
316:デフォルトの名無しさん
22/06/25 17:47:57.25 x+PfXs9r.net
それと>>279の口ぶりでは数論変換にしたら桁違いに早くなるみたいに読めるが
double同士の掛け算2^15回分が
int64同士の掛け算2^15回分に高速化される程度であって現行のレコード145 秒が100 秒切れるようになるか
っていうとビミョー
はい論破、
317:デフォルトの名無しさん
22/06/25 18:01:39.85 x+PfXs9r.net
>>302の行間に書いてある通り、型引数意外の状況でだがtypenameキーワードが必要なケースが存在する
ていうかこれ↓
URLリンク(faithandbrave.hateblo.jp)
逆に言うと
それ以外ならclassでええやん、、、
318:デフォルトの名無しさん
22/06/25 18:04:28.52 x+PfXs9r.net
アンカーミスったorz
誤: >>302
正: >>296
319:デフォルトの名無しさん
22/06/25 18:25:49.29 XIyeaAEp.net
またくっさいチラ裏ジジイが湧いたのか
320:デフォルトの名無しさん
22/06/25 18:35:28.83 x+PfXs9r.net
ハイハイここは高尚なインターネッツでつね;;;
321:デフォルトの名無しさん
22/06/25 19:23:01.22 /zwkJ/mi.net
>>314
なんできゅうにそこのtypenameの話しだすの?
単に型パラメータんとこの話をずっとしてたんやないん今まで
322:デフォルトの名無しさん
22/06/25 20:46:58 JEWFr+UF.net
>>317
相変わらず誤字を直せねーのな
323:デフォルトの名無しさん
22/06/25 21:53:15.48 cTvyoIxe.net
次のセールってハロウィンなっちゃう?
324:デフォルトの名無しさん
22/06/25 23:44:17.32 BChKe9nl.net
何の?
325:デフォルトの名無しさん
22/06/27 01:22:11.44 lmKSzJyY.net
steamかな
326:デフォルトの名無しさん
22/06/29 12:39:09.60 CyBPFABm.net
>>300
>C++ってstaticメソッド継承されますっけ?
継承と言うか「可視」ではある。
>Parent.Hoge()ってChild.Hoge()としても呼べます?
staticメンバを参照したい場合は、インスタンス・メンバとは書き方が違って、
Parent::Hoge() や Child::Hoge()
と書く。
でも微妙だな、Child::Hoge()で呼び出せるかどうか、実験の必要はある。
327:デフォルトの名無しさん
22/07/01 12:57:20.10 Niu9C9y8.net
インスタンスからも static メソッドは呼び出せるよ
URLリンク(ideone.com)
328:デフォルトの名無しさん
22/07/01 14:54:49.17 oLSBM8mZ.net
>>323
なぜ継承を可視と言い直すんだ?
329:デフォルトの名無しさん
22/07/01 14:57:39.83 to5rXuQ/.net
ヴァーチャンが使えないからだろ
330:デフォルトの名無しさん
22/07/03 05:57:55.66 S0pZ0Csa.net
C++コンパイラっていつからconst char*型引数がbool型引数に暗黙変換されるようにな�
331:チたんだ? 以下のような内容が警告なしでコンパイルできてしまうんだが int foo(bool bar); const char* ptr = "test"; foo(ptr);
332:デフォルトの名無しさん
22/07/03 07:53:18.35 K2/9xttr.net
スカラ型がboolに暗黙変換できるのは太古から変わってない
int (*p)(bool) = foo;
std::cout << foo; //出力は「1」だがfooが1番地から開始ということではない
333:デフォルトの名無しさん
22/07/03 07:54:43.51 K2/9xttr.net
pいらんかったな、わりいわりいw
334:デフォルトの名無しさん
22/07/04 13:56:35 QZHaDXek.net
みなさまこんにちわ!
暑い日が続きますが質問させてください。
namespace hoge
{
class foo
{
public;
void set(class member_ptr* arg){ptr=arg;}
private;
class member_ptr* ptr=nullptr;
};
}
という名前空間を作成し、それをmember_ptrが定義されているソース(およびヘッダー)ファイルで使用したいです。
ところがmember_ptr*をset()に渡したとき、「hoge::member_ptr*は member_ptr*と互換性がありません」というエラーが出てしまいsます。
名前空間をはずすorポインタ関連の記述をコメントアウトさせると普通に動作するので、大まかなコード自体は問題ないと思うのですが……
リインタプリットキャストも出来ず困り果てておりますが、名前空間内部のメンバにポインタは持たせない方がいいのでしょうか?
それとも名前空間での不完全クラスでの定義がまずいんでしょうか?
ほとほと困り果てております。
わかる方がいらっしゃいましたらお教えいただけれう゛ぁ……
先感謝!
335:はちみつ餃子
22/07/04 14:27:48.07 3k8jHKP2.net
>>330
問題が再現するコードを提示してください。
336:デフォルトの名無しさん
22/07/04 14:31:47.29 SMoN2Nle.net
へたくそ
337:デフォルトの名無しさん
22/07/04 17:28:39.11 nt0V70V1.net
どっかで
namespace hoge{
class member_ptr;
}
class member_ptr;
みたいなことやってるような気がする
前方宣言(か実体定義)が別の名前空間にあって、同じclassを見てるつもりで別のclassを見ているだけじゃない?
338:デフォルトの名無しさん
22/07/04 17:47:01.88 KuJlBNV3.net
>>331
長文になってしまいますがお許しください。
────────
//ptr.h
class ptr
{
public:
ptr(int arg) { a = arg; }
int a = 0;
};
────────
//Test.h
namespace Test {
class innerTest
{
public:
class ptr* get_mPtr();
private:
class ptr* mPtr;
};
}
────────
//Test.cpp
#include "Test.h"
#include "ptr.h"
ptr* Test::innerTest::get_mPtr()
{
return nullptr;
}
//↑この定義部分で「宣言に互換性がありません」というエラーが出てしまいます
339:はちみつ餃子 ◆8X2XSCHEME
22/07/04 18:04:55 3k8jHKP2.net
>>334
class キーワードを付けた場合にはクラスの宣言を同時にしたものとみなされる。
つまり class ptr* get_mPtr(); と class ptr* mPtr; は「このスコープで」 ptr を宣言したかのように扱われる。
もちろん実際には innerTest の中では ptr の定義はないので不完全型のままだが、
この ptr は Test::innerTest::ptr のつもりで解釈されてる。
グローバル空間で定義している ptr とは別物なので別物というエラーになるわけ。
340:デフォルトの名無しさん
22/07/04 18:34:14.66 PrdXwxk2.net
class ptr;
namespace Test {
...
341:デフォルトの名無しさん
22/07/04 18:53:01.66 tfDB1jS/.net
Cのstructと同じ感覚でclassって書いちゃってるのかこれ
342:デフォルトの名無しさん
22/07/04 18:59:50.67 XQTVc721.net
>>335
> この ptr は Test::innerTest::ptr のつもりで解釈されてる。
Test::ptr だね。
URLリンク(timsong-cpp.github.io)
343:デフォルトの名無しさん
22/07/04 19:27:20.38 KuJlBNV3.net
>>335!336,338
ありがとうございます!
おっしゃる通りに名前空間の外で前方宣言し、ソース部分で定義したらうまくいきました!
特に理由がない限り、名前空間内部で定義してはいけない(戒め)
ありがとうございました!
344:デフォルトの名無しさん
22/07/05 15:17:54.21 CUrAgxNd.net
有害だな
345:蟻人間
22/07/05 20:29:56.62 ol9myr0e.net
You guy
346:デフォルトの名無しさん
22/07/05 23:44:59.73 tIUWM2dq.net
VB.NETからバイナリをC++(JNI)に渡して受け取ったバイナリをJavaに渡したいんですけど、C++で受け取ったBYTEをjobjectに変換する方法が分かりません。
どなたかご存知でしょうか。
347:デフォルトの名無しさん
22/07/06 23:58:31.79 Hb7nTur+.net
C++勉強中です。ムーブコンストラクタについて教えてください。
ムーブコンストラクタは、要はムーブ元の指すポインタをムーブ先に変更しているだけだと思います。
これはconstなしコンストラクタでも実現できると思いますが、意図を明示するためにコンストラクタが分かれていると思っていいですか?
また、ムーブコンストラクタの仮引数が右辺値参照になっている(std::moveした右辺値を渡す)理由がよく分からないのですが、これは決まり文句として覚えるしかないでしょうか?
348:デフォルトの名無しさん
22/07/07 00:12:38.45 wEF1aVE0.net
>>343
まさにその発想で作られたauto_ptrとかいうスマポ(廃止済み)がとんでもねえゴミカスだったから
その教訓でコピーとムーブが分けられたんだよ
349:デフォルトの名無しさん
22/07/07 00:13:26.51 owvrtcUU.net
ムーブって、所有者が移転してると考えた方が
場所なんてどうでもいいでしょう
350:はちみつ餃子
22/07/07 00:38:46.12 6JbvD3+y.net
>>343
右辺値は大抵の場合に一時オブジェクトだからどうせすぐに破棄される。
後で別の場所で使うということがないと期待できるから内容を移動してしまっても問題にならないんだ。
だから右辺値を入力とするときは原則としてムーブ扱いにする。
351:デフォルトの名無しさん
22/07/07 08:00:15.88 dqsYDet1.net
多分、右辺値参照イコールmoveと覚えてしまってるのでは?
C++11より前は一時オブジェクトとそうでないものを文法上区別することが出来なかったのよ
moveはあくまでキャストに過ぎない、一時オブジェクトでないものを一時オブジェクト扱いにしてるだけ
352:343
22/07/07 23:27:53.10 jxXWRXC4.net
一時オブジェクトにキャストしてすぐ破棄されるようにしたと言っても、
右辺値参照に代入しているのでヌルポインタにするまでは使い続けられますよね
そもそもstd::moveで一時オブジェクトにキャスト、これを右辺値参照で束縛して有効期間を延ばす…って
初めから普通の変数を使えばいいのでは?と思ってしまいました
ムーブを表すための仕組みとして&&とstd::moveの組み合わせが追加されたということなんでしょうかね
353:デフォルトの名無しさん
22/07/07 23:44:43.71 a8KVNXrY.net
>>348
結局そのあたりも含めてC++で複雑化した様々な点を全てシンプルに綺麗に整理し直して分かりやすくした言語が望まれてRustが登場したんだろうね
354:はちみつ餃子
22/07/08 00:13:39.16 5BE4kGYi.net
>>348
なんだかその文面からは仕組みを理解しているようには見えない。
355:はちみつ餃子
22/07/08 00:21:33.36 5BE4kGYi.net
>>348
何を言いたいのか全然わからない (仕組みを間違って理解しているか用語が誤っているかしている) ので
もうちょっと具体的に実例か何かで示してみて。
356:デフォルトの名無しさん
22/07/08 06:38:25.68 MdbO63iw.net
教科書の言葉適当に並べて分かったふりしてる感がすごい
357:デフォルトの名無しさん
22/07/08 08:04:48.18 0Bd0SGWI.net
ムーブは「所有権」をムーブさせるものなので、所有権という概念がないと理解できん
358:デフォルトの名無しさん
22/07/08 08:29:23.83 ZqNcNR35.net
>>349
引数渡しのデフォルトをmoveにしているのは失敗だと思うけどな。
性能優先でそうしたんだと思うけど、そういった技術的説明無いから設計ミスにしか見えない。
359:デフォルトの名無しさん
22/07/08 09:59:25.74 XQyLgyG5.net
>>354
あれは大正解
実際に色々なプログラミングをするとよくわかってくる
Rustは上手く設計されていることがわかる
360:デフォルトの名無しさん
22/07/08 10:12:31.24 yJZoYI93.net
rustのご本が高くてのう
361:デフォルトの名無しさん
22/07/08 10:20:08.07 u/BCh/UE.net
右辺値参照って概念的に難しいよね
そもそも右辺値とはなんぞやというところから、一時オブジェクトの生成とそれが破棄されるまでのコンパイラ側の仕組みを的確に理解する必要がある
こんなのよく思いついたなと感心はするけどw
362:デフォルトの名無しさん
22/07/08 10:47:23.92 lp4DRBe8.net
テンプレート関数で頻繁に出現する=演算子コピーによるオーバーヘッドを減らす必要に迫られただけの話ジャマイカ?
363:デフォルトの名無しさん
22/07/08 10:52:14.97 u4+He/YT.net
>>356
Rust The Book (日本語版)
URLリンク(doc.rust-jp.rs)
Rust by example book (日本語版)
URLリンク(doc.rust-jp.rs)
Rust cookbook (日本語版)
URLリンク(uma0317.github.io)
Rust edition guide (日本語版)
URLリンク(doc.rust-jp.rs)
Rust API guideline (日本語版)
URLリンク(sinkuu.github.io)
Rust nomicon book (日本語版)
URLリンク(doc.rust-jp.rs)
Rust async book (日本語版)
URLリンク(async-book-ja.netlify.app)
Rust WASM book (日本語版)
URLリンク(moshg.github.io)
Rust embeded book (日本語版)
URLリンク(tomoyuki-nakabayashi.github.io)
Rust enbeded discovery (日本語版)
URLリンク(tomoyuki-nakabayashi.github.io)
Rust Design Patterns (日本語版)
URLリンク(qiita.com)
URLリンク(qiita.com)
Rust API guideline (日本語版)
URLリンク(sinkuu.github.io)