[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/24 15:14 / Filesize : 290 KB / Number-of Response : 1013
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part161



1 名前:デフォルトの名無しさん mailto:sage [2022/05/21(土) 21:23:29 ID:kYXfaM+5.net]
前スレ
C++相談室 part160
https://mevius.5ch.net/test/read.cgi/tech/1649979572/

2 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2022/05/21(土) 21:24:45 ID:JD6rd3hb.net]
>>1


3 名前:デフォルトの名無しさん mailto:sage [2022/05/21(土) 21:44:08.96 ID:G0xPeqqL.net]
C(ちんちん)+(ぷら)+(ぷら)

4 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 00:57:58.97 ID:SQ8NOhuX.net]
おいおいまだ続けんのかよ!

5 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 03:20:20.13 ID:sZoQvYay.net]
ODRってC++処理系の仕様?
処理系はODRの記述を含まない仕様だけあればその通り作ったら
合理的な手間で検知可能な範囲のODR違反コードをエラーにする
ふるまいになるというのが当然で、つまりODRは仕様の結果であってODRを仕様に含めるのは論理的に冗長という印象

どっちかというとODRは正しく動くためにプログラマーが従わねばならないルール、という認識やったわ、
この観点ではinlineがODRの例外というのは例外も糞もなくてそんなプログラムは書いたらあかんからODR違反
コンパイラが合理的な手間でそれを検出できなかったり、それがあってもコードの動きに破綻が無いこととは関係無い
的な、

6 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 09:08:20 ID:1lbS1FjX.net]
ちんちん!シュッ!シュッ!シュッ!

7 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2022/05/22(日) 09:12:58 ID:9X/55aF0.net]
>>5
One definition rule は仕様に項目がある。
https://timsong-cpp.github.io/cppwp/n3337/basic.def.odr

インライン関数は同じアドレスを持つ (事実上統合することの要求) というのも仕様にある動作。
https://timsong-cpp.github.io/cppwp/n3337/dcl.fct.spec

no diagnostic と書いてある部分については (可能であれば処理系も検出するけど) どちらかというとユーザに対する要求というニュアンスはあるかも。

8 名前:デフォルトの名無しさん [2022/05/22(日) 19:47:14.24 ID:WUnKKX5R.net]
有料無料関係なしで最高のIDEってなに?

9 名前:ハノン mailto:sage [2022/05/22(日) 19:52:14.59 ID:rj0GqvkC.net]
>>7
>インライン関数は同じアドレスを持つ (事実上統合することの要求)

それはもうインラインではないですね…
そうではなくて、extern なインライン関数をリンクする際には、同一のアドレスであるべき、という意味でしかないでしょう、つまり私の実装案

https://mevius.5ch.net/test/read.cgi/tech/1649979572/996
>実装的には inline のついた関数定義が外部にリンクされる可能性があれば、すなわち extern な iniline 関数があれば、リンクのためのコード体を、各所に inline に展開されるコード体とは別に(こっそり)用意しておく、見たいな感じで十分に実装可能ですね

を支持する内容であり、extern な inline 関数において定義を持たないコンパイル単位にでは inline の指示があっても inline しなくてもいいといっているに等しいですね‥‥

7.1.2.4
(略)外部リンクをもつインライン関数は、すべての翻訳単位で同じアドレスを持たなければならない。
外部インライン関数内の静的ローカル変数は、常に同じオブジェクトを参照する。
externインライン関数の本体内の文字列リテラルは、異なる翻訳単位で同じオブジェクトを指す。

10 名前:はちみつ餃子 mailto:sage [2022/05/22(日) 20:04:27.44 ID:9X/55aF0.net]
>>9
見かけ上は同一に見える (アドレスを取らずに呼び出すときに限ってインライン化できる) ことを保証するという意味だよ。
インライン化できる条件を整えておきたいということと矛盾しない。



11 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 20:07:42.95 ID:ZvvsRMN9.net]
>>8
俺が通ってる外国のコミュニティでその質問が出ると毎回Visual StudioでFA?って回答が帰ってくる
ネタで言ってるのか本気で言ってるのかは知らない

12 名前:はちみつ餃子 mailto:sage [2022/05/22(日) 20:15:45.42 ID:9X/55aF0.net]
>>8
人によって使いやすさって違うからアドオンとかドキュメントの量とかが重要になってくるんだよ。
いくら潜在的に良い出来栄えであってもちょっとしたカスタムを全部自分で書かなきゃならないようでは面倒くさすぎる。
どこをどういじればいいのかいちいちソースコードを見ないとわからないのではダルい。
なんだかんだ不満があってもユーザ人口の多いものは全体としては良い選択になりがち。 物量重要。

13 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 20:19:45.26 ID:sBUJB3wj.net]
vs以外だとIDEっていうよりエディタとコマンドでやってるイメージ
ボーランドとか死にかけだしなあ

14 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2022/05/22(日) 20:25:35 ID:9X/55aF0.net]
>>13
LSP が現れたせいで処理系と統合された開発環境の価値が薄れた感がある。

15 名前:デフォルトの名無しさん [2022/05/22(日) 20:37:44 ID:WUnKKX5R.net]
>>11
ググった感じだと海外では無料版が多いように感じたw

>>12
日本も海外もEclipseとかが人気みたいなのでEclipseから使っていきます

レスサンクスです

16 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 20:39:19 ID:rj0GqvkC.net]
>>10
つまり >>9 に同意する、ってことでしょう?

17 名前:はちみつ餃子 mailto:sage [2022/05/22(日) 20:50:26.55 ID:9X/55aF0.net]
>>16
>>9
> 定義を持たないコンパイル単位にでは inline の指示があっても inline しなくてもいいといっているに等しい
が結論だとしたらそう。 同意する。
むしろ定義を持つ翻訳単位でもインライン化しなくていい。

だから残る inline の意味は ODR の例外として機能するって部分になるわけ。

18 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 22:42:48.81 ID:rj0GqvkC.net]
>>17
なるほど。私の元の主張に反するのですが、規格上はそのように誘導されてしまうのですね…‥(呆然)

19 名前:デフォルトの名無しさん mailto:sage [2022/05/22(日) 22:53:10.16 ID:j/hmX3ds.net]
www.youtube.com/watch?v=uaUmAUMvs2o

20 名前:デフォルトの名無しさん [2022/05/28(土) 13:34:18 ID:kIghR+Cp.net]
C++入門書でオススメがあったら教えてください



21 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 13:51:21.59 ID:y4EmUyIA.net]
昔からC++を使ってる人が多いから最近の入門書なんて誰も知らん
https://cppmap.github.io/learn/books/

22 名前:デフォルトの名無しさん [2022/05/28(土) 14:07:22.40 ID:kIghR+Cp.net]
>>21
多謝多謝!

23 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 15:19:08.43 ID:72vE6z5l.net]
禿本の5、来ないね・・・

24 名前:はちみつ餃子 mailto:sage [2022/05/28(土) 15:44:53.73 ID:IqCM7SI4.net]
C++ はそれなりに歴史が長いから仕様も変わってるし思想や習慣の変化もある。

上述で私は「inline は ODR の例外の意味!」と主張したけどさ、 D&E を読むと (inline 指定導入初期の判断としては)
「コンパイラによるインライン化の判断がザコなので指定できるようにした」
という意味のことを書いてあって、大元はやっぱりインライン化の指定なんだよね……。

色んな事情が絡むし、単純に C++ が巨大なのでどうせ一冊でちゃんとした理解にはならないと思う。
適当なやつをどれから読み始めてもいいんじゃないかね。
まあ、あまり古い奴は避けた方がよいだろうというのが最低限の基準かな。

25 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 16:12:25.28 ID:m/lYnlWz.net]
C 言語でなぜかC++のコメント行がいつの間にか許されている不思議

26 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 16:25:05.55 ID:gMoQJtfo.net]
なぜかってC99でサポートされたからではなくて?

27 名前:デフォルトの名無しさん [2022/05/28(土) 17:21:17.26 ID:DrsyU/Zk.net]
違うでしょうなあ。

28 名前:デフォルトの名無しさん mailto:sage [2022/05/28(土) 19:31:09.65 ID:72vE6z5l.net]
> いつの間に

情弱からはこう見えるようだな

29 名前:ハノン mailto:sage [2022/05/28(土) 20:36:31.97 ID:HcUv+Nxj.net]
>>24
ふむふむ。なかなか一筋縄ではいかない大人の事情ってのがてんこ盛り、ってことですね
私もそろそろ C++ をやり直そうかな‥‥

30 名前:デフォルトの名無しさん mailto:sage [2022/05/31(火) 21:24:16.90 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/05/31(火) 21:37:16.47 ID:Cpwrpvdc.net]
コピーコンストラクタが

32 名前:トばれて、最終的にmapのunique_ptrがコピーできないってことか。。。
C++98の人間だし10年以上離れてたから最近のC++まったくわからんわ・・・
[]
[ここ壊れてます]

33 名前:デフォルトの名無しさん mailto:sage [2022/05/31(火) 21:49:44.41 ID:prs/eEEO.net]
>>30
あたりめえだろ
バカかお前

34 名前:蟻人間 mailto:sage [2022/05/31(火) 22:00:19.02 ID:eSF5ElRz.net]
rは*thisの別名。
*thisの所有物を*thisにコピー。だめ。
*thisよりも高位じゃないと。。。

35 名前:はちみつ餃子 mailto:sage [2022/05/31(火) 22:30:18.12 ID:+LJ4L5Ht.net]
根拠。
https://timsong-cpp.github.io/cppwp/n3337/container.requirements#tab:containers.allocatoraware

コンテナを代入するとき、コンテナの要素の型は CopyAssignable であり、
コンテナに対して CopyInsertable であることを要求する。

36 名前:デフォルトの名無しさん mailto:sage [2022/05/31(火) 23:45:41.75 ID:xnVZpK0y.net]
>>(前スレ)695
のFFTで2^(2^34)-1を計算する奴
https://ideone.com/xSaa6x
を倍速で動くようにしたったわ……!
↓↓↓
https://ideone.com/q0O74K

オリジナルが2200秒なところを962秒で計算完了
出力結果は一致
メモリ消費量はオリジナルと同等(完全in-place、sinテーブルは1GB(計算時間と誤差が劣化するがシュリンク可能))

37 名前:デフォルトの名無しさん mailto:sage [2022/05/31(火) 23:48:59.95 ID:xnVZpK0y.net]
さすがに天才の漏れも三角関数って何だっけというあたりからスタートしたので
日数がかかってしまったが、いまやバッタフライ演算を完全に理解したから
純アルゴリズム的には最善の実装になっていると言える(希ガス、

(参考)
基礎からの周波数分析(9)-「高速フーリエ変換(FFT)」
https://www.onosokki.co.jp/HP-WK/eMM_back/emm140.pdf

あとはメモリアクセスの時間局所性を改善して1000倍にする、

38 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 00:23:05.24 ID:0xwrfx4r.net]
こういうのに燃えてるような人が日本を支えていたのかもな

39 名前:デフォルトの名無しさん [2022/06/01(水) 07:38:09.36 ID:g+4BWW21.net]
過去形でワロタ

40 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 08:08:59.08 ID:X1odZl5o.net]
スペアナ以外に使い道あるのか



41 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 09:38:46.33 ID:0/3ltNwW.net]
>>37
アホか
数論変換も知らんゴミが夏休みの自由研究やってるだけ

42 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 10:00:14.05 ID:vvQTEkHX.net]
>>36
漏れや希ガスというタイポや、バタフライ演算とかいう大学2年の信号処理の課題で出る程度のアルゴリズムを自信満々に書いちゃうあたり、かわいそうな人なのかな

43 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 10:09:19.65 ID:IxX6jh1U.net]
その辺はタイポじゃなくて20年近く前の2ch語なのじゃ……
イタいことには変わりないが

44 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 10:31:05.57 ID:RHCtS9cS.net]
41がむしろ異常にみえる

45 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 10:39:26.49 ID:m3Paz3vX.net]
最近は大学2年で信号処理やってるのかい?

46 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 11:39:44.35 ID:vvQTEkHX.net]
>>44
うちは二年前期の専門科目だった

47 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 11:40:41.11 ID:XFKMacmT.net]
>>43
どう異常に見えるのか書いてない時点で…

48 名前:デフォルトの名無しさん mailto:sage [2022/06/01(水) 13:51:18 ID:pJ9e03Xl.net]
template <class T> void F(const T &t){ auto x = t; }
って関数があった場合、autoで推論(導出?)されるxの方はconst T&になるの?
ついでにここらへん分かりやすい資料があったら教えてほしい。

49 名前:はちみつ餃子 mailto:sage [2022/06/01(水) 14:22:19.84 ID:YMgHeGpL.net]
>>47
テンプレートの実引数推論と同じ規則が適用される。
つまり
template<class U> void foo(U u);
というテンプレートが仮にあったとして、これに
foo(t);
としたときの U の型がその場合の x の型になる。
故に x の型は T であって const も参照もつかない。

50 名前:デフォルトの名無しさん [2022/06/01(水) 22:01:40.23 ID:g+4BWW21.net]
auto&にすればconst参照も推論されるし、右辺値も取り得るならauto&&にしておけば間違い無いんだっけ



51 名前:はちみつ餃子 mailto:sage [2022/06/01(水) 22:56:35.59 ID:YMgHeGpL.net]
auto& x = t;
と書いた場合には上述 (>>48) の規則に当てはめると
template<class U> void foo(U& u);
と同等の推論をするし、
auto&& x = t;
と書いた場合には
template<class U> void foo(U&& u);
と同じ推論になるわけだね。

52 名前:デフォルトの名無しさん mailto:sage [2022/06/02(木) 02:04:50.78 ID:uWYOiZpw.net]
じゃぁ、あらゆる場面でauto&&と書くのはあり?

53 名前:デフォルトの名無しさん mailto:sage [2022/06/02(木) 08:19:43.47 ID:X8QTJG9M.net]
駄目

54 名前:デフォルトの名無しさん [2022/06/02(木) 10:55:52.02 ID:MPFVtYTL.net]
>>36
>>44-45
https://www.youtube.com/watch?v=sxkwdvuLHw4&list=PLmhf46XKsdmRM_cR4WBcO5fMPZ5d-L1YA

55 名前:デフォルトの名無しさん [2022/06/02(木) 10:56:54.96 ID:MPFVtYTL.net]
バッタフライってバッタとハエのことか

56 名前:デフォルトの名無しさん mailto:sage [2022/06/02(木) 11:39:13.84 ID:2jh3vW7l.net]
バッタのフライだよ
昆虫食

57 名前:デフォルトの名無しさん mailto:sage [2022/06/02(木) 22:50:27.49 ID:W32R/zzX.net]
>>37-46
んまー藻前らの言う通り
>>(前スレ)695 のオリジナルのプログラムが書き方が変にIQ高すぎたせいで
漏れが普通に書いたプログラムの方が速かったということかもしれませ
んね、

しかしこれをここから2^3倍にするというのが真の天才の仕事なので
ご気体くだち、

58 名前:デフォルトの名無しさん mailto:sage [2022/06/02(木) 22:51:31.90 ID:W32R/zzX.net]
なお^がべきなのか排他的論理和なのかは結果を見て決める、

59 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 06:03:05.77 ID:2JsQlaOH.net]
operator^をべきにするやついたら当然シバくよな

60 名前:デフォルトの名無しさん [2022/06/03(金) 06:10:12.11 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 07:50:26 ID:AsLopwGr.net]
moveでなくてforwardが正しいです

62 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 08:54:35.11 ID:I7UEGKwl.net]
>>59 move 使わないと移動しないでしょ。アドレス見るなりして確認できるはず。
>>60 「移動させたい」と言ってるんだから move で正しいでしょ。

63 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 09:14:32.48 ID:wV0TqfjJ.net]
>>56
相変わらずタイポしてて草

64 名前:はちみつ餃子 mailto:sage [2022/06/03(金) 09:33:30.85 ID:ysQR9TY9.net]
>>59
C++ の常識的な設計としてはには >>60 が主張するように forward を使うべき。
右辺値か左辺値かによって適切に切り替えが成されるので。

「常に」ムーブさせたいのであれば >>61 の述べる通りだが、
その場合は a.add(std::move(x)); の move は不要。 (有っても害はないが……。)
左辺値でも add がムーブするなら右辺値にキャストする意味はない。

65 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 09:48:25.29 ID:IxeUpLcv.net]
push_backが適切にやってくれるだろうし素人がここで手入れするところではないな

66 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 09:49:48.62 ID:I7UEGKwl.net]
>>63 a.add(std::move(x)) の move 外したらコンパイルエラーになるでしょ。

67 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 09:56:37.41 ID:IxeUpLcv.net]
そりゃド素人が作成した自作関数に&&しか定義してないからでしょ

68 名前:はちみつ餃子 mailto:sage [2022/06/03(金) 09:59:10.91 ID:ysQR9TY9.net]
>>65
ああそうか、すまん。
変な思い違いをしていた。

69 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 11:21:49 ID:2JsQlaOH.net]
xをコンストラクタに渡すならemplaceじゃね?

70 名前:59 [2022/06/03(金) 14:58:35.62 ID:3oYQiySt.net]
これでいいってことですか?
void add(vector<int> &&x){
 vec.push_back(std::forward(x));
};

あと、
>「常に」ムーブさせたい
という言葉が気になるんですが、右辺値を受け取る場合に「ムーブさせない」場合があるんでしょうか?



71 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 15:42:06.91 ID:g1oXgs2q.net]
引数が forwarding reference になるのは型変数の場合だけ
https://en.cppreference.com/w/cpp/language/reference#Forwarding_references

コンクリートな型の場合 && で取ったら確実に rvalue だから forward は要らん
んで vector<T>#push_back は (const T&) と (T&&) に対してオーバーロードされてるから (後者のバージョンが選ばれるので) move も要らん
つまり >>64 が正解。なんで適当答える前に手元で確認しないのか

72 名前:はちみつ餃子 mailto:sage [2022/06/03(金) 15:44:21.94 ID:ysQR9TY9.net]
>>69
ムーブさせない場合はある。

それとは別に可能なら左辺値にも右辺値にも対応するのが通例なので
それを無意識に前提に入れてしまっておかしなことを書いてしまった。
ごめんね。

73 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 16:02:28.52 ID:I7UEGKwl.net]
>>70 move しなかったら push_back(const T&) になっちゃうでしょ。なんで適当答える前に(ry

74 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 16:06:42.00 ID:g1oXgs2q.net]
>>72

アホか。forwarding reference じゃなくて rvalue reference だっつってんのになる訳ねーだろ

75 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 16:10:12.85 ID:g1oXgs2q.net]
あ、もしかして >>59
> a.add(std::move(x));
について言ってんのか?そりゃここには move が要るが今は add の中の話だろ?

76 名前:デフォルトの名無しさん [2022/06/03(金) 18:50:26.25 ID:lbrgnw5P.net]
>>73
さてはrvalueの挙動理解してないな?
https://wandbox.org/permlink/rtkW4N7gWRu9yyqK

rvalueとして受け取った時点でlvalue扱いなんだよ
moveするまで所有権を持っていて、moveで所有権を放棄する。
所有権はT&&を受け取る関数に移る。

77 名前:デフォルトの名無しさん [2022/06/03(金) 19:12:19.64 ID:lbrgnw5P.net]
>>69
moveさせるとまずいケースがある
https://wandbox.org/permlink/bdXnNaYzb7esxcwt

moveってのは所有権の移動なので、所有権を他に渡した後に使うとまずい
このコードは手元のgccだとこんな感じに壊れる


forwardは2つのモードがあって、forward<T&>かforward<T&&> (or forward<T>) を指定しなきゃいけない。
T& forward<T&>: moveしない
T&& forward<T&&> (or forward<T>): moveする

78 名前:デフォルトの名無しさん mailto:sage [2022/06/03(金) 19:43:48.13 ID:+R1h67E5.net]
Revive! Vive! unifyde call syntax!! revive!!!

79 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 12:47:58.32 ID:TQBK1egQ.net]
cpp経験のあるエンジニアが面接に来たんですがboost知らないとかあり得るんでしょうか

80 名前:デフォルトの名無しさん [2022/06/04(土) 13:11:38.01 ID:FGCXQeDT.net]
あり得ません、エアプです



81 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 13:13:16.94 ID:to7UVp4p.net]
でもC++を完全に理解してるスーパーエンジニアが君の会社に来ることはないんだ

82 名前:デフォルトの名無しさん [2022/06/04(土) 13:41:01.98 ID:vvbHqYcO.net]
boost知ってても使ってないとか黙殺するとかなら有り得るんじゃね

83 名前:デフォルトの名無しさん [2022/06/04(土) 13:51:08.17 ID:cj+dvlSK.net]
CとCppは似てるらしいけど最初はCから始めて
基礎を身につけた方がいいとかありますか?

84 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 14:02:22.31 ID:1SIgUGMa.net]
まあコンパイル時間が伸びるとかで使わない所も多いしな

85 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 14:05:58.45 ID:OQ3usAsV.net]
C++のほうがコンパイル時の文法チェックが親切なので、g++でコンパイルするのが吉

86 名前:はちみつ餃子 mailto:sage [2022/06/04(土) 14:18:00.05 ID:Ah6rlskA.net]
余談だけど cpp って書いたら C プリプロセッサのことを指す場合もある。

87 名前:デフォルトの名無しさん [2022/06/04(土) 14:37:22.59 ID:cj+dvlSK.net]
>>83-85
ありがとうございます!勉強になります!

88 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 14:38:35.97 ID:qJZvQBHL.net]
boostつかうひと嫌い

89 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 14:45:24.57 ID:wH3cIPcT.net]
マリオカートの遊び方に縛り入れてんじゃねぇよ!

90 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 16:03:47.30 ID:OQ3usAsV.net]
今どきの人がCの機能を学ぶにしても、最初のうちはC++コンパイラを使ったほうがいい
C++コンパイラは初心者がやりがちな意図しない型キャストに警告を出してくれる



91 名前:デフォルトの名無しさん [2022/06/04(土) 16:44:33.09 ID:vvbHqYcO.net]
>>82
その通り
ハゲめ

92 名前:デフォルトの名無しさん [2022/06/04(土) 21:34:58.76 ID:TQBK1egQ.net]
>>79
やっぱ有り得ないですよね
うちの会社はC++使わないんですが、盛り過ぎた経歴は看過できないので二次面接にはC++経験のあるエンジニアに同席してもらいます

93 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 21:43:09.92 ID:OQ3usAsV.net]
>>91
ずっと同じ部署にいてboostライブラリに接する機会がなかっただけじゃないかな
ずっと同じ部署にいたってことは専門性が高くて信頼されてた可能性がある

94 名前:デフォルトの名無しさん [2022/06/04(土) 21:48:20.42 ID:nRM2q6cY.net]
>>92
はい、私がC++は門外漢すぎて突っ込んだ質問が出来なかった手落ちもあるので、後続の面接ではしっかり見極めたいと思います
C++以外の話でも怪しい部分はありましたし

95 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 22:16:16.74 ID:IRaDT1CY.net]
>>83も書いてるけどboost使わない職場はそれなりにあるから俺もboost使える?って聞かれたら使ったことないからよく知らんって答えると思う
そもそもそんな事で採用決めるような会社はこちらから断ると思うが

96 名前:デフォルトの名無しさん mailto:hage [2022/06/04(土) 22:23:56.45 ID:FR2x7OcT.net]
はい、職歴に書かれた内容に曇りがないか見極めたかっだけなので、Boostに知見があるかどうかはさほど問題にしてません

97 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 22:54:17.16 ID:cXL4Xuwo.net]
>>78
バカか
boostは標準化されてないだろ
ヘッダ入れ込んでまでわざわざ使うヤツは縛りプレイヤーかマニアだぞ

98 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 22:56:04 ID:4luU2XzE.net]
>>79はネタで言ってるかエアプだと思うよ
boost役に立つものもあるし個人では使うが、仕事で必須かというとそんなことはない

99 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 22:59:46.47 ID:+8Ow3LIK.net]
標準じゃないもん使うのはアホ
人格に問題がある

100 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 23:04:03.58 ID:BuoePqDI.net]
知ってるけどあんまり使ってない、使ったことないから詳しくは知らない、とかならまあ別に普通だけど
知らない聞いたことすらないってのはヤバい



101 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 23:12:35.97 ID:3rcQlGgA.net]
仕事では使わないなあboost
必須のミドルウェアは使うけど

102 名前:デフォルトの名無しさん mailto:sage [2022/06/04(土) 23:12:59.31 ID:4luU2XzE.net]
>>98
その標準じゃないもん、にはOSのAPIとか目的のソフトに必須のライブラリ群も含んでる?

103 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 00:13:46.63 ID:/AT5pgYO.net]
boostもサードパーティのライブラリも使わんて人は、コマンドラインのパーサーとか任意精度のライブラリとか自分で毎回書いてるのか?
正気か?

104 名前:デフォルトの名無しさん [2022/06/05(日) 00:46:57.94 ID:/ywqNijR.net]
そんな便利なものは存在しないから標準ライブラリ+Win32でどうにかしてるだけじゃね?

105 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 01:30:20.47 ID:TqTpE262.net]
boost::sort::block_indirect_sort()はstd::sort()より速いので使ってる

106 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 03:05:51 ID:IC6BDqn3.net]
>>102
コマンドラインのパーサー含め、その辺の文字列処理は全部自前の文字列クラスでやっちまうな、俺はw
いちいち文字コードがどうたらとか悩みたくないし

107 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 05:03:18.77 ID:O5HYGw/G.net]
>>95
c++標準の勉強をしていれば単語としてboostを聞いたことあるだろう。
知らないのなら大した勉強はしていないだろうから、せいぜい業務で通り一辺触ったことがあるくらいじゃないかね。

どこまでのスキル求めているかによるけど、業務内容に近い課題を与えてテストしてみたらいいんじゃない?
業務でc++を使わないなら、c++スキルに金を払うわけじゃないから気にすんな。どうせ募集要項にc++とか書いてないんだろ。

108 名前:デフォルトの名無しさん [2022/06/05(日) 06:28:02.59 ID:kEvpwCAH.net]
自分の知ってる世界がすべてだと思ってる人間の方が危険。
C++が使われる範囲が広すぎるから、言語の経験有無よりもどの分野で開発してたのかを聞くべき。
ガラケー時代のカーネルドライバ書いてたり、携帯キャリア向け機器の組み込みやってた時はboostどころかstlすら使ってなかった。
というか使えなかった。
一方でスマホゲーのバックエンドを書いてた時はboostまみれだった。

109 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 07:05:01.15 ID:xi1K2Yw5.net]
任意精度ってGMP使いませんか?

110 名前:デフォルトの名無しさん [2022/06/05(日) 08:31:22.07 ID:sROqatdZ.net]
boost知らない人は自分が使ってる環境がC++11/14/17/20なのかも知らないとかありそう
大昔のC++文法しか知らない人とかいるし
面接ではこれも聞いてほしい



111 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 09:22:33.51 ID:Zl7Pb69A.net]
昔はboostでも使わんと正規表現扱えなかったでしょ(ヽ´ω`)
今の子は知らんのかな?

112 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 10:41:52.09 ID:GvBqEMar.net]
edはC++,boostで書かれていた!?

113 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 10:57:35.83 ID:TqTpE262.net]
今や正規表現ライブラリはpcre2使っておくのが最適解でしょ
boostもre2も速度遅すぎ
最速軽量がre2の長所だったのは昔の話

114 名前:はちみつ餃子 mailto:sage [2022/06/05(日) 11:09:32.30 ID:XG05O5RB.net]
Boost 内のライブラリは組み合わせやすかったりもするだろうし、単独で性能が良いというだけが指標ではないだろう。
もちろん性能が良いに越したことは無いが、数倍程度の違いなら全体としては問題にならないことも多い。

115 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 11:33:39.66 ID:TqTpE262.net]
STLでregexクラステンプレートが追加されたのだから各正規表現ライブラリの供給元がstd::regexに準拠したラッパークラスを提供してくれるのかと思いきや、ほったらかしだしなあ

116 名前:デフォルトの名無しさん [2022/06/05(日) 13:02:35.05 ID:u0j22vIZ.net]
おまいの募集要項にboost使用するって描いてないならおまいが可笑しい
boost以外の部分でC++の知識や使えるかどうかを確認するべき

117 名前:デフォルトの名無しさん [2022/06/05(日) 13:05:40.20 ID:u0j22vIZ.net]
>>108
mpirだな

118 名前:デフォルトの名無しさん [2022/06/05(日) 13:23:08.93 ID:VgN5DVM1.net]
ただの文字列なら速さで選ぶのも良いけど、HTMLやXMLのような注釈を含むテキストは、STLやboostを使うのがスマート。

119 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 13:27:27.15 ID:TqTpE262.net]
re2は遅いうえに\1みたいな後方参照をサポートしてないのが痛い

120 名前:デフォルトの名無しさん mailto:hage [2022/06/05(日) 13:44:58.69 ID:JAUYaj4s.net]
別に即戦力求めてるわけじゃないので開発言語で縛って間口狭くしたくないんですよ でも質疑応答のクオリティ上げるためには突っ込んだ質問って必要じゃないですか 今回はそれが上手く出来なかっただけです



121 名前:デフォルトの名無しさん [2022/06/05(日) 15:40:19.58 ID:udiiYXiV.net]
ようするに基礎があるかどうかと伸びしろがあるかどうかだろ

今知らなくても調べればすぐ判ることが出来れば問題無い罠

122 名前:デフォルトの名無しさん [2022/06/05(日) 16:50:16.03 ID:sROqatdZ.net]
本人が経歴盛ってるならクズだが、営業やエージェントが勝手に盛ってることもあるからな
その辺も見極めて大目に見てほしい

123 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 17:21:37.24 ID:dinbGc5/.net]
自分のとこが金をいくら出せるのか考えてからマウント取ってほしいもんだわ

124 名前:デフォルトの名無しさん mailto:hage [2022/06/05(日) 17:37:12.61 ID:DpfkldE/.net]
対価は市場感より高めに設定していますね
AWSと同じぐらいのはずです

125 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 17:59:03.07 ID:MGWqyCtZ.net]
>>117
そもそもそんな用途にC++ってどうなの?

126 名前:デフォルトの名無しさん [2022/06/05(日) 18:15:07.18 ID:VgN5DVM1.net]
>>124
ブラウザでctrl+f押してみ。

127 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 18:28:12.08 ID:dinbGc5/.net]
>>123
手取りで1000万くらいですか?

128 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 19:24:35.36 ID:/AT5pgYO.net]
htmlは知らんがxmlの読み書きはC++のプログラムで一般的じゃね

129 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 22:30:48.15 ID:n7vwmg3m.net]
C言語の基本を学んでC++を勉強を始めました
バッファのフラッシュについて教えてください
プログラムは最後に全てのバッファがフラッシュされると思いますが、
std::flashやstd::endlはどういった時に使えばいいのでしょうか?
また、フラッシュの処理時間を考えるとstd::endlよりも'\n'を使った方が軽くなると思いますが、
あえてstd::endlを使う意味はありますか?
このフラッシュという概念はC言語になかったですよね…?

130 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 22:41:22.00 ID:FJOOY/QK.net]
fflush()を知らずにC言語を使ってきたなら気にする必要はない



131 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 22:53:56.06 ID:ypMgugQ8.net]
>>128
キミの疑問の中に答えがあると思うんだが

>プログラムは最後に全てのバッファがフラッシュされると思いますが、
逆に言えばプログラムの途中ではいつバッファの内容がflashされるかわからないってことじゃん
どういった時に使えばいいのか、なんてプログラムの最後ではなく途中でflashしたい時だろ

132 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 22:55:08.26 ID:JCaRLrt5.net]
stderr(バッファリング無し)とstdout(デフォルトでバッファリング有り)のリダイレクト先が同じ(コンソール等)のとき、
printf()とfprintf()の実行順にprintf()とfprintf()の出力結果を並ばせたいときに早速ffush(stdout)の出番が、
あとfflush()せずにabort()したらバッファ上のデータが失われることがある
もっともabort()を呼ぶしかない状況とかはどうしようもない状況なので盲目的なfflush()が適切とは言えないケースも
ありえるかもし
れんが

133 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 23:00:34.55 ID:JCaRLrt5.net]
んまー通常はファイルのクローズでフラッシュされるから明示的にファイルポインタに対してfflush()する必要に迫られることはなさげ
腸人工的なシチュエーション(でありかあまり良い設計でない例)として、
オープンしたままのファイルA、Bにこの順でデータが追記されることを気体するプロセスが他に居るときに
A、Bの順で追記するとき要る?ぐらい??

134 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 23:11:06 ID:TqTpE262.net]
他のプロセスと通信する時に明示的なバッファフラッシュが必要になることがあるよ

135 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 23:17:22 ID:JCaRLrt5.net]
>>133
それは思わないでもなかったが、
1. バッファに入った順で出ていく
2. ほっといてもバッファ内容がどんどん出ていく
3. 通信は送りっぱなしまたはロジカルなハンドシェーク手順
である場合にfflush()が必須というケースが思いつきませなんだ、

136 名前:デフォルトの名無しさん [2022/06/05(日) 23:24:31 ID:/ywqNijR.net]
1行ごとに結構重い処理をしたり、std::cinが入ってくるタイミングが不定期だったりするときに1行ごとにflushしておくと便利。
C言語でも使うテクニックだけどね

137 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 23:25:34 ID:TqTpE262.net]
送信側(自アプリ)じゃなくて受信側(他アプリ)の都合次第なので

138 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 23:36:59 ID:JCaRLrt5.net]
>受信側(他アプリ)の都合次第
どのような都合かkwsk、
fflush()したら動いて、fflush()しないと止まってしまう通信処理とかはなんかおかしいのでは……

ほっといてもバッファ内容がどんどん出ていく 限りfflush()せずとも送信は成立する
受け取れたかどうかはACKかNAKでも返してもらえばワカルから、
受信タイムうアウト検知ぐらいしかタイミングが関係する要素は無さげ、

139 名前:デフォルトの名無しさん mailto:sage [2022/06/05(日) 23:57:14.80 ID:TqTpE262.net]
「受け取れたかどうかはACKかNAKでも返してもらえばワカル」ってのがすでに受信側の都合だろ

140 名前:デフォルトの名無しさん mailto:sage [2022/06/06(月) 00:02:59.46 ID:NTJIoMOy.net]
コンテキストスイッチをきっかけにフラッシュするような仕組みはあるん?



141 名前:デフォルトの名無しさん mailto:sage [2022/06/06(月) 00:15:14.95 ID:1jBvtBty.net]
それがフラッシュしておかないと停電のときデータ全部持ってかれるんだよな

142 名前:デフォルトの名無しさん mailto:sage [2022/06/06(月) 00:19:06.76 ID:68av+k9D.net]
とりあえず言っておくが、水がもったいないからと言って水洗トイレを流さずに退出するのはやめたほうがいい

143 名前:デフォルトの名無しさん mailto:sage [2022/06/06(月) 00:21:03.22 ID:68av+k9D.net]
>>139
小便用トイレだと赤外線で退出を探知して水を流してくれるものもある

144 名前:デフォルトの名無しさん mailto:sage [2022/06/06(月) 00:23:36.15 ID:1jBvtBty.net]
フラッシュってのはハードディスクにどこまでデータ書いたか正規化する目的で行うから、フラッシュしないで停電モードでクラッシュすると、復旧したときに書いてたデータはゼロバイトのままだったりするが、こまめにフラッシュでデータを確定申告してる場合は書いた分がきちんと残ってたりする

145 名前:デフォルトの名無しさん mailto:sage [2022/06/06(月) 00:26:15.98 ID:Wu7kw3Sh.net]
これからは税務署に追徴課税されないように足繁く通うことにします。

146 名前:デフォルトの名無しさん mailto:sage [2022/06/06(月) 00:28:00.96 ID:1jBvtBty.net]
ま、無停電装置つけてたり電源不足などでHDDが頻繁に切断される環境でなければ問題ないけどね

147 名前:デフォルトの名無しさん mailto:sage [2022/06/06(月) 00:28:38.87 ID:68av+k9D.net]
一休はすでに縄を持って待ち構えてくれているのだから、義満が虎を屏風から追い出せばいいだけ
簡単なことだろ

148 名前:デフォルトの名無しさん [2022/06/06(月) 02:46:25.01 ID:ETmHHhEk.net]
誤解している人が多そうだけど
fflush()はC標準ライブラリの中のバッファリングデータを全て吐き出すだけであって
システム

149 名前:コールでいえばwriteするだけだよ
一方でカーネルがディスクなどに書き出すのを保証するのはシステムコールではsync/fsyncであってこれはfflush()しても行われない別のもの
[]
[ここ壊れてます]

150 名前:59 mailto:sage [2022/06/06(月) 03:12:54.60 ID: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 名前:デフォルトの名無しさん [2022/06/06(月) 08:55:53.89 ID:Ug3DHjCK.net]
>>147
sync sync sync
最後に電源切る前に
^C 連打ですね
判ります

152 名前:デフォルトの名無しさん [2022/06/06(月) 09:02:16.31 ID:Ug3DHjCK.net]
https://qiita.com/_meki/items/90f9815a1e899593daa3
https://peng225.果て部.com/entry/2016/07/30/211726

153 名前:デフォルトの名無しさん mailto:sage [2022/06/06(月) 10:28:12 ID:x36Ky4fa.net]
WinだとFileFlushBuffersだけで完結する

154 名前:デフォルトの名無しさん [2022/06/06(月) 10:28:30 ID:0alNkgKE.net]
noexceptの有無で動作が変わるなんてC++ムズすぎィ!

155 名前:デフォルトの名無しさん [2022/06/06(月) 11:42:00.12 ID:Ug3DHjCK.net]
>>152
>>66

156 名前:デフォルトの名無しさん [2022/06/06(月) 11:43:05.77 ID:Ug3DHjCK.net]
まあ原因と結果が全然離れた別の場所で起こるっていう意味では難易度高いとは思う

157 名前:デフォルトの名無しさん [2022/06/06(月) 12:41:54.06 ID:jOQJjNZV.net]
>>148
あってる

158 名前:デフォルトの名無しさん mailto:hage [2022/06/06(月) 21:20:45.44 ID:FY57Ayyt.net]
>>126
この国は累進課税なのでそのラインは難しいですね

159 名前:デフォルトの名無しさん mailto:59 [2022/06/08(水) 00:14:11.77 ID:0qhQo4nk.net]
>>66の話は>>59へのだったのか?w

>>155 ほか回答頂いた方
ありがとうございました。

160 名前:デフォルトの名無しさん mailto:sage [2022/06/08(水) 00:17:03.29 ID:xZpQpCco.net]
moveをやれるヤツはmoveをやる勇気があるヤツだけだ



161 名前:デフォルトの名無しさん mailto:sage [2022/06/08(水) 22:59:00.34 ID:lI0dIi5c.net]
>>138
話をそらすでないは;;;
通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
受信側(他アプリ)に伝わるやんけ
fflush()全然必須じゃないやんけ
fflush()に関してはやっぱ受信側の都合も糞も無いやんけ;;;

んまー今日日の計算機は速いから、世迷言てんこ盛りの呪術指向プログラミングでも
比較的まともっぽく動くが、

162 名前:デフォルトの名無しさん mailto:sage [2022/06/08(水) 23:03:01.67 ID:lI0dIi5c.net]
fflush()にはフロー制御で止まっている送信を動かす力は無いし、
ブロック型デバイスの書き込みのトリガーになる保証は無いしで
やっぱ使いどころは>>131みたいに多対1の書き込み(dstが同じ)というケースでの論理的な書き込み順序保証ぐらいしか無さげ

163 名前:デフォルトの名無しさん mailto:sage [2022/06/08(水) 23:39:12.93 ID:TQgrAlst.net]
>>159
水に流せ

164 名前:デフォルトの名無しさん mailto:sage [2022/06/09(木) 19:04:36.80 ID:d61AFL9R.net]
受信側の都合どうこうの話は知らんが
>通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
それは送信側がどんどん送り出している場合でしょ

165 名前:デフォルトの名無しさん mailto:sage [2022/06/09(木) 19:12:48.98 ID:6LGi7Ubo.net]
高機能トイレしか使ったことない人は、何もしなくても離席したら勝手に排泄物が流されていくと思っているからね

166 名前:デフォルトの名無しさん mailto:sage [2022/06/09(木) 19:16:36.26 ID:ftpPDZQh.net]
停電おこったことないんだろうね

167 名前:デフォルトの名無しさん mailto:sage [2022/06/09(木) 21:05:58.36 ID:Y+xZp6wU.net]
トイレの水流すのもflushだったなwww

168 名前:デフォルトの名無しさん mailto:sage [2022/06/09(木) 21:14:08.39 ID:0SCWcBb2.net]
むしろコンピュータ用語のflushの方がトイレからの連想

169 名前:デフォルトの名無しさん mailto:sage [2022/06/10(金) 18:08:30 ID:PT4Yy0z8.net]
flushつったらズリセンだろ

170 名前:デフォルトの名無しさん mailto:sage [2022/06/10(金) 18:15:06.01 ID:q3uEdydr.net]
長時間ストリーミング書き込み時にFileFlushBuffersコールしてなかった停電時の悲劇



171 名前:128 mailto:sage [2022/06/11(土) 13:05:09.88 ID:qY+svW4r.net]
なんとなく分かりましたが、C言語でfflush()を使っていなかったので困ることもなさそうです
改行は'\n'を使ってもう少し勉強を進めてから改めて皆さんのレスを読み返そうと思います
返事が遅くなりました、ありがとうございました

172 名前:デフォルトの名無しさん mailto:sage [2022/06/11(土) 15:25:15.53 ID:b1p/w9+9.net]
https://ideone.com/P9fDXn
コンパイル通らねー。

173 名前:デフォルトの名無しさん mailto:sage [2022/06/11(土) 21:16:14.33 ID:ZeuO2q0P.net]
>>163
ソフトウェアー呪術者、、、、

>>163 のような台詞はファイルをクローズしない人に言ったらよい
fflush()しないことにに当てはまらない理由はすでに述べているっつーの;;;

174 名前:デフォルトの名無しさん mailto:sage [2022/06/11(土) 21:25:33.69 ID:ZeuO2q0P.net]
>>168
左様停電に対して備えたいならI/Oストリームのバッファ階層の操作で満足するのではなくて
ioctlレヴェルの働きかけで掃き出し操作を保証を行うべき、(デバイスによってやるべきことが違う

というわけで論理的思考う能力に乏しい香具師がfflush()万能教にはまっている悪寒、

175 名前:デフォルトの名無しさん mailto:sage [2022/06/11(土) 21:47:10.33 ID:ZeuO2q0P.net]
ていうかそもそも馬鹿でかいバッファを用意しておいてから停電を恐れるというのはアレな発想でありまして、
真に停電に備えたいなら馬鹿でかいバッファを備えたデータのストリームとは別に、
どこまで書き込みが終わったかというだけの小さいサイズのジャーナル情報を
こまめに書くというのがファイナルアンサーであって
停電の際はジャーナル情報だけ保証して停電の瞬間に馬鹿でかいバッファ上にあったデータは諦めるのが正しいシステム

停電による処理中データの喪失がどうしても嫌ということなら速度の方を諦めてアンバッファーにするかバッファを小さくしてくだち、

176 名前:デフォルトの名無しさん mailto:sage [2022/06/11(土) 21:56:10.36 ID:ZeuO2q0P.net]
まとめ:
この地球上のどこを探しても停電への備えがこまめなfflush()(笑)ということはありえない

177 名前:デフォルトの名無しさん mailto:sage [2022/06/11(土) 22:48:11.94 ID:fc6R3/Uh.net]
まだ言うか!

178 名前:デフォルトの名無しさん mailto:sage [2022/06/11(土) 23:31:57.10 ID:pfxnOy19.net]
小さいサイズでもそれが即座に反映だれるとは限らないけどな
停電に備えるならUPSだろ
何がこまめに書くのがファイナルアンサーだよ
突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな

179 名前:デフォルトの名無しさん mailto:sage [2022/06/11(土) 23:44:48.33 ID:/CWj/UNa.net]
粗悪なUPS使って電源破損した事あるから良い印象ないな

180 名前:デフォルトの名無しさん mailto:sage [2022/06/12(日) 13:55:23.39 ID:0uPAg53b.net]
FFTで2^(2^34)-1を計算するやつの倍速化したやつをさらに倍速化したった……!

■ オリジナル
https://ideone.com/xSaa6x
2200秒

■ C++書き換え版
https://ideone.com/oDgjXr
2200秒

■ 倍速化
https://ideone.com/xHSzFD
962秒

■ ブロック6-step algorithm適用
https://ideone.com/rFCMy5
909秒 (倍速化版の94%) --- OpenMP無効、シングルスレッド
596秒 (倍速化版の62%) --- OpenMP有効、8スレッド



181 名前:デフォルトの名無しさん mailto:sage [2022/06/12(日) 13:55:40.64 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/06/12(日) 14:00:10.22 ID:0uPAg53b.net]
OpenMPは昨日始めたのでなんか間違ってるかもしれん……orz
行列の転置が8スレッド使って(2回目以降も)実行時間1/8にならない件について:

https://ideone.com/rFCMy5
のfftb6::transpose()のコードの書き方だと50%ぐらいにしか短縮されなんだ 。n_

183 名前:デフォルトの名無しさん mailto:sage [2022/06/12(日) 14:02:02.73 ID:0uPAg53b.net]
つなみにVS2019でOpenMP有効にするには
「構成プロパティー」→「C/C++」→「言語」→「OpenMP のサポート」
で逝ける、

184 名前:デフォルトの名無しさん mailto:sage [2022/06/12(日) 14:04:35.42 ID:0uPAg53b.net]
>>176
>何がこまめに書くのがファイナルアンサーだよ
NTFSの実装、、、

>突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな
しらそん
それはUPSを買う金もないのに停電とかを引き合いに出してきた香具師に言ってやってくだち

185 名前:デフォルトの名無しさん mailto:sage [2022/06/12(日) 14:10:01.25 ID:6VBjP0iK.net]
8スレッドで4倍くらいになってほしいね

186 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 00:27:41.34 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 14:39:57 ID:efPEc9j/.net]
std::complexは使わないの?

188 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 15:28:43.59 ID:Wf2qSIvf.net]
びーまいべいべー

189 名前:デフォルトの名無しさん mailto:sage [2022/06/13(月) 23:36:52.53 ID:dm71PatD.net]
並列処理に何でマルチスレッド使ってんだよ
昭和からタイムスリップしてきたのか?

190 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 00:17:42.26 ID:SQz7DEKB.net]
omp って単語を見るとおまんぽにしか見えない



191 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 01:23:09.85 ID:e+DfEXd1.net]
>>187
この問題でasyncプログラミングがどうやってマルチスレッドに太刀打ちするのか教えて

192 名前:デフォルトの名無しさん [2022/06/14(火) 16:46:20.69 ID:yDV29Um0.net]
教えてください
C++で書かれたDLLがあります
とあるCエクスポート関数を呼び出すと稀に Access Violation 0xc0000005 が発生することがありプロセスが異常終了してしまいます

幸いなことにこの関数は大した仕事をしておらず結果が得られなければそれで困ることもありません(結果が得られれば少し役に立つ程度です)
なのでこの関数の失敗を握り潰したいのですが、C++ でアクセス違反を try-catch で握り潰すことはできるのでしょうか?
それともアクセス違反は致命的なエラーなので必ずプロセス終了に至るのでしょうか?

193 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 16:54:42.88 ID:Vdns4Gf+.net]
またこのネタ掘り起こしたいのか・・・

194 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 17:18:04.76 ID:NNc5VmHP.net]
>>190
.NETは使っとらんの?

195 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 17:23:59.58 ID:rBU/2bdp.net]
https://docs.microsoft.com/ja-jp/cpp/build/reference/eh-exception-handling-model?view=msvc-170

呼び出し側のコンパイルで /EHa オプションつければ try-catch で握りつぶせるんでね?

196 名前:デフォルトの名無しさん mailto:sage [2022/06/14(火) 18:22:20.04 ID:WigeF4Tr.net]
>>190
> 幸いなことにこの関数は大した仕事をしておらず結果が得られなければそれで困ることもありません(結果が得られれば少し役に立つ程度です)
そんな関数なら空の関数に差し替えればいいんじゃね

197 名前:デフォルトの名無しさん [2022/06/14(火) 18:39:01.73 ID:yDV29Um0.net]
>>193
ありがとうございます!
/EHa を付けたらキャッチできました!
いままでは /EHsc が指定されてましたのでオプションの意味の違いを調べてみます

198 名前:デフォルトの名無しさん [2022/06/14(火) 19:23:09.63 ID:bI70PJIL.net]
DLLが例外出してるのをCで握り潰してるのが原因だろ

199 名前:デフォルトの名無しさん [2022/06/15(水) 20:40:34.83 ID:RdmQ7I01.net]
素人の質問でごめんなさい。(ここが一番関連ありそうだったので)
バイオインフォマティクスをやっているのですが、例えば主にC++で書かれたUnicycler (https://github.com/rrwick/Unicycler)というソフトウェアでは、--threadsオプションで使用するスレッド数を指定できます。
デフォルトだとスレッド数8なのですが、仮にそれを1コアを使って実行した際はどのような挙動になるのでしょうか。
コア数<スレッド数なので失敗するかと思ったのですが、思いの他うまく実行できてしまいます。
一般的にこういう場合、並列 (parallel)処理ではなく並行 (concurrent)処理で、スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか・・・

200 名前:はちみつ餃子 mailto:sage [2022/06/15(水) 20:45:50.35 ID:VY0KZJ3n.net]
>>197
> スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか

せやで。
OS がスケジューリングしてスレッドを交互に実行しとる。
コア数以上のスレッドに分けても実行速度が上がったりはしないよ。
コンテキスト切り替えのコストの分だけむしろ遅くなると思う。



201 名前:デフォルトの名無しさん [2022/06/15(水) 21:02:51 ID:RdmQ7I01.net]
>>198
なるほど、OS賢いですね。。
つまり1コアでやるときは複数スレッドの処理もできるけど、無難に1スレッドの処理にした方がむしろ速い、ということですね。
勉強になりました!ありがとうございます!

202 名前:デフォルトの名無しさん [2022/06/15(水) 21:05:28 ID:74xVOU49.net]
各スレッドがio待ちしてるかも知れんし、コア数より多くても早くなる場合もあるんじゃね
gcc動かすときもコア数1.5倍位指定してる

203 名前:デフォルトの名無しさん [2022/06/15(水) 21:28:42.61 ID:RdmQ7I01.net]
調べてみたらコンテキストスイッチにもプロセスコントキストスイッチとスレッドコンテキストスイッチがあって、
後者の方がコストが格段に低いとありました。
この場合は同一プロセス中の複数スレッドで後者なので、
>>200さんの言っていることもありますし、コア数よりスレッド数を少し多めに設定しても速くなるのかもしれませんね。
実験して確かめるのが一番かもですね。

204 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 21:38:32.69 ID:vqdnmmaI.net]
まあ今の実装は大抵スレッドといいつつプロセスだったりするけどね

205 名前:デフォルトの名無しさん [2022/06/15(水) 22:07:11.11 ID:Ltc382Vw.net]
>>202
何の話だ?

206 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 22:21:16.61 ID:5/k7QI1P.net]
pythonはそんな感じがする

207 名前:デフォルトの名無しさん [2022/06/15(水) 22:28:16.78 ID:Ltc382Vw.net]
pythonでもマルチスレッドとマルチプロセッシングは別物だろが

208 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 22:34:39 ID:Z7kfo4VR.net]
Linuxのスレッドはプロセスだと聞いた

209 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2022/06/15(水) 22:56:22 ID:VY0KZJ3n.net]
そのへんは色んな論が合って今の主流がどうなってんのかよくわからん。
でも一度はプロセスを軽くする方向 (スレッドの実態をプロセスとする方向) になったというのは私も聞いたことがあるような気がする。
(BSD 系の話と混ざってるような気もする。 だいぶんうろ覚え。)
プロセスを軽くするというよりは段階を分けるというか、
プロセスをスレッド的な範囲で使っている分にはスレッド程度の処理しかしないみたいな感じ。
ただ、それは最終的には管理コストが思ったより大きくてそれほど効果的ではないというオチじゃなかったっけ?

210 名前:デフォルトの名無しさん mailto:sage [2022/06/15(水) 23:10:10 ID:vqdnmmaI.net]
>>203
OSのカーネルスレッドの実装の話だ



211 名前:デフォルトの名無しさん [2022/06/15(水) 23:14:22 ID:8Ciw/luQ.net]
forkもCoWがあるからオーバーヘッド大したことないんだっけ?

212 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 06:09:16.40 ID:acnLqVz4.net]
>>206
誰に聞いたんだよw
てか、少しは疑うことを覚えた方がいいぞ

>>208
ソース出してみ

>>209
Copy on writeを使わない実装よりは大幅に軽いけどメモリー空間とかを準備しなくて済むスレッドよりは重いよ

213 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 06:36:56.71 ID:GA9mXaJg.net]
>>205
そうだった。勘違いしてた。
pythonで流行りの並列処理をやろうとしたらマルチプロセスだった。何を言ってるのか わからねーと思うが(以下略)

214 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 07:01:31.35 ID:ilsRfae9.net]
>>199
ユニプロセッサでも例えばI/O待ちやユーザ入力待ちしている間にできることをやっとくんだよ

215 名前:デフォルトの名無しさん [2022/06/16(木) 07:17:28.07 ID:lg2Mpz7e.net]
例えばシングルスレッドのみを利用のサーバーでも
その中で非同期タスクを1万個動かしてクライアント同時接続1万個の処理が可能
ほとんどがネットワーク待ちとディスク待ちだから非同期ならばそれだけ同時に並行処理(≠並列処理)できる

216 名前:デフォルトの名無しさん [2022/06/16(木) 07:30:29.25 ID:lg2Mpz7e.net]
もし同期プログラミングしか出来ないと
その多数のクライアントを捌くためにスレッド数を増やすことで対応することになるが
スレッドリソースを喰うため大きいためスレッド数を増やせず
スレッドスイッチングも重いため圧倒的に不利となってしまう

217 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 08:51:16.63 ID:ilsRfae9.net]
ネットのサーバーは本質的にマルチタスクで
たとえシングルで力技かましてても外から見て複数のタスクを同時にこなしている

218 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 09:12:07.56 ID:LWbVArCN.net]
1対1スレッドがマルチプロセッサ使えて実装が楽で悪いことないよね

219 名前:デフォルトの名無しさん [2022/06/16(木) 09:53:32.18 ID:JxXqg7BH.net]
>>216
それは初心者まで
普通は非同期に処理する

220 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 10:11:35.67 ID:LWbVArCN.net]
>>217
非同期のスレッドってどういうのを指すの?



221 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 11:53:53.45 ID:ilsRfae9.net]
マルチスレッドは基本的に非同期だけどな
必要に応じてミューテックスやシグナルで待ち合わせする

222 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 16:20:36.89 ID:OqC2jk+r.net]
ノンブロッキング=非同期でいいのかな

223 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 16:31:27.35 ID:WGtrzJPY.net]
いいよ違うけど

224 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 17:24:48.01 ID:Vxm/sO96.net]
しかしまあどこかにライブラリを作ってる人がいるんだけど、その事実を認識できんプログラマというのはおるよな

225 名前:デフォルトの名無しさん mailto:sage [2022/06/16(木) 17:38:45.90 ID:5Mp0JkOM.net]
ジャップにはOSS読んだり一次情報確認しにいく文化がそもそも無いからな

226 名前:デフォルトの名無しさん [2022/06/16(木) 17:39:26.55 ID:T9ZCQ85W.net]
非同期プログラミングでは多くの言語でPromiseもしくはFutureと呼ばれる同じ概念の抽象化を用いて行なう
つまりこれから行われることを期待する未来の約束という抽象化したものに次々と託していくことで
プログラムコードの見かけ上の記述順とは異なり並行して非同期に複数のタスクが走ることで非常に効率的に実行
それらは一つのスレッド内で何十も何千も非同期に並行して動かすことが可能であるがマルチスレッドを使えばさらにそのコア数倍を動かせる

>>216
それだと効率が悪すぎてお子様向け

227 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 01:35:07.48 ID:UGOae7/Q.net]
プログラマー目指してるんですが、C++やるなら03と11の両方勉強しておいた方がいいですか?

228 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 01:42:46.88 ID:OGNvxC9Z.net]
はて?
C++11やればC++03もカバーしたことになるからC++11以降一択だよ
細かいことはコンパイルエラーが出てから考えればいいんだよ

229 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 03:02:19.62 ID:2abskYGH.net]
今C++03の案件とかあるんかな
あっても正直関わりたくないな

230 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 05:01:48.39 ID:GnlLskBw.net]
autoなしで書きたくない



231 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 05:20:26.86 ID:zopwF6/i.net]
何を言うとるか
今憶えるべきはC++20に決まっとろうが

232 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 09:56:39.22 ID:UGOae7/Q.net]
C++11を勉強しておけば良さそうですね
独習C++をやります
ありがとうございました

233 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 13:24:12.81 ID:SEHo94h9.net]
c++11で書いたコードをC++20でコンパイルしようとしたらエラー出まくりんぐ
教えてエロい人

234 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 13:40:57.68 ID:zopwF6/i.net]
実例出してくれれば解説できる・・・かも知れないw

235 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 14:29:06 ID:sTQyUMOv.net]
ソースを貼らないワカランゴよ

236 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 15:09:02.12 ID:SEHo94h9.net]
スマソ、C++11じゃなくてC++14だた

vector<int> unkos;
for each (auto unko in unkos) { }

これがエラー出てコンパイル通らない
環境が壊れてるんかな?
IDEはVS2022 17.2.4

237 名前:デフォルトの名無しさん [2022/06/17(金) 15:34:14.31 ID:tDJ88+fU.net]
C#かなんかと混ざってない?

vector<int> unkos;
for(auto unko : unkos) { }

238 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 15:55:37.01 ID:SEHo94h9.net]
しょっちゅうC++とC#往復するから頭おかしくなるな
でもコードスニペットで自動的にfor each (auto unko in unkos)みたいな構文に補完されるんだよね
てか以前までこれでビルド通ってたし
VSのバグかな?

239 名前:蟻人間 mailto:sage [2022/06/17(金) 16:03:50.87 ID:GnCwfahh.net]
拡張子間違ってない?

240 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 16:10:31.33 ID:SEHo94h9.net]
確認したけど.cppと.hで試してる
C++17まではビルド通るけどC++20にするとエラーだわ



241 名前:デフォルトの名無しさん [2022/06/17(金) 16:18:22.80 ID:G79h5Zer.net]
C++11 以前はもう忘れていいとは思うけど
以前と以降の違いは知ってた方が良いとも思う

242 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 16:19:50.60 ID:2abskYGH.net]
for each inはmsvcの独自拡張らしいな

243 名前:デフォルトの名無しさん [2022/06/17(金) 16:20:08.55 ID:G79h5Zer.net]
>C++17まではビルド通るけど

マジか?

244 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 16:38:08 ID:SEHo94h9.net]
>>240
やっぱVS固有の話だったか
>>241
マジ
ただおま環かも

245 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 17:16:26.61 ID:iqIqAnpY.net]
参照&とか、左辺値とか、moveとか、copyとか、体系的に学びたいんだけど、
その辺、いいKindle本ない?
オススメない?

246 名前:デフォルトの名無しさん [2022/06/17(金) 17:24:24.76 ID:G79h5Zer.net]
その質問が出て来る時点で既に体系的に知ってるだろ

247 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 17:42:51.03 ID:2abskYGH.net]
C++の書籍紙の本ばっかだよな
ネット上のドキュメント漁れって事なんだろうけど

248 名前:243 mailto:sage [2022/06/17(金) 18:07:25.78 ID:iqIqAnpY.net]
C++をclassの使えるCとしか使ってなくて(そんなに使ってない)、
んで参照&を使った左辺値?を見よう見真似で使ったんだけと、うまくいかなくて(結局ポインタを使った参照を使いました)

あとRustの本読んだらmove、copyを知って、その概念はC++でもあるとどこかで見て、体系的に知りたいと思いました。

Webだと細切れなのでKindle本で読みたいと思います。
オライリーのEffective modern C++なんか適当でしょうか?
でもKindleないんだよなぁ

249 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 18:20:30.66 ID:sBNVv+WO.net]
kindleはないけど
オライリーは公式に電子書籍あるよ

250 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 18:22:00.18 ID:OGNvxC9Z.net]
所有や共有の機能が欲しいなら shared_ptr 使えば良いだけだろ



251 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 18:41:26 ID:sTQyUMOv.net]
>>234
こ、こんな裏技が((( ;゚Д゚)))

252 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 18:48:02 ID:OGNvxC9Z.net]
それはつまりinが予約語になっているってことでもあるのかな

253 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 18:53:09 ID:aIhMpcwB.net]
C++/CLIなんじゃないの

254 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 19:29:48.79 ID:SEHo94h9.net]
いや、たしかにC++プロジェクトやぞ
数年前から使ってるVSプロジェクトではC++14→ビルド通る、C++17→ビルド通る、C++20→エラー
今新規で作ったVSプロジェクトではC++14→エラー、C++17→エラー、C++20→エラー
意味フすぎて漏れそう

https://docs.microsoft.com/ja-jp/cpp/dotnet/for-each-in?view=msvc-170
調べたらfor each構文は非推奨とは出てきたけど
ほならね、コードスニペットで非推奨の構文出すなやと言いたい
しかもそれでビルド通らねえ

まあVSアプデが原因っぽい感じするし、大人しく推奨の構文使うようにするよ
お騒がせしてスマソ

255 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 19:38:58.95 ID:bL392TY5.net]
>>251
多分それが正解
https://docs.microsoft.com/ja-jp/cpp/dotnet/for-each-in

256 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 19:41:36.72 ID:bL392TY5.net]
>>252
property String^ MyStringProperty;
みたいな構文見た時点で気づけよ...

257 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 19:48:56.19 ID:sTQyUMOv.net]
>>254
両方使えるって書いてあるけど

> この非標準のキーワードは、C++/CLI プロジェクトと C++ ネイティブ プロジェクトの両方で使用できます。 ただし、これを使用することはお勧めしません。

258 名前:はちみつ餃子 mailto:sage [2022/06/17(金) 19:50:56.98 ID:Ic1RtTnb.net]
>>246
「江添亮のC++入門」は比較的ハードルが低く基礎を理解できるように書かれてると思う。
(別途学習する前提で継承まわりをごっそりと省いたりしてるけど……)
元になった原稿は無料で公開されてて、 Markdown で書かれているので
適当なツールを使えば Kindle で読める形式にもできるんじゃないかな。

259 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 19:59:43.68 ID:SEHo94h9.net]
>>254
コード読めるのに文章読めないの?

260 名前:デフォルトの名無しさん [2022/06/17(金) 20:05:32.50 ID:wjEVmEJW.net]
C++/CLIはC++20で見捨てられてるので強制的にC++17としてコンパイルされる

昔から使ってるvcxprojなら知らん間に追加のオプションつけてたり、今のVSで規定値が変わったりしてるだろうからビルドが通らないのもありうる。

ちょっとしたプログラムならwandboxとかでgcc/clang試してみてもいいんじゃない?
MSVCは独自拡張とか、標準ライブラリでも新しいバージョンのものを先行実装してたりするよ



261 名前:はちみつ餃子 mailto:sage [2022/06/17(金) 20:06:26.13 ID:Ic1RtTnb.net]
MSVC を使ってないからよう知らんけど拡張を抑制するオプションとかないの?

262 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 20:22:45.13 ID:k/CpGzsk.net]
C++/CLIはC++ではないのだよ!

263 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 20:37:27.17 ID:2abskYGH.net]
日本語読めない奴が多いなしかし

264 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 23:05:28.99 ID:nJOnHnXa.net]
C++/CLI捨てられちゃうのか
じゃあ今後C#とかとのグルーには何使えばいいの?

265 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 23:21:00.48 ID:cGGfCEhk.net]
漢は黙ってP/Invoke

266 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 23:39:45.06 ID:OGNvxC9Z.net]
中国人じゃない

267 名前:人はどうすればいいですか? []
[ここ壊れてます]

268 名前:デフォルトの名無しさん [2022/06/17(金) 23:43:23.56 ID:+i8GyaaY.net]
中国人に非ずば人に非ず。

269 名前:デフォルトの名無しさん mailto:sage [2022/06/17(金) 23:57:35.61 ID:OGNvxC9Z.net]
PCREやbregonig.dllなどのPerl互換正規表現ライブラリでは、日本の漢字と中国の汉字が同じ\p{Han}に一絡げにされてるから注意しなよ

270 名前:デフォルトの名無しさん [2022/06/18(土) 20:22:14.05 ID:jYGrUTdl.net]
ユニコードだからってことじゃなくて?



271 名前:デフォルトの名無しさん [2022/06/19(日) 08:07:25 ID:w/1mSXjt.net]
www.mercari.com/jp/search/?keyword=hr400p
こういう安い中古チューナ買って、Coinyをスカパープレミアム放送のICカード化して、
スカパープレミアムのチャンネル全部見れるし、USB HDDに録画フリー。
【avoCADO】 Coiny card Part4【仮想通貨】
https://mevius.5ch.net/test/read.cgi/avi/1640762750/

272 名前:デフォルトの名無しさん mailto:sage [2022/06/19(日) 09:39:07.73 ID:G0R2gGHa.net]
誤爆かな

273 名前:デフォルトの名無しさん mailto:sage [2022/06/19(日) 15:42:17.20 ID:pCkywCXr.net]
夏休みの自由研究の成果を今ここに発表するのぜ、
2^(2^34)-1を計算するプログラムを最終的にオリジナルの9.26倍高速化すた、

↓↓↓先週のやつ↓↓↓
■ V3: ブロック6-step algorithm適用
https://ideone.com/rFCMy5
実行時間全体: 389.157479 sec
計算時間のみ: 185.163833 sec

↓↓↓先週のやつの改良版↓↓↓
■ V3.1: ブロック6-step algorithm適用、parallel for粒度変更(粗くした)+workメモリサイズ調整
https://ideone.com/dFjPXf
実行時間全体: 349.057446 sec
計算時間のみ: 151.493976 sec

計算時間のみ比較でオリジナルの9.26倍速、

274 名前:デフォルトの名無しさん mailto:sage [2022/06/19(日) 15:42:37.86 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/06/19(日) 15:44:13.95 ID:pCkywCXr.net]
つなみに同じような調子で時間計測すると、(コードはV3.1のSHOW_CSM_TIMEを参照されたい、
■ V0: オリジナル
https://ideone.com/xSaa6x
実行時間全体: 1586.875607 sec
計算時間のみ: 1403.402228 sec

■ V1: C++書き換え版
https://ideone.com/oDgjXr (※ FIGとRADIXはそれぞれ5と100000に訂正
実行時間全体: 1611.894164 sec
計算時間のみ: 1421.579748 sec

■ V2: 倍速化(バッタフライ演算で書き直したやつ。OpenMP非使用
https://ideone.com/xHSzFD
実行時間全体: 622.790273 sec
計算時間のみ: 435.143622 sec

やったわ;;;
つまりV2はV0より3.23倍速く、V3.2はV0より9.26倍速いから2^8倍を達成したのであった、

276 名前:デフォルトの名無しさん mailto:sage [2022/06/19(日) 15:57:54.28 ID:pCkywCXr.net]
じつはさらにL2キャッシュ利用帯域最大化版というのを作ってみたのやが
どうもV3と同等かやや遅くなるorz

■ V3.2: L2キャッシュ利用帯域最大化版
https://ideone.com/ig7PuU
実行時間全体: 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 名前:デフォルトの名無しさん mailto:sage [2022/06/21(火) 20:57:53.90 ID:MIxQo51/.net]
そっか頑張ったね

278 名前:デフォルトの名無しさん mailto:sage [2022/06/21(火) 21:17:43.90 ID:EegZBjzo.net]
相変わらず漏れとか加齢臭するスラング使ってんのか

279 名前:デフォルトの名無しさん mailto:sage [2022/06/21(火) 21:26:26.57 ID:5USpVKBQ.net]
初老の漏れ易いジジイなんだろ
察して差し上げろ

280 名前:デフォルトの名無しさん mailto:sage [2022/06/21(火) 23:41:17.67 ID:Nd0elFbL.net]
内容に関係のないクソみたいな指摘しかできないお前らも大概終わってるけどな
まあこんなとこじゃなくてブログとかSNSにまとめろよとは思う



281 名前:デフォルトの名無しさん mailto:sage [2022/06/22(水) 00:04:15.50 ID:nUS9+NCG.net]
ジジイだから周りのこととかスレの流れとか見えてないんだろう
前頭葉が加齢で萎縮して空気を読む能力が衰えたのかな

282 名前:デフォルトの名無しさん mailto:sage [2022/06/22(水) 02:07:39.75 ID:mxrPsC3u.net]
>>277
> 内容に関係のないクソみたいな指摘しかできない
ハァ?
文盲じゃなかったら本人だろコイツ

1の乗根じゃなくて整数環でFFTした方が誤差の意味でも速度の意味でも劇的に改善するって何度も指摘してるんだが

283 名前:デフォルトの名無しさん mailto:sage [2022/06/22(水) 03:38:43.09 ID:y9JQQK81.net]
>>279
これ前スレからの流れなのか知らんかったわすまんな
どうりで批判が多いわけや

284 名前:デフォルトの名無しさん mailto:sage [2022/06/23(木) 16:48:56.08 ID:gevVgEYw.net]
どうでもいい言葉尻に突っかかるやつ
若さを自慢したつもりになってるの?
尻の青さをバカにされてるだけだよ

285 名前:デフォルトの名無しさん mailto:sage [2022/06/23(木) 18:18:04.50 ID:5dy8Tjxk.net]
プログラマの発言じゃないな
プログラムは1文字のタイプミスで全く違う挙動になるのだから

286 名前:デフォルトの名無しさん mailto:sage [2022/06/23(木) 18:26:17.60 ID:rC+mT8P4.net]
偶によくC++読み書き出来ない奴がレスしてるんだけどどっから湧いてきてんの

287 名前: mailto:sage [2022/06/23(木) 21:32:27.41 ID:m7vQCh0J.net]
いよいよ Java のクラスライブラリを C++ に移植しようと思っていますが、需要はありますか?
そろそろ共通のクラスライブラリが確立されてもいいと思っているのですが、あまりそんな話がないのが不思議です

288 名前:デフォルトの名無しさん [2022/06/23(木) 22:23:51.49 ID:R7SBWA0E.net]
需要あるのでよろしくお願いします

289 名前:デフォルトの名無しさん mailto:sage [2022/06/23(木) 22:27:04.30 ID:YY1MWhdq.net]
がんばれ!

290 名前:デフォルトの名無しさん [2022/06/23(木) 22:59:01.86 ID:lRxLFmXq.net]
stdやboostじゃ不足か?



291 名前:デフォルトの名無しさん mailto:sage [2022/06/23(木) 23:46:22.08 ID:Q9NpIN8Z.net]
>>284
見せてもらおうか!!
◆QZaw55cn4c謹製ライブラリの性能とやらを!!

292 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 00:00:51.28 ID:KtheM8QT.net]
>>287
OO な各言語で名前と機能が共通するライブラリの必要性を痛切に感じているのです
提供されるクラスライブラリが共通であれば、各種言語の純粋な潜在的能力に応じた評価が可能となります

293 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 00:02:46.32 ID:KtheM8QT.net]
>>288
性能よりも、各言語で名前と機能の紐づけが共通することを優先します

294 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 00:17:55.81 ID:0z9KCe6G.net]
Javaクラスどうこうよりもfinallyステートメントをどうするかなんでは

295 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 10:21:14.00 ID:ZX81zd9Z.net]
>>291
ああ、それ、ありましたね finally か、結構重たい課題ですね

296 名前:デフォルトの名無しさん [2022/06/24(金) 10:44:21.40 ID:K2we1Lar.net]
お願いですから名前は短くしてくださいね

297 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 13:31:54.09 ID:dbAYBMOA.net]
>>282
template <typename T> を template <class T> と書いただけでジジイ呼ばわりするようなもんだぞ
誰もtypoの話なんかしてない
あ、1人だけいるのかw

298 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 14:41:08.15 ID:frIgvkyi.net]

typename と書く方が文法的に新しいの?

299 名前:はちみつ餃子 mailto:sage [2022/06/24(金) 15:47:15.76 ID:STd+R5JH.net]
>>295
いいえ。 少なくとも ISO の規格としては最初から有りますし (型引数のところに書く分には) 機能的な差もないです。
だから、 >>294 は単なる表記の揺らぎにすぎない (どちらが間違いというものでもない) 例として出しているんだと思います。

300 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 18:40:02.03 ID:dbAYBMOA.net]
>>295
CでC89以前にK&R Cがあったように
C++でもC++98以前にARM C++があった

ISO限定で言うと餃子の言うようになるが
もっと遡るとtypenameは後からできたもので
ARM C++では<class T>という書き方しかできなかった



301 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 21:00:22.61 ID:VuV41aeC.net]
三十年くらい前にC++primerだったかな?
「typenameとclassならclassのほうで書いとけ、
なぜならタイプ数が少ないから」
みたいに書いてるところがあって(半分ジョークなんだろうな)
最初にそれで刷り込まれてるからclassでしか書いたことない

302 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 21:15:01.67 ID:uqZOpMdD.net]
structと書くことも

303 名前:デフォルトの名無しさん [2022/06/24(金) 22:03:13.47 ID:JvzMg+3d.net]
C++ってstaticメソッド継承されますっけ?
Parent.Hoge()ってChild.Hoge()としても呼べます?

あるスクリプト言語を使ってた時にどうやら継承されてなかったようで、言語ごとに違うのか気になりました

304 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 22:13:15.23 ID:zVbF8VlC.net]
はい。

305 名前:はちみつ餃子 mailto:sage [2022/06/24(金) 22:31:13.16 ID:STd+R5JH.net]
型引数は class と書いてあってもクラスに分類されない型 (スカラ型など) を受け取れるのでなんか変な気分ではあるな……。
それでも私は class キーワード派だけど。

306 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 22:46:12.30 ID:TGTBUWMm.net]
modern C++ designの著者は、ユーザー定義型のみを想定してる場合はclass,
組み込み型も想定してる場合はtypenameにしてると書いてたな

307 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 23:16:18.24 ID:jv7PClvp.net]
今はそういうのはコンセプトの仕事だからなあ

308 名前:デフォルトの名無しさん [2022/06/25(土) 10:55:48.71 ID:23CjKpU2.net]
>>300
private とか protected とか知ってるか

309 名前:デフォルトの名無しさん [2022/06/25(土) 11:54:25 ID:xaZtK0Rm.net]
private踏んだりしたらエラーメッセージ見れば済む話だと思うが
class継承のときのpublicつけ忘れでprivate扱いになるのはやらかしてそう

class C{
public: static void f(){}
};
class D : public C{};

int main(){D::f();}

310 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 12:22:32.29 ID:UASxpJXI.net]
>>306
エラーにならんが、何が言いたい?



311 名前:デフォルトの名無しさん [2022/06/25(土) 13:43:07.60 ID:xaZtK0Rm.net]
>>307
class継承のpublic忘れるとエラーになるよと言う話
2箇所あるpublicのどっちか消してみなよ

312 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 13:45:13.45 ID:KYOYlq4y.net]
static関係なくね?

313 名前:デフォルトの名無しさん [2022/06/25(土) 13:48:22.71 ID:23CjKpU2.net]
publicつけ忘れで

314 名前:デフォルトの名無しさん [2022/06/25(土) 13:49:20.71 ID:23CjKpU2.net]
>>309
staticもつけ忘れたのか
どんくさいなお前

315 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 17:46:22.26 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 17:47:57.25 ID:x+PfXs9r.net]
それと>>279の口ぶりでは数論変換にしたら桁違いに早くなるみたいに読めるが
double同士の掛け算2^15回分が
int64同士の掛け算2^15回分に高速化される程度であって現行のレコード145 秒が100 秒切れるようになるか
っていうとビミョー

はい論破、

317 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 18:01:39.85 ID:x+PfXs9r.net]
>>302の行間に書いてある通り、型引数意外の状況でだがtypenameキーワードが必要なケースが存在する
ていうかこれ↓
https://faithandbrave.hateblo.jp/entry/20080129/1201597743

逆に言うと
それ以外ならclassでええやん、、、

318 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 18:04:28.52 ID:x+PfXs9r.net]
アンカーミスったorz
誤: >>302
正: >>296

319 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 18:25:49.29 ID:XIyeaAEp.net]
またくっさいチラ裏ジジイが湧いたのか

320 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 18:35:28.83 ID:x+PfXs9r.net]
ハイハイここは高尚なインターネッツでつね;;;



321 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 19:23:01.22 ID:/zwkJ/mi.net]
>>314
なんできゅうにそこのtypenameの話しだすの?
単に型パラメータんとこの話をずっとしてたんやないん今まで

322 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 20:46:58 ID:JEWFr+UF.net]
>>317
相変わらず誤字を直せねーのな

323 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 21:53:15.48 ID:cTvyoIxe.net]
次のセールってハロウィンなっちゃう?

324 名前:デフォルトの名無しさん mailto:sage [2022/06/25(土) 23:44:17.32 ID:BChKe9nl.net]
何の?

325 名前:デフォルトの名無しさん mailto:sage [2022/06/27(月) 01:22:11.44 ID:lmKSzJyY.net]
steamかな

326 名前:デフォルトの名無しさん mailto:sage [2022/06/29(水) 12:39:09.60 ID:CyBPFABm.net]
>>300
>C++ってstaticメソッド継承されますっけ?
継承と言うか「可視」ではある。

>Parent.Hoge()ってChild.Hoge()としても呼べます?
staticメンバを参照したい場合は、インスタンス・メンバとは書き方が違って、
Parent::Hoge() や Child::Hoge()
と書く。

でも微妙だな、Child::Hoge()で呼び出せるかどうか、実験の必要はある。

327 名前:デフォルトの名無しさん mailto:sage [2022/07/01(金) 12:57:20.10 ID:Niu9C9y8.net]
インスタンスからも static メソッドは呼び出せるよ
https://ideone.com/tpA9jy

328 名前:デフォルトの名無しさん mailto:sage [2022/07/01(金) 14:54:49.17 ID:oLSBM8mZ.net]
>>323
なぜ継承を可視と言い直すんだ?

329 名前:デフォルトの名無しさん mailto:sage [2022/07/01(金) 14:57:39.83 ID:to5rXuQ/.net]
ヴァーチャンが使えないからだろ

330 名前:デフォルトの名無しさん mailto:sage [2022/07/03(日) 05:57:55.66 ID:S0pZ0Csa.net]
C++コンパイラっていつからconst char*型引数がbool型引数に暗黙変換されるようにな



331 名前:チたんだ?
以下のような内容が警告なしでコンパイルできてしまうんだが

int foo(bool bar);

const char* ptr = "test";
foo(ptr);
[]
[ここ壊れてます]

332 名前:デフォルトの名無しさん mailto:sage [2022/07/03(日) 07:53:18.35 ID:K2/9xttr.net]
スカラ型がboolに暗黙変換できるのは太古から変わってない

int (*p)(bool) = foo;
std::cout << foo; //出力は「1」だがfooが1番地から開始ということではない

333 名前:デフォルトの名無しさん mailto:sage [2022/07/03(日) 07:54:43.51 ID:K2/9xttr.net]
pいらんかったな、わりいわりいw

334 名前:デフォルトの名無しさん mailto:sage [2022/07/04(月) 13:56:35 ID: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 名前:はちみつ餃子 mailto:sage [2022/07/04(月) 14:27:48.07 ID:3k8jHKP2.net]
>>330
問題が再現するコードを提示してください。

336 名前:デフォルトの名無しさん mailto:sage [2022/07/04(月) 14:31:47.29 ID:SMoN2Nle.net]
へたくそ

337 名前:デフォルトの名無しさん [2022/07/04(月) 17:28:39.11 ID:nt0V70V1.net]
どっかで
namespace hoge{
class member_ptr;
}
class member_ptr;
みたいなことやってるような気がする

前方宣言(か実体定義)が別の名前空間にあって、同じclassを見てるつもりで別のclassを見ているだけじゃない?

338 名前:デフォルトの名無しさん [2022/07/04(月) 17:47:01.88 ID: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 mailto:sage [2022/07/04(月) 18:04:55 ID:3k8jHKP2.net]
>>334
class キーワードを付けた場合にはクラスの宣言を同時にしたものとみなされる。
つまり class ptr* get_mPtr(); と class ptr* mPtr; は「このスコープで」 ptr を宣言したかのように扱われる。
もちろん実際には innerTest の中では ptr の定義はないので不完全型のままだが、
この ptr は Test::innerTest::ptr のつもりで解釈されてる。
グローバル空間で定義している ptr とは別物なので別物というエラーになるわけ。

340 名前:デフォルトの名無しさん mailto:sage [2022/07/04(月) 18:34:14.66 ID:PrdXwxk2.net]
class ptr;
namespace Test {
...



341 名前:デフォルトの名無しさん mailto:sage [2022/07/04(月) 18:53:01.66 ID:tfDB1jS/.net]
Cのstructと同じ感覚でclassって書いちゃってるのかこれ

342 名前:デフォルトの名無しさん mailto:sage [2022/07/04(月) 18:59:50.67 ID:XQTVc721.net]
>>335
> この ptr は Test::innerTest::ptr のつもりで解釈されてる。
Test::ptr だね。
https://timsong-cpp.github.io/cppwp/n4861/basic.scope.pdecl#7.2

343 名前:デフォルトの名無しさん [2022/07/04(月) 19:27:20.38 ID:KuJlBNV3.net]
>>335!336,338
ありがとうございます!

おっしゃる通りに名前空間の外で前方宣言し、ソース部分で定義したらうまくいきました!
特に理由がない限り、名前空間内部で定義してはいけない(戒め)
ありがとうございました!

344 名前:デフォルトの名無しさん [2022/07/05(火) 15:17:54.21 ID:CUrAgxNd.net]
有害だな

345 名前:蟻人間 mailto:sage [2022/07/05(火) 20:29:56.62 ID:ol9myr0e.net]
You guy

346 名前:デフォルトの名無しさん [2022/07/05(火) 23:44:59.73 ID:tIUWM2dq.net]
VB.NETからバイナリをC++(JNI)に渡して受け取ったバイナリをJavaに渡したいんですけど、C++で受け取ったBYTEをjobjectに変換する方法が分かりません。
どなたかご存知でしょうか。

347 名前:デフォルトの名無しさん mailto:sage [2022/07/06(水) 23:58:31.79 ID:Hb7nTur+.net]
C++勉強中です。ムーブコンストラクタについて教えてください。
ムーブコンストラクタは、要はムーブ元の指すポインタをムーブ先に変更しているだけだと思います。
これはconstなしコンストラクタでも実現できると思いますが、意図を明示するためにコンストラクタが分かれていると思っていいですか?
また、ムーブコンストラクタの仮引数が右辺値参照になっている(std::moveした右辺値を渡す)理由がよく分からないのですが、これは決まり文句として覚えるしかないでしょうか?

348 名前:デフォルトの名無しさん mailto:sage [2022/07/07(木) 00:12:38.45 ID:wEF1aVE0.net]
>>343
まさにその発想で作られたauto_ptrとかいうスマポ(廃止済み)がとんでもねえゴミカスだったから
その教訓でコピーとムーブが分けられたんだよ

349 名前:デフォルトの名無しさん mailto:sage [2022/07/07(木) 00:13:26.51 ID:owvrtcUU.net]
ムーブって、所有者が移転してると考えた方が
場所なんてどうでもいいでしょう

350 名前:はちみつ餃子 mailto:sage [2022/07/07(木) 00:38:46.12 ID:6JbvD3+y.net]
>>343
右辺値は大抵の場合に一時オブジェクトだからどうせすぐに破棄される。
後で別の場所で使うということがないと期待できるから内容を移動してしまっても問題にならないんだ。
だから右辺値を入力とするときは原則としてムーブ扱いにする。



351 名前:デフォルトの名無しさん mailto:sage [2022/07/07(木) 08:00:15.88 ID:dqsYDet1.net]
多分、右辺値参照イコールmoveと覚えてしまってるのでは?
C++11より前は一時オブジェクトとそうでないものを文法上区別することが出来なかったのよ
moveはあくまでキャストに過ぎない、一時オブジェクトでないものを一時オブジェクト扱いにしてるだけ

352 名前:343 mailto:sage [2022/07/07(木) 23:27:53.10 ID:jxXWRXC4.net]
一時オブジェクトにキャストしてすぐ破棄されるようにしたと言っても、
右辺値参照に代入しているのでヌルポインタにするまでは使い続けられますよね
そもそもstd::moveで一時オブジェクトにキャスト、これを右辺値参照で束縛して有効期間を延ばす…って
初めから普通の変数を使えばいいのでは?と思ってしまいました
ムーブを表すための仕組みとして&&とstd::moveの組み合わせが追加されたということなんでしょうかね

353 名前:デフォルトの名無しさん [2022/07/07(木) 23:44:43.71 ID:a8KVNXrY.net]
>>348
結局そのあたりも含めてC++で複雑化した様々な点を全てシンプルに綺麗に整理し直して分かりやすくした言語が望まれてRustが登場したんだろうね

354 名前:はちみつ餃子 mailto:sage [2022/07/08(金) 00:13:39.16 ID:5BE4kGYi.net]
>>348
なんだかその文面からは仕組みを理解しているようには見えない。

355 名前:はちみつ餃子 mailto:sage [2022/07/08(金) 00:21:33.36 ID:5BE4kGYi.net]
>>348
何を言いたいのか全然わからない (仕組みを間違って理解しているか用語が誤っているかしている) ので
もうちょっと具体的に実例か何かで示してみて。

356 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 06:38:25.68 ID:MdbO63iw.net]
教科書の言葉適当に並べて分かったふりしてる感がすごい

357 名前:デフォルトの名無しさん [2022/07/08(金) 08:04:48.18 ID:0Bd0SGWI.net]
ムーブは「所有権」をムーブさせるものなので、所有権という概念がないと理解できん

358 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 08:29:23.83 ID:ZqNcNR35.net]
>>349
引数渡しのデフォルトをmoveにしているのは失敗だと思うけどな。
性能優先でそうしたんだと思うけど、そういった技術的説明無いから設計ミスにしか見えない。

359 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 09:59:25.74 ID:XQyLgyG5.net]
>>354
あれは大正解
実際に色々なプログラミングをするとよくわかってくる
Rustは上手く設計されていることがわかる

360 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 10:12:31.24 ID:yJZoYI93.net]
rustのご本が高くてのう



361 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 10:20:08.07 ID:u/BCh/UE.net]
右辺値参照って概念的に難しいよね
そもそも右辺値とはなんぞやというところから、一時オブジェクトの生成とそれが破棄されるまでのコンパイラ側の仕組みを的確に理解する必要がある
こんなのよく思いついたなと感心はするけどw

362 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 10:47:23.92 ID:lp4DRBe8.net]
テンプレート関数で頻繁に出現する=演算子コピーによるオーバーヘッドを減らす必要に迫られただけの話ジャマイカ?

363 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 10:52:14.97 ID:u4+He/YT.net]
>>356
Rust The Book (日本語版)
https://doc.rust-jp.rs/book-ja/
Rust by example book (日本語版)
https://doc.rust-jp.rs/rust-by-example-ja/
Rust cookbook (日本語版)
https://uma0317.github.io/rust-cookbook-ja/
Rust edition guide (日本語版)
https://doc.rust-jp.rs/edition-guide/
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
Rust nomicon book (日本語版)
https://doc.rust-jp.rs/rust-nomicon-ja/
Rust async book (日本語版)
https://async-book-ja.netlify.app/
Rust WASM book (日本語版)
https://moshg.github.io/rustwasm-book-ja/
Rust embeded book (日本語版)
https://tomoyuki-nakabayashi.github.io/book/
Rust enbeded discovery (日本語版)
https://tomoyuki-nakabayashi.github.io/discovery/
Rust Design Patterns (日本語版)
https://qiita.com/Yappii_111/items/4ccc3a8461cdd4035651
https://qiita.com/Yappii_111/items/654717e6a6a980722189
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/

364 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 12:00:52.61 ID:u/BCh/UE.net]
>>353
「所有権」って言っちゃうと誤解を生むような気がする
実体としてはデストラクタを呼ぶ権利だよね
インスタンス自体は(通常)スタック上に確保されているので、その所有権の移動まではできない
だからこそ「参照」なんだけども

365 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 13:38:22.19 ID:GovhUdR1.net]
デストラクタを呼ぶ権利だなんてお前も理解してないだろ

366 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 15:16:55.64 ID:bBPWEvXX.net]
>>355
移譲にした方が嬉しい例を示してくれ。
C++なら引数渡ししてもオブジェクトは手元に残るのが常識だから、Rustがわざわざ移譲デフォルトにしているのは違和感しかない。実際、Rust習得の最初の難関が移譲だし。

>>360
本当は「所有権」じゃなくて「管理責任」だからな。スマートポインタとか所有していないリソースの管理とかやらされるし。

367 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 16:27:06 ID:VZayErSn.net]
>>362
移譲という概念はない
C/C++もRustも同じで&を付けて&varnameの形で渡せば参照渡しとなる
同じ形なので全く違和感はない
所有権を手放さないで渡すには参照渡ししかないのだからその場合は&を付ければよい

もちろんプログラミング言語によって異なる部分もあるのは当然
そんな些細なことを違和感と言うのは極少数の類似言語しか知らないと言ってるようなもの

368 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 16:46:29 ID:MdbO63iw.net]
まあ所有権というよりは「後始末をする義務」だよな
日常的にポイ捨てしてるモラルの低い人間にはピンとこないかもしれない

369 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 17:07:32.78 ID:d0X5Obt/.net]
誰が持ってるかわからんよりは、絶対渡すと決めたほうが安全な気はする

370 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 23:52:34 ID:J0vSCVey.net]
>>362
それは非常にシンプルで突き詰めれば値渡しと参照渡しの2つしかないところを『参照渡し』は結局ポインタを渡せばよくC/C++/Rust揃って「&変数名」表記
もう一つの『値渡し』のところで少し考えるべきことが出てくる

大きく分けて二つに分かれる
(A) 数値型など値をコピーして渡しても問題なくコストも安い型の場合
(B) ヒープに確保した領域など値をコピーして渡すのはコストも高い型の場合
ここで後者(B)のケースは所有権すなわちメモリ解放責任も関わってくる
Rustでは
(A)タイプの型の場合はコピーして渡す
  →コピー可能な型は所有権なし
(B)タイプの型の場合はムーブして渡す
  →所有権(解放責任)が移動する

もし(B)タイプの型で所有権を保持したまま渡したいならば
 (1) 参照渡しをする
 (2) コストがかかってもよいから明示的にコピー(clone)して渡す
の2通りとなる
つまり
 (3) 所有権をムーブする
と合わせて3通りの渡し方が存在する

最初の問題に戻ると
渡し方の表記「&変数名」と&を付けない「変数名」の二つある表記法を
(1)(2)(3)の3通りのどれに割り当てるかという問題に帰着する
「(1)参照渡し」はC/C++と同じく「&変数名」と記述
そして残る&を付けない「変数名」のみの表記をコストが低い「(3)所有権ムーブ」とした
ちなみにコストが大きくかかる「(2)コピー(clone)」はcloneした時点で別物となり新たな別の所有権(解放責任)が生じているため専用の表記方法は必要ないが強いて式として書けば「変数名.clone()」となる
これはlet x = 変数名.clone(); としておいて「x」とだけ表記して渡すのと同じ
つまり新たに生まれたxをムーブするのと同じになり表記に一貫性がある

以上の理由によりRustでの引数などの渡し方の表記方法は上述のようになっている



371 名前:343 mailto:sage [2022/07/09(土) 00:02:30.53 ID:h3YKvoyj.net]
理解してから質問させてもらったつもりなんですが、まだ全然だったようです
確かに所有権という概念を理解していません
勉強してから出直します
ありがとうございました

372 名前:デフォルトの名無しさん [2022/07/09(土) 00:12:24.76 ID:GNVCknQf.net]
void君復帰したん?

373 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 09:11:51.90 ID:6ug5/LDh.net]
はつみみです。

374 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 10:56:35.87 ID:xh0VR/GV.net]
>>367
というより、コードが実際にどういう動作になるかがわかってない感じ(それこそC言語レベルの基本のところ)
もっと書いて実験した方がいいよ

375 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 11:11:15 ID:tUS5A0PY.net]
move の挙動を「C言語レベルの基本の」サンプルコードで理解できたら画期的だなあ笑

376 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 11:26:32 ID:v7oB8mPb.net]
Cにはそもそもオーバーロードがないからなあ

377 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 12:51:52.12 ID:l8dyP7Xp.net]
エアプだろお前ら
>>348辺りから読み直せ
一時オブジェクトの破棄とか裏で何が起こるかの超基本が理解できてないから
あくまで文法上のことに過ぎないmoveと破棄をごっちゃにしてると言ってる

378 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 12:55:08.37 ID:GKrnmeJx.net]
所有権ってデストラクタで破棄する義務を負う、権利とは名ばかりな概念でしょ

379 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 13:07:46.27 ID:nKY2xH6j.net]
昔はリファレンスカウンタでやってたな

380 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 13:45:41.58 ID:CWVMe8St.net]
自分から破棄しない限りはアクセスできることが保証されるから権利ではあるな



381 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 14:00:45.40 ID:GKrnmeJx.net]
オプーナを買う権利をやろう

382 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 14:07:45.84 ID:p9oybaSY.net]
エナジーボンボンはCodeVeinに出てくる赤い玉だったんだよ

383 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 16:17:17.24 ID:vntA8Dp0.net]
>>376
他からアクセスできることが保証されなければバグってすべておじゃんなのだから
>>376の権利は有難がっても仕方が無い

384 名前:デフォルトの名無しさん [2022/07/11(月) 10:49:23.74 ID:1W23UOpt.net]
>>358
ほんそれ

385 名前:デフォルトの名無しさん [2022/07/11(月) 10:51:27.98 ID:1W23UOpt.net]
>>364
ほんそれ++

386 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 21:11:34.35 ID:dGJ2mZ34.net]
=std::numeric_limits<decltype(ほんそれ)>::max()

387 名前:デフォルトの名無しさん [2022/07/16(土) 16:37:55.35 ID:scS6hSP+.net]
condition_variableってなんでわざわざmutexと一緒に定義しないといけないの面倒でしかたないんだけど。
しかもへんてこな目覚めがあるなんてバグを平然と放置してるし。
win32のSetEvent()のほうが俄然使いやすいんだけど。

388 名前:はちみつ餃子 mailto:sage [2022/07/16(土) 17:49:19.54 ID:cnHD4OK4.net]
mutex は排他の仕組みであって同期の仕組みと分離する思想なんじゃないかなぁ……。
あんまりイケてないとは思うけど。

389 名前:デフォルトの名無しさん [2022/07/16(土) 19:38:19.38 ID:UNJL4ykU.net]
それはOSの問題なうえ、充分合理的な動作と認められている。

390 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 21:13:53.10 ID:cotnetTK.net]
へんてこな目覚めはなんで生じるのかは知らんなんか深い理由でもあるんじゃないのJK
それはおくとして、両者にはキューイングの思想の違いがまずありき、
[1] WindowsのSetEvent()はイベント発生をキューイングし、待機中スレッドをキューイングしない
[2] 条件変数はイベント発生をキューイングせず、待機中スレッドをキューイングする

これでかなりイベント発生と待機の組み合わせの性格の違いが出る。

[1]は待機中スレッドが無くともイベントをセットでき、その後最初に待ちに入ったスレッド1個が待ち解除される
[2]は待機中スレッドが無いとイベントが無視されるが、通知方法をnotify_one()だけでなくnotify_all()も選べる

[1]はWaitForMultipleObject()により1箇所の待機で複数種類のイベントを待ち受けられる(μITRONのイベントフラグ的な使い方ができる
が、[2]でそれをやろうとするとあるイベントでスレッドを起こしたら、そのスレッドの待機中スレッドとしてのキューイングを
他のイベントついてもクリアせねばならない、みたいな余計な処理が必要で効率的に実装できない

ということは、条件変数でWaitForMultipleObject()的なことをやろうとしたら、イベント要因を別途変数にセットして
待機中スレッドに伝える必要があり、この変数の操作→イベント待ち解除→解除されたスレッドが変数を参照、
というのをatomicにやらざるおえないから、ミューテックスのブロック内でイベントの待機とセットを行わねばならない仕様に、
なったと思う



391 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 21:20:57.63 ID:ucdNPaM6.net]
それ隠蔽できるだろうけど、条件変数の基本要素がそれなんだからそういうもんです。

392 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 21:25:01.45 ID:cotnetTK.net]
しかしまあ普通にスレッドの中にイベント待ちを作ったら、
イベント要因は
(1) 本来のイベントの意味(複数かもしれん
(2) スレッド終了
の2種類は必ず生じるけどこのために2種類以上のイベントオブジェクトを設けてWaitForMultipleObject()で待機するのは
アフォらしいので結局条件変数的に、イベントオブジェクトは1個、イベント要因を表す変数が1個、みたいな形になって
条件変数と同じようなしくみに落ち着く
、希ガス
(ただしイベントオブジェクトとイベントを待つスレッドの実体が完全に1対1ならミューテックスによるガードは不要

393 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 21:52:02.32 ID:ucdNPaM6.net]
mutexないとあっちのスレッドが条件変えちゃうのでは

394 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 22:02:42.26 ID:cotnetTK.net]
イベント要因が3種類以上とかイベント発生と待機解除が必ず1対1でなければならない、みたいなケースを含むちょう一般論で言うとそうかorz

395 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 22:31:27.60 ID:ogh00ppx.net]
>>388
>イベントオブジェクトは1個、イベント要因を表す変数が1個
その方がめんどくせえわ

396 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 03:07:07.04 ID:1DOilu1h.net]
>>383
condition_variableの引数にmutexのロックがあるおかげで休眠処理を(1-1)〜(1-5)のようにできる
(1-1)mutexでロックして、(1-2)起動条件を設定して、(1-3)起動条件のチェックをしてから、(1-4)休眠して、(1-5)ロックを解除

もしそういう仕組みが無いとこんな感じになるかな
(2-1)mutexでロックして、(2-2)起動条件を設定して、(2-3)ロックを解除して、(2-4)起動条件のチェックをしてから、(2-5)休眠する

休眠を起こす方は、(1)mutexでロックして、(2)起動条件を設定して、(3)起動して、(4)ロックを解除、となるわけだけど、
(2-1)〜(2-5)の場合、(2-4)の後(2-5)の前に(1)〜(4)が動くことができて、その場合に永遠に休眠する場合がある
(1-1)〜(1-5)ならそういう問題が無い

397 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 03:32:35.77 ID:RIt+yucv.net]
バトン持ってるやつが偉いというのはいいとして、バトンを途切れなく渡すための仕組みが要るんじゃ

398 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 11:47:51.28 ID:sgfC4LCK.net]
>>383
実際まあ面倒くさいよな。
最近は後で書き直すつもりでとりあえずスピンしてatomic_bool待つコード書いてしまってるわ

399 名前:デフォルトの名無しさん [2022/07/21(木) 12:23:18.60 ID:eB2QSMyp.net]
>>388
>>392

ご回答ありがとうございます。
かなりお詳しい方とお見受けします。

ご回答いただいてから、何回も読み直してしますが
いまいち理解できていない状況です。

そういうものとして、コーディングすれば別に支支障はないのですが、御二方のように完璧に理解したいと勉強しております。

また質問させて頂くかもしれませんが、その際はよろしくお願い申し上げます。

以上

400 名前:デフォルトの名無しさん mailto:sage [2022/07/26(火) 01:16:01.56 ID:DHatjrG/.net]
基底クラスのprivateメンバと、private継承された基底クラスのpublicメンバって派生クラスから見たら同じじゃないんでしょうか?
前者は派生クラスからアクセス不可で、後者は派生クラスからアクセス可能なようです
というとこは意味が違うんでしょうが調べでもよく分かりませんでした
どなたか教えてください



401 名前:デフォルトの名無しさん [2022/07/26(火) 04:47:14.80 ID:F8qnHJbo.net]
public/privateは、自分よりも外側からのアクセスを許可するかの指定。

class B{
private: int b1;
public: int b2;
};
class C: private B{};
int main(){
B b;
C c;
}

b.b2はアクセス可能。c.b2はアクセス不可能。
class C内からは元々publicだったthis->b2のアクセスに制限はない。

402 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 00:07:28.21 ID:f9fWEf7v.net]
Carbon の話はスレチ?

403 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 00:43:24.02 ID:YyifIEEo.net]
>>397
class Bをprivate継承したことで、b2はclass Cのprivateメンバになるということですね
理解しました、ありがとうございました

404 名前:アリ人間 mailto:sage [2022/07/27(水) 00:48:37.81 ID:LZk+uw73.net]
>>398
需要なさそうなC++の派生みたい。
人気が出てきたらスレを分けよう。

405 名前:デフォルトの名無しさん mailto:sage [2022/07/29(金) 01:50:30.95 ID:0LOpWdsN.net]
通常のキャストと参照へのキャストの違いを教えてください。

#include <iostream>

class Base {};
class Derived : public Base {};

int main()
{
Derived d;
Base& b1 = static_cast<Base&>(d); //@
Base& b2 = static_cast<Base>(d); //A
}

このようなとき、@だとコンパイルOK、Aだとコンパイルエラーになります。
どのような違いがあるのでしょうか?

406 名前:デフォルトの名無しさん mailto:sage [2022/07/29(金) 02:07:00.18 ID:drZ02Ew4.net]
>>401
キャストが原因でコンパイルエラーが出てるわけではないです

簡単に言うと②の右辺は rvalue なので非 const lvalue に束縛できません

407 名前:デフォルトの名無しさん mailto:sage [2022/07/29(金) 08:15:31.60 ID:FIiQg0BH.net]
>>401
値へのキャストは、一時オブジェクトを作り必要ならコンストラクタを実行する
参照へのキャストは、一時オブジェクトを作らない

ただしconst修飾された参照と右辺値参照の場合はこの限りでない

408 名前:はちみつ餃子 mailto:sage [2022/07/29(金) 10:28:08.30 ID:nU9Bb2FG.net]
具体例で言うとこれ↓はアリってこと。

#include <iostream>

class Base {};
class Derived : public Base {};

int main()
{
Derived d;
Base&& b3 = static_cast<Base>(d);
const Base& b4 = static_cast<Base>(d);
}

注意点として、
本来なら一時オブジェクトは式の終わりに解体されるので参照が無効になりそうなもんだが
参照で受けている場合はその参照の寿命と同じ分だけ延命される特例がある。

409 名前:デフォルトの名無しさん [2022/07/29(金) 10:44:28.57 ID:nIcw6oQb.net]
>>396
違うに決まってるだろ

410 名前:デフォルトの名無しさん mailto:sage [2022/07/29(金) 11:30:48.51 ID:FIiQg0BH.net]
俺が言ったのはこれのこと

struct base
{
base(int);
};

int main()
{
static_cast<base const&>(1);
static_cast<base&&>(1);
}



411 名前:デフォルトの名無しさん mailto:sage [2022/07/30(土) 21:44:57.83 ID:Ejgi0TIU.net]
コンストラクタの最適化(によるコンストラクタ呼び出し自体を削除)は
コピコンだけが適用?

412 名前:デフォルトの名無しさん mailto:sage [2022/07/30(土) 21:52:49.25 ID:hbp6z9LQ.net]
moveもrvoとかで無くなる

413 名前:デフォルトの名無しさん mailto:sage [2022/07/31(日) 13:35:39.44 ID:VcJyNGFX.net]
じゃあ>>406 のコードでは
コンストラクタの呼び出しだけは保証されて、
その後のコピーやムーブは保証されない動きになる?

414 名前:デフォルトの名無しさん mailto:sage [2022/07/31(日) 14:03:07.60 ID:oR2ATHk7.net]
そもそも406のコードにコピーもムーブも一つも出てきてないけど

415 名前:デフォルトの名無しさん [2022/07/31(日) 16:05:21.48 ID:7/NlTuud.net]
・フリーランスに立ちはだかる「常駐」の壁。慣例を打ち壊し、
“テレワーク”案件3割→8割へと成長を遂げた「クラウドテック」の軌跡
・リモートワーク求人専門サイト「プロリモート」がリニューアルオープン、
 業務委託契約の求職者と企業をマッチング 
・1/3以上が採用につながる高マッチング率、リモートワーク×エンジニア・デザイナー専門の
 人材紹介サービス「ReworkerAgent」正式リリース場所からも時間からも自由な働き方を実現!
・『ReWorks(リワークス)』リモートワーク特化型転職サイトとして 3月5日 リニューアル
・副業・兼業マッチングサービス「クラウドリンクス」登録者数2万人突破
 中小企業で進む副業人材の採用、96%が継続採用を希望
・フリーランスが活用できる「最大1,000〜3,000万円・補助率50%〜75%」の
『ものづくり・商業・サービス補助金』とは?概要や条件を解説
・茨城県日立市、県外からの「テレワーク移住者」に最大151万円の助成金
・長野市、市内に移転・事業所設置し、移住することで最大550万円の支援金を支給

416 名前:デフォルトの名無しさん mailto:sage [2022/08/03(水) 14:12:19.69 ID:Y5L3Fd0k.net]
練習でオブジェクトデータベースもどき を書いたらGITHUBに送ったのになんか反映されない。

がーん!!

417 名前:デフォルトの名無しさん mailto:sage [2022/08/03(水) 14:27:47.83 ID:7AThd70z.net]
見てるブランチが違うんだろ

418 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 00:40:10.66 ID:s3oOei4P.net]
コンストラクタって本当に戻り値無いんですか?
例えば
MyClass c = MyClass();
としたとき、cにはMyClassのコンストラクタで生成されたインスタンスが格納されます
戻り値が無いのになぜそうなるのでしょうか?

419 名前:はちみつ餃子 mailto:sage [2022/08/04(木) 01:26:43.48 ID:hPtMGH66.net]
>>414
それは明示的な型変換 (関数記法) という規則で示されている。
https://timsong-cpp.github.io/cppwp/n3337/expr.type.conv
見かけ上は普通の関数呼出しと区別がつかない記法を使うけれど関数呼出しではない。

クラス名を関数風に使ったらコンストラクタで構築したオブジェクトを (あたかも関数の返却値のように) 返すことになっているというだけなんで、
まあそういう仕様なのだと覚えてもらうしかしょうがない。
コンストラクタは特別な地位にあって色々と特別な規則があるんよ。

420 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 01:47:34.25 ID:s3oOei4P.net]
>>415
ありがとうございます
そういう仕様だと覚えることにします

ついでで申し訳ないんですが、コンストラクタと明示的な型変換って同じものなんですか?
MyClassA a;
MyClassB b = MyClassB(a);
としたとき、コンストラクタはMyClassBの関数ですが、明示的な型変換はa(MyClassA)の関数ですよね?



421 名前:はちみつ餃子 mailto:sage [2022/08/04(木) 02:30:19.53 ID:hPtMGH66.net]
>>416
> コンストラクタと明示的な型変換って同じものなんですか?

違う。 明示的な型変換を試みた結果としてコンストラクタが呼び出されたりもするということ。

> コンストラクタはMyClassBの関数ですが

MyClassB のメンバ関数の意かな?

> 明示的な型変換はa(MyClassA)の関数ですよね?

何がいいたいのかわからない。
MyClassB と書いてあるのに何故か MyClassA のなんらかのメンバ関数が呼ばれると思っているということ?
どうしてそう思ったのかもうちょっと詳しく説明してみて。

422 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 10:23:55.38 ID:4E08n67o.net]
>> 417

class MyClassB {};
class MyClassA
{
public:
operator MyClassB() const {
return MyClassB();
}
};
int main()
{
MyClassA a;
MyClassB b = MyClassB(a);
}

このようなとき、型変換で呼ばれるのはMyClassAのメンバ関数であるoperator MyClassBですよね?
MyClassBのメンバ関数であるコンストラクタを呼び出しているのと見分けがつかないので、疑問に思いました

423 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 10:41:35 ID:fn9V0Lga.net]
explicit指定してなけらば代入はコンストラクタに渡される

424 名前:はちみつ餃子 mailto:sage [2022/08/04(木) 11:47:40.74 ID:hPtMGH66.net]
>>418
ユーザー定義変換演算子があればそれが使われたりもすることもある。
どの状況で何が呼ばれるのかは複雑な解決規則があって、どちらかが優先になることもあれば曖昧 (エラー) になることもある。

この場合にどうなってるのか仕様を辿ってみたんだが、
MyClassB(a) は C スタイルのキャストと等しいので (MyClassB)a と同等、
そしてこれは static_cast<MyClassB>(a) と同等と解釈される。
このとき MyClassB temp(a) と宣言し

425 名前:スときのように初期化された架空の変数 temp の値が返される。
そういうルールだった。

MyClassB temp(a) と宣言したときに MyClassB が MyClassA を受け取るコンストラクタを持っていれば
それが呼ばれる (この場合はそのようなコンストラクタはないので呼ばれない) し、
そうでないなら暗黙の型変換が実施されるので MyClassA::operator MyClassB が呼ばれてから初期化される。
[]
[ここ壊れてます]

426 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 12:25:40.96 ID:YlkBTNtd.net]
職業としてc++を使用してる人に聞きたいんだけど
設計者がどう動作するか分かってないコードが含まれる製品が出荷されてるのっておかしくない?

しかもその担当は、俺あんまりパソコン得意じゃないって。
そんな人間が書いてるソフトをお金を出して買ってくださってるお客様に言えるかよ、馬鹿なのかな

427 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 12:42:29.07 ID:foJKY5q3.net]
まあ売る方も買う方も承知でやってる互助会みたいな世界もあるから

428 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 12:49:09 ID:iuI8tOa1.net]
自社製品のすべてをわかっている事業者なんてないよ
もしものためにお客様相談窓口あるわけだし

429 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 12:58:24 ID:YlkBTNtd.net]
>>423
そう言うことではない。
では、あなたに聞きたい
車を買

430 名前:「に行って、ディーラーの人に「このボタンなんですか?」と質問して「押してみないと分からない」なんて答えたらどう思いますか?

ディーラーが設計してるわけではないことくらい誰でも知ってるけど、ここで買っていいのか?って思いませんか?
[]
[ここ壊れてます]



431 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 13:09:55 ID:4HLZV6kX.net]
>>421
C++使いはPCのパワーユーザーとは限らんよ
それにPCだって無数の技術が詰め込まれていて
たとえるなら1つの大学のようなもので
迂闊に「俺はものすごくPCに詳しいんだ!」なんて言うと
ほぼ100%恥かくしな

432 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 13:28:40.86 ID:YMWE04jW.net]
>>424
外部仕様と内部仕様の区別もつかないボンクラ乙w

433 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 17:01:53.54 ID:bxsqlndn.net]
つかC++関係無くね
どの工程にでも言える話をここでされても困るんだけど

434 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 18:34:39.03 ID:Te3vhihz.net]
>>426
お前は文章も読めないのか

435 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 18:53:04.81 ID:iPtxbdCe.net]
まず>>421がC++との関連を示すべき。それ以外のところで話を広げても不毛。

436 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 19:04:48.18 ID:4E08n67o.net]
>>420
解決規則が知りたいと思ったのですが状況によって難しそうですね
混乱してきたので整理して考え直します
ありがとうございました

437 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 19:32:37.46 ID:YMWE04jW.net]
>>428
マジで言ってるならもう少し勉強してきた方がいい
ボタンの操作とかのように取説に載ってるのは外部仕様
>>421はそういう話じゃない
原理はわからなくてもテストちゃんとしとけばいいという世界もある

438 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 20:58:43.21 ID:msSueNHM.net]
windows作ってる開発者や営業にメモ帳のショートカット全部言えるか聞いてみればいいんじゃね?
外部仕様すら知らんの?馬鹿なのかなって

439 名前:デフォルトの名無しさん [2022/08/04(木) 21:17:24.76 ID:isEYuHXY.net]
「メモ帳のショートカットを言え」がなんのことやらわからない。

440 名前:はちみつ餃子 mailto:sage [2022/08/04(木) 21:27:41.19 ID:hPtMGH66.net]
最大限にエスパー能力を発揮してアクロバティックに解釈するとテキスト形式のファイルのことではないかと思う。
デフォルトだとメモ帳に関連付けられているからテキスト=メモ帳という認識が出来上がる可能性はある。



441 名前:デフォルトの名無しさん [2022/08/04(木) 21:36:35.22 ID:isEYuHXY.net]
関連付けされた拡張子の話をしてるのかな?
それでもあとからインストールされたものでコロコロ変わるから、意味不明だな。

442 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 21:58:15.71 ID:msSueNHM.net]
メモ帳はnotepad.exe、ショートカットはキーボードショートカットの意味だがそれすら想像つかないなんてずいぶん頭が悪いな
パソコン得意じゃないのはお前のことじゃん

443 名前:デフォルトの名無しさん [2022/08/04(木) 21:59:21.33 ID:isEYuHXY.net]
>>436
Windowsのショートカットはそういう意味じゃない。

444 名前:デフォルトの名無しさん [2022/08/04(木) 21:59:22.67 ID:Xd358RP3.net]
ショートカットキーのことでは?

445 名前:デフォルトの名無しさん [2022/08/04(木) 22:00:54.91 ID:isEYuHXY.net]
>>438
そんなのわかっているが、彼の略語が自分にしかわからないから問題にしている。

446 名前:デフォルトの名無しさん [2022/08/04(木) 22:04:19.71 ID:isEYuHXY.net]
>>438
メモ帳にショートカットキーは割り当てられていない。
メモ帳を起動する方法の種類を言っているんだろう。

447 名前:デフォルトの名無しさん [2022/08/04(木) 22:05:15.46 ID:isEYuHXY.net]
自分のPCの設定をデフォルト設定だと思っているジジイだろうな

448 名前:デフォルトの名無しさん [2022/08/04(木) 22:05:56.15 ID:isEYuHXY.net]
変なのいくらでもいるんだなと思った

449 名前:デフォルトの名無しさん [2022/08/04(木) 22:06:10.34 ID:Xd358RP3.net]
争いが起きるのは霊的な問題もあると思うんですよね。
先日亡くなられた安倍元総理も生前大切にされていた霊験あらたかな壺があるそうなんですよ。
ただ、とても値が張るそうで、安いものでも3000万を下らないそうなんです。
そこで、5ch有志でお金を出し合って共同で購入しませんか?
そうすればスレも安定すると思うんです。

450 名前:デフォルトの名無しさん [2022/08/04(木) 22:17:42.40 ID:isEYuHXY.net]
Windowsのファイルの種類のひとつが「ショートカット」というのがわからなくなって、Windowsそのもののことがわからないのに知ったかぶりで物を言う認知症のじいさんなんだろ。



451 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 22:18:06.28 ID:bxsqlndn.net]
おまえら全員Windows板行って二度と帰ってくんな

452 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 22:21:02.93 ID:ICFzqGoM.net]
winならアクセラレータキーだろ

453 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 22:24:31.32 ID:YMWE04jW.net]
>>432
そらで全部言える必要ないだろ
開発者なら外部仕様にアクセスできるだろうから一覧くれって言えば出すことはできるだろ

454 名前:デフォルトの名無しさん [2022/08/04(木) 22:27:08.73 ID:isEYuHXY.net]
メモ帳にショートカットキーがあるという架空の設定で話していてもよくわからない。

455 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 22:42:58.32 ID:142AVZpN.net]
F5で現在時刻入力とかCtrl+Gで行番号指定ジャンプとかCtrl+-/+/0で縮小・拡大・元に戻すとかの
メモ帳のキーバインドのことなんじゃないのどうでもいいけど

456 名前:デフォルトの名無しさん [2022/08/04(木) 23:10:21.02 ID:isEYuHXY.net]
>>449
メモ帳そのもののことを言っていたわけか。メモ帳を使っている人間がどれだけいるのか疑問だけど。

457 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 23:16:20.71 ID:KJ7UAuj1.net]
>>443
いい歳こいてオカルトは恥ずかしいぞ

458 名前:デフォルトの名無しさん mailto:sage [2022/08/04(木) 23:42:02.70 ID:CV93jyTL.net]
というか、あれってエディットコントロールの機能ですよね
エディットコントロールのソースってどっかでみることが出来ますかね?

459 名前:はちみつ餃子 mailto:sage [2022/08/04(木) 23:54:18.07 ID:hPtMGH66.net]
Windows のソースコードは一部の政府機関や学術機関と契約を結んで提供している事例はあるが、
個人で見せてもらえるようなもんじゃないよ。
あえて言うなら ReactOS (Windows 互換の OS を目指すオープンソースプロジェクト) が参考になるかもね。

460 名前:デフォルトの名無しさん [2022/08/06(土) 14:19:53.03 ID:eSBCWCwI.net]
>>415
MyClass a();
MyClass & b = MyClass();
const MyClass & c = MyClass();
MyClass d = MyClass(); ← コピーコンストラクタ発動?
それともムーブ?



461 名前:デフォルトの名無しさん mailto:sage [2022/08/06(土) 14:34:58 ID:mmg0BHVy.net]
explicit指定してないならムーブだ

462 名前:デフォルトの名無しさん [2022/08/06(土) 15:11:57.86 ID:eSBCWCwI.net]
>>421
javascriptやelectronやphpやvb/vbaの方が判ってない人が描いてる確率は高い

463 名前:デフォルトの名無しさん [2022/08/06(土) 15:16:10.01 ID:eSBCWCwI.net]
>>449
最近覚えたのは Win+G ですね判ります

464 名前:デフォルトの名無しさん [2022/08/06(土) 15:17:59.77 ID:eSBCWCwI.net]
>>449-450
ああそれで
「押してみないと判らない」
って話が出て来たのか
普通の人間なら闇雲に押すんじゃなくて
押す前にマニュアルやヘルプファイル読むだろうな

465 名前:デフォルトの名無しさん [2022/08/06(土) 15:44:10.54 ID:xsmVc9Uv.net]
GUIでキー操作というのは矛盾も含んでいるんだけどな

466 名前:はちみつ餃子 mailto:sage [2022/08/06(土) 17:10:45.24 ID:Md6Uzv/o.net]
>>454
基本的にはムーブコンストラクタが呼ばれる場面なんだけど……。
一定の条件でコピーやムーブを省略 (Copy elision) してよい場合がある。
MyClass d = MyClass();
はその条件にあてはまるので
MyClass d();
と同じ挙動になることがある。 (コピーもムーブも起こらない。)

省略が許される場合の一部が C++17 以降では省略が必須に変更された。
また、 C++17 以降で省略が必須のときはコピーコンストラクタもムーブコンストラクタも存在しなくてよい。
故に以下↓のような例は C++14 ではエラーだが C++17 では通る。

struct MyClass {
MyClass(const MyClass &) = delete;
MyClass(void) = default;
};

int main(void){
MyClass d = MyClass();
}

467 名前:デフォルトの名無しさん mailto:sage [2022/08/06(土) 18:15:44.12 ID:Cf/I657k.net]
>>459
初代macか

468 名前:デフォルトの名無しさん mailto:sage [2022/08/07(日) 09:01:37 ID:5PDs1Uf6.net]
むかしまだMacOSが漢字TalkだったころにMacキチガイの知りあいが
「Windowsなんて駄目だよ、だいたいマウスにボタンが2つあるみたいなシンプルさを欠く設計な上に
なにかとキーボードを併用しないといけない、GUIとして未完成といわざるをえない(キリッ」とかいいながら
Macでマウスボタンとコマンドキーやらシフトキーのコンビネーションをものすごい熟練の手付きで操作していたのが印象的だった

469 名前:デフォルトの名無しさん [2022/08/10(水) 19:17:19.29 ID:0w2i6tTa.net]
windows10でスタートメニューを非表示にしたいのですが良い方法ないですかね?
スタートメニューのHandleを取れれば良いのですが、、。
ネットでいろいろ調べましたが見つけたサンプルコードは、windows10では動きませんでした。

470 名前:デフォルトの名無しさん mailto:sage [2022/08/10(水) 19:51:18.63 ID:kx7L/9BB.net]
何をしたいのかいまいちわからんけどシェル差し替えればいいんじゃね?
https://docs.microsoft.com/ja-jp/windows/configuration/kiosk-shelllauncher



471 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 00:32:53.82 ID:8ZZGyUVA.net]
以下のプログラムを実行したとき、変数xとyが初期化されるのはどういう理屈ですか?

class myClass
{
public:
int x;
int y;
};

int main()
{
myClass c{ 100, 200 };
}

暗黙のコンストラクタで代入されているのかと思いましたが、
xとyをprivateにするとコンパイルエラーになるので違うようです。
インスタンス生成の{}を()に変えるとコンパイルできなくなるのでそれもどうしてか知りたいです。

472 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 00:36:21.03 ID:sYNKGRSM.net]
struct myClass
{
int x;
int y;
};

int main()
{
struct myClass c = { 100, 200 };
}
と同じ理屈じゃね?

473 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 00:47:31.68 ID:sRpXvn0F.net]
publicだけならcの構造体と同じだからね

474 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 07:19:27.31 ID:MV37ziRv.net]
C言語からやってないと構造体の初期化は理解出来んだろうな

475 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 08:18:14.02 ID:l648IjCs.net]
trivial ctorじゃ説明つかないからなaggregateは

476 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 09:13:13.76 ID:7cUH/Z7I.net]
建増しでやってきた言語だからしょうがないけど初期化の方法がやたらいっぱいあって混乱する

477 名前:はちみつ餃子 mailto:sage [2022/08/11(木) 10:28:32.68 ID:5k4DsUHs.net]
>>465
集成体初期化 (Aggregate Initilization) に該当する。
クラスが一定の条件を満たしたときに集成体の扱いになる。
文法表記を似せているだけの別物と思った方がいいかも。

ちなみに C++20 からは丸括弧でも集成体初期化が出来るようになってるよ。

478 名前:デフォルトの名無しさん mailto:sage [2022/08/11(木) 16:39:22.98 ID:8ZZGyUVA.net]
>>466-467, >>471
ありがとうございます
C言語の構造体の初期化と同じですね
後方互換を保つために残してるような気がしました
コンストラクタ定義が無いときしか使えないんですね

479 名前:デフォルトの名無しさん [2022/08/15(月) 03:58:18.08 ID:NUjkjU1P.net]
皆さんにお聞きしたいんですけど
inline展開しまくることによる弊害って主になんでしょうか?

480 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 04:01:03.39 ID:93bmEmXu.net]
コードがでかくなる



481 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 04:48:08.80 ID:nv9KtGy3.net]
コンパイルが遅くなる

482 名前:デフォルトの名無しさん mailto:sage [2022/08/15(月) 06:06:45.25 ID:y6q1hWI/.net]
もうデメリットはなくなって来たな
実際のコンパイラもデフォでinlineぽい動きするし
ただの開いたサブルーチンというだけでなく定義の統合がありがたい

483 名前:デフォルトの名無しさん [2022/08/16(火) 10:58:28.11 ID:2x3mrzZQ.net]
デバッグが面倒臭くならない?
そうだあれか
リバエンし難くする効果があるとか

484 名前:デフォルトの名無しさん [2022/08/16(火) 11:14:28.05 ID:NN3FHXHG.net]
インライン展開するとスタックトレースで関数名が出なくなりますか?

485 名前:デフォルトの名無しさん [2022/08/16(火) 14:07:30.89 ID:GaLydNkX.net]
>>478
コンパイラにもよると思うけど
おそらく出なくなると思います!

486 名前:デフォルトの名無しさん [2022/08/16(火) 14:11:45.62 ID:GaLydNkX.net]
>>474-475-476-477
なるほど…

487 名前:デフォルトの名無しさん [2022/08/16(火) 14:16:34.26 ID:GaLydNkX.net]
c++ってまだまだ需要あると思いますか?
私はあるかなと思うんですけど...意見ください。

488 名前:はちみつ餃子 mailto:sage [2022/08/16(火) 14:22:21.76 ID:+o+ePBjP.net]
何年も前だがインライン展開の基準を指定する GCC のオプションで
めちゃクソに緩めの数値を指定 (つまりインライン展開されまくる) して
ベンチマークをとった記事が話題になったような覚えがある。

結論を覚えてないし、どこで見たのかも覚えていないので役に立たん話ですまぬ。

489 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 14:48:39.55 ID:oZyv9MO8.net]
>>481
C++は需要が減り衰退していく
昔はともかく現代の視点からは、設計が悪くそこへ建て増しを繰り返しているため、言語として劣っていて使いにくい
そのため次第に既存システムの保守がメインの言語となっていっているが、それさえGoogleの発表したCarbonのような言語の方がプログラマーにとってもありがたい
もちろんそのCarbonでさえそのFAQにこれはあくまでも既存の保守用の言語でと書かれている

490 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 14:52:39.64 ID:16oeTihW.net]
設計思想のないバカがさわるとえらいことになる言語だからな



491 名前:デフォルトの名無しさん [2022/08/16(火) 15:07:03.88 ID:2x3mrzZQ.net]
>設計が悪くそこへ建て増しを繰り返している

言語仕様がそうなっていることは認めるが
設計が悪い部分は無理して使わず良い部分だけ使えば良い話でもある

492 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 15:17:41.42 ID:yx28uGuU.net]
皆が皆そうしてくれないから自然に淘汰されていく訳だが

493 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 15:24:11.24 ID:n8xVLVvG.net]
>>481
需要で言えばCOBOLでさえ無くなっていないからなぁ。

c++の完全置き替えはRustがようやっとスタート地点に立てたくらい。でもRustは初心者お断りだから無理なんじゃない?

個人的にはRustを参考にした初心者向けのサブセットC++か、Rustの複雑さをマイルドにしたスタックフレーム指向の新言語が出てくると思う。

494 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 15:54:40.98 ID:BglBygNH.net]
msvcはインライン展開あんましてくれないな

495 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 15:57:43.55 ID:bqAknUU+.net]
>>487
誰が見てもC++よりRustの方が言語仕様も小さいしシンプルで洗練されていて学習しやすいよ
これは両方を使っている人なら必ず分かるから>>487は知らないものを妄想で語っている?
ちなみにRustはコンパイラによるアドバイスが非常に親切でプログラミング言語の中でもトップクラスな点でもC++との差異が大きいね

496 名前:はちみつ餃子 mailto:sage [2022/08/16(火) 16:21:45.34 ID:+o+ePBjP.net]
どうだろうなぁ。
C を学んでいる人が多かったというところから実務に使いながら少しづつ C++ に習熟していくという動線があったわけで、
C という前提が崩れたら Rust のほうが合理的に設計されていて楽かもしれないとは思う。
ただ、その一方で C++ が消えてなくなるほど劣勢になる気はしないんだよな。

497 名前:デフォルトの名無しさん [2022/08/16(火) 16:38:57.39 ID:GaLydNkX.net]
c++とかcやってからじゃないと到底無理
ってよく聞くんですけど
どういうことですかね?

498 名前:デフォルトの名無しさん [2022/08/16(火) 16:39:15.94 ID:uEezmwqj.net]
class b:a{};
class a{};
このコードはコンパイルできませんが、aを前方宣言せずにコンパイルを通す方法って

499 名前:りますかね? []
[ここ壊れてます]

500 名前:デフォルトの名無しさん [2022/08/16(火) 17:52:12.39 ID:2x3mrzZQ.net]
1.
class a;
class b:a{};
class a{};

2.
class a{};
class b:a{};



501 名前:はちみつ餃子 mailto:sage [2022/08/16(火) 17:53:02.94 ID:+o+ePBjP.net]
>>491
個々のルールを頭に詰め込むだけってのはしんどい。
思想に沿うように個々のルールが制定されているので思想が分かればある程度はルールの想像がつく。
低レイヤで何が起こるかある程度は認識していると思想が把握しやすい。

C++ の駄目な部分を見た後に Rust を見ると「こういうのが真っ当な仕組みだよな!」という納得もしやすいし。

ただ、 C++ の「汚くていいんだ」というのもそれはそれで優しい世界なので私は好きだよ。

502 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 19:22:32.37 ID:wpAgGEI5.net]
>>489
初心者からすればC++とRustの差なんて無いに等しい。コード1行書くのにいくつのルールを守る必要があるんだよ。
シンプルで洗練されている言語が初心者に良いというなら、RustよりFORTH(とその末裔)の方が初心者にふさわしいと思うわ。

503 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 21:48:30.73 ID:yMlIVT9V.net]
母国語みたいなもんなんでCの覇権は変わらない

504 名前:デフォルトの名無しさん mailto:sage [2022/08/16(火) 22:17:19.28 ID:bk3ffD66.net]
>>495
FORTHはCと同等の速さを出せないし問題のすり替えはみっともない
RustはCと同等の速さを出しつつ現代的なプログラミングしやすい様々なパラダイムを洗練してシンプルにまとめている
FORTHを入れてC/C++/Rustの四者で比較してもRustがプログラミング効率も良いと同意できるだろ

505 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 02:44:27.88 ID:C+o8slGL.net]
夏厨って夏に湧いて出る厨房の事を指す言葉だったはずだけど
その厨房も今じゃ中年おじさんなんだよな

506 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 04:51:00.22 ID:bVkA6pax.net]
>>497
Rustは初心者が学習しやすい言語ではないし問題のすり替えはみっともない

507 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 05:49:59.92 ID:jVY1lffe.net]
>>499
そうかな
C++(スマポ必須で所有権)よりはRustがシンプルではっきりと初心者向けだよ
自動解放で安全が前提でないと困るからその二つが比較対象で合っているよね

508 名前:デフォルトの名無しさん [2022/08/17(水) 07:00:37.46 ID:8QCiHT08.net]
皆さんのオブジェクト指向に対する考え方
おください!

509 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 08:26:24.61 ID:/AaT26gR.net]
>>500
C++との比較なんてしていない。よく読め。
C++が駄目なのと同じくらいRustも初心者の学習コストはダメ。
C++はまだ部分的に汚く使う柔軟性を持つから、better c くらいのところから段階的に使う余地はある。しかしRustはいきなり複数の概念(所有権とか参照とかmoveとか)を使わないとプログラムが書けない絶壁の学習コストをしているから、「とりあえず使う」という選択肢が無い。初心者の選ぶ言語にはならんよ。

510 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 08:34:18.80 ID:/AaT26gR.net]
>>501
オブジェクト指向のオブジェクトは主体/客体のサブジェクト/オブジェクト。
プログラマー(主体)が操作・命令する対象(客体)をまとめて整理する考え方&手法がオブジェクト指向。



511 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 08:40:13.74 ID:p6RiGGmW.net]
>>502
C++のスレで「C++と比較していない!」と言い出すそなたの頭のネジが飛んでるとしか

512 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 08:43:38.31 ID:T2QftTg0.net]
C++のスレでRustの話をする人の頭のネジは緩んではいないのか

513 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 08:50:31.11 ID:svOZgDad.net]
他の言語との類似や相違など色んな話題が出てもええんちゃう
特にRustはC++後継言語の一つでもあるし

514 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 08:54:01.88 ID:tNGd1WjN.net]
勝手に決めんな

515 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 09:18:05.65 ID:3A+P/0wQ.net]
GAFAMがRustをC++の後継言語の1つとして位置付けてRust Foundationを共同で設立したりしてますもんね
ただしGoogleは既存コードのメンテ用としてはCarbonもC++の後継言語の1つとして実験していますね
Rustはシステム更新時や分離できる新たな部分に対してC++の後継言語となるのでしょう

516 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 09:43:49.92 ID:G5jxF3Mu.net]
>>504
C++関連としては>>487
あとは「Rustは初心者向けじゃないからC++後継できるところまでは行かん」という主張に対する話。C++だって学習障壁から初心者取り込みできずにユーザー規模が縮小しつつあるのに、もっと絶壁のRustが普及するとは思えん。
C++後継としてはRust以外の初心者に配慮した言語が来るんじゃない?

517 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 10:06:28.08 ID:JpVQLN3v.net]
スマポすなわち所有権を使ってるC++プログラマーならRustは簡単で楽勝
まともな案件ならばスマポ使っているし、急にではないけど、より安全なRustへ徐々に少しずつ移っていくんだと思うよ

518 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 10:18:24.59 ID:T2QftTg0.net]
>>506
それなら類似や相違など語り合うスレのほうがいいのでは?
無いなら立てれば良いし
C++の相談に来ているスレで今はRustだよなんて言われてもね

519 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 10:27:35.49 ID:tNGd1WjN.net]
学習障壁でユーザー規模が縮小って
なんかCOBOL臭えな

アホフィルタを外すより待遇を改善すべきだろ
マ板でやるべき内容だな

520 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 10:30:15.50 ID:VIybtmpa.net]
rustはアホでも書ける言語ではないよな
良いか悪いかはさておき



521 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 10:41:14.61 ID:tNGd1WjN.net]
は? 「C++が使える」アホは俺でも知ってるが
それがこの話と何か関係あるのか?

522 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 10:45:01.06 ID:ysQxp/zr.net]
お前が知ってるかどうかなんか知るかよ
荒らしたいだけなら少し黙ってろ

523 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 11:20:40.84 ID:ijLXutEl.net]
きみらはなぜ些細なことですぐ喧嘩するのか・・・

524 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 12:01:52.68 ID:75soL8XV.net]
>>509
Rust++ですね判ります

525 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 12:03:04.79 ID:tNGd1WjN.net]
都合が悪くなると荒らしたいだけとか全く
C++相談室でRustを連呼するやつに言われたかねえな

526 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 12:06:02.53 ID:tNGd1WjN.net]
相談者はチームで突然、Rustに変えようと言い出せば
解決につながるとでも言うのか
そんな力のあるやつが相談に来るとでも?

527 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 12:31:04.58 ID:GcPebzMx.net]
シンプルで現代的なZig言語、RustやC++が複雑すぎると嘆く人の福音となるか
https://news.mynavi.jp/techplus/article/programinglanguageoftheworld-44/

528 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 12:50:49.80 ID:hpgzuSC5.net]
手動メモリ管理のZigでは無理だよ
手動メモリ管理で複雑化したときにどうしても発生している穴を防ぐことがどのIT企業でも課題となっている

529 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 13:33:15.30 ID:GcPebzMx.net]
自動にしてもjavaみたいにメモリバカ食いしてるのも大概だけどな

530 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 13:46:04.27 ID:0xu2lUBy.net]
shared_ptrやunique_ptrで特に問題ないと思うが?
手動メモリ管理ってパフォーマンスでも気にしてるの?



531 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 14:31:54.15 ID:VIybtmpa.net]
shared_ptrはほんとに良いものなのかちょっと疑問だわ

532 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 15:14:20.93 ID:ka8BV2dl.net]
>>522
それはJavaがGC言語だからしょうがない
非GC言語でプログラマーによるコードに依存せず自動メモリ解放して欲しいならば現状Rustしかない

533 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 15:36:27.49 ID:0xu2lUBy.net]
shared_ptrやunique_ptrで何か問題があるかな?

534 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 15:37:16.76 ID:DQ38VMyq.net]
いらんわ
まさかそんなくだらん話だったとは
買い被らせやがって

535 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 15:53:30.62 ID:RcTU5KfW.net]
>>523
正確にはスタックフレームに積む or スマートポインタを使ってヒープに置く、だな。

shared ptrは関数呼び出し時の値渡しのインクリメントデクリメントコストが気になるところ。
スタックフレームに存在するかどうかで参照渡しか値渡しかを自動で切り替えると便利そうだけど、最適化で上手く処理してくれたっけ?

536 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 15:54:04.11 ID:aLEYi9j0.net]
>>526
使い忘れと使い方ミスを常に完全にゼロにできるならばunique_ptrとshared_ptrでOK
しかし複雑化した時にミスを常にゼロにすることは不可能だと判明している

一方でC++からRustにすると以下のようなメリットが山のようにある
・Rustでは使い忘れや使い方ミスをするとコンパイラが必ず指摘してエラーとしてくれる
・Rustでは何も指定しない標準状態でC++のunique_ptrより高機能であるため記述がスッキリそして分かりやすい
・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるがRustではそのコストを必要としない
などなど

537 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 16:16:02.25 ID:DQ38VMyq.net]
殺虫剤のパラドックスてやつ

538 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 16:31:22.99 ID:1pPRcFoT.net]
こんなとこで Rustの宣伝されてもな・・・

539 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 17:56:04.99 ID:IlAVLAST.net]
この手の議論って「全てのプログラマがポインタを直に操作する必要に迫られている」という詭弁に基いていて辟易するんだよな

540 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 18:05:51.06 ID:T2QftTg0.net]
RustなんかやめてDelphiにしようぜ



541 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 18:34:02.81 ID:vS4IR+zA.net]
最近ポインタ使わんよね

542 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 18:40:18.95 ID:JVW7ncQZ.net]
>>532
ある程度の大きなデータは抽象的な意味でcall by reference (pointer) により受け渡しすることになり実装的にはポインタを使わざるをえない気もする

543 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 19:39:41.85 ID:/AaT26gR.net]
>>529
Rustの変数をunique ptrと比較している時点でRustの利点を理解出来ていない。
Rustの変数に対応するのはあくまで自動変数で、unique ptr に対応するのはBox<T>。

Rustは「高速化と自動化のためにできるだけスタックフレームを活用する」という基本的な考え方があって、そのためにあの窮屈なルールで自動変数を高機能化している。
Rustの変数がデフォルトムーブだからといって、Rustの変数はunique ptr みたいなものとするのは理解の足りない粗忽者のやることだわ。

544 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 19:59:51.79 ID:07u67rxx.net]
>>536
ある意味それも正しいが現実問題じゃないな
例えばi32を10個返す関数を作るとして
その型を[i32; 10]、Box<[i32; 10]>、Vec<i32>のそれぞれにした場合に生成コードはどうなりどれを選ぶべきか考えるとBoxの意義がなああ
結局Rustではもっと最適なものを選ぶからunique_ptr相当すら使うことがレアだよな

545 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 20:32:26.88 ID:k/cupzFM.net]
>>491
C++ちょっと分かったなーって気持ちになれるまでの遠い道のりを考えると、Cができるなんて入口にすら立ってない感じ。
だからC知ってたくらいではアドバンテージないよ。個人の感想です。

546 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 21:07:14.75 ID:0xu2lUBy.net]
>>529
>・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるが
>Rustではそのコストを必要としない
本当にコストは必要ないのかな?
本当に参照カウントしないのかな?

547 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 21:11:48.18 ID:0xu2lUBy.net]
>>536
unique_ptrはmemory allocationとは全く関係ありません

548 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 21:31:24.12 ID:3OxXdiqc.net]
unique_ptrなんて自動変数と変わらんじゃろ

549 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 21:37:14.43 ID:IDhwUS5q.net]
>>539
Rustは借用(とライフタイム)があるから、
複数の参照が同時に必要となっても、
所有者は一人のまま何も変わらず、
複数の借用を普通に使うだけで済んでしまい、
付加コストの発生は無し。

一方でC++は、
複数の参照が同時に必要となる場合、
unique_ptrではもちろんダメなので、
shared_ptrを使わざるを得ず、
参照カウンタ増減という付加コストが発生。

550 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 21:39:05.15 ID:bVkA6pax.net]
>>540
デフォルトはヒープを想定しているだろ。
Rustの変数はデフォルトスタックを想定している。



551 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 21:40:11.05 ID:GcPebzMx.net]
そんなん設計でどうにでもなる
ありきたりの道具使ってばっかいるからアタマが退化してんだろ

552 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 21:41:54.05 ID:GcPebzMx.net]
>shared_ptrを使わざるを得ず
おまえがそう決め付けているだけで、ここら辺は設計でどうにでもなる

553 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 21:46:20.33 ID:IDhwUS5q.net]
>>545
unique_ptrはコピーできないから複数の参照を用意できない
shared_ptrを使うことになる

554 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 21:51:11.86 ID:eXFNTowk.net]
同じクラスが重複して定義されたとき、
そのクラスに変数が定義されていてもコンパイルエラーにならないのはなぜですか?
関数が定義されている場合、インライン展開されないとコンパイルエラーになると思います
変数にはそのような指定が無いと思いますが、なぜエラーにならないのでしょうか?

555 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 22:07:13.27 ID:vZEBwtyc.net]
言っている意味がちょっとわからないので最小のコードを提示してもらえるとありがたい

556 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 22:09:46.76 ID:wEP2ktHW.net]
単純に、同じクラスを(同じ定義で)二回定義してもエラーにならんの
便利なようで不思議だよな

557 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 22:10:56.50 ID:6ShnCCAk.net]
>>542 「複数の参照」が借用で済むようなものなら C++ でも T& でコスト要らなくね?

558 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 22:12:24.01 ID:vZEBwtyc.net]
大抵インクルードガードで1回しか通らないようにしてたけど
(クラス定義だけなら)インクルードガードなしで二重に読んでも通るってことなのか… それはしらんかった

559 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 22:14:06.17 ID:MGAgUcBD.net]
スレタイ読めや
だからRust信者は嫌なんだよ

560 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 22:17:02.42 ID:IDhwUS5q.net]
>>550
それはダングリングポインタになりうるからダメ
C++には借用とライフタイムの概念がないため先に解放されてしまう事態を避けられない



561 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 22:35:58.47 ID:eXFNTowk.net]
以下のコードをヘッダに記述して複数のソースでインクルードすると、
関数fooは重複定義でコンパイルエラーになります
inline指定にすると、コンパイルは通るようになります

class myClass {
public:
void foo();
int i;
};

void myClass::foo() {
std::cout << "OK";
}

このとき変数iは何故重複定義にならないのでしょうか?
fooと同様に複数のソースで重複定義になる気がするのですが

562 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 23:24:22.15 ID:0xu2lUBy.net]
>>542
コンパイル時に参照数が決まらない場合は参照カウントしてるやろ?
コンパイル時に決まるよう状況ならC++でもT&で十分

563 名前:はちみつ餃子 mailto:sage [2022/08/17(水) 23:28:24.67 ID:ito9w61P.net]
>>554
int i; はメンバ宣言に該当するがそれ自体は定義ではない。
クラス定義の中にメンバ宣言があるってのがようわからん理屈だがその時点では実体が作られない、
逆に言えばその型のオブジェクトを生成するときになって初めて実体が作られるので
この段階では重複として排除する必要がない。

564 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 23:31:25.13 ID:6ShnCCAk.net]
>>553
参照を渡した先でどこかに参照を格納・保持して後で使う必要があるなら shared_ptr で
渡すのがいい状況になりそうだけど、その場合は Rust でも借用では済まないのでは?

565 名前:デフォルトの名無しさん mailto:sage [2022/08/17(水) 23:51:08.75 ID:eXFNTowk.net]
>>556
ありがとうございます
グローバルスコープに定義するときは、
int i;
この記述で定義になるので、複数のソースでインクルードすると当然重複定義になります
クラス内では宣言のみになるとは思いませんでした
そういうものと覚えるしかなさそうですね

566 名前:はちみつ餃子 mailto:sage [2022/08/18(木) 00:07:40.00 ID:KKIhvA0h.net]
>>553
C++ にもライフタイムの概念はあるよ。
コンパイラが検査してくれないってだけ。
ダングリング参照を作ってはいけないというルールは C++ でも Rust でも同じ。

567 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 02:53:41.59 ID:TJJ2kcCc.net]
>>555
スマポを使っている限りは安全だと客観的にも保証されるけど
そこでT&を使ったら自己責任の世界に戻ってしまい意味なしとなってしまう

568 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 04:29:06.72 ID:HNqVdbFt.net]
>>559
決定的な違い
Rustではダングリング参照するプログラムを絶対に作れない(コンパイラがエラーとする)
C++ではダングリング参照するプログラムがうっかり容易く生じてしまう(そしてコンパイラが通してしまう)

569 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 04:53:19.13 ID:X/mZUHYK.net]
>>561
話変わってるだろ
検査してくれるかどうかじゃなくて
> ・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるがRustではそのコストを必要としない
の話だったと思うが?

570 名前:デフォルトの名無しさん [2022/08/18(木) 05:23:06.33 ID:l0miaXwd.net]
>>562
それはC++で安全を保証しようとすると
複数の参照を用いるならば常にshared_ptrの使用を必須とするしか安全を保証できないのに対して
Rustは複数の参照だけなら借用のみで安全を保証できるという話ではないか

ちなみにRustでは複数の参照ではなくもっとレアケースである複数の所有が生じた時に初めてコンパイラがRcを要求する
つまりRustでは参照と所有が明白に分離されているところが大きな違いとなる



571 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 05:36:06.77 ID:X/mZUHYK.net]
>>563
安全の保証をコンパイラがやるのかプログラマーがやるのかの違いなんて議論してないよ

572 名前:デフォルトの名無しさん [[ここ壊れてます] .net]
C++11以降のマナーでは、ダングリングは発生しない。
設計を見直すべきでは?

旧い規格、例えばDOMを実装する場合、設計を見直すことはできない。
ところで、DOMについて、C++によるGoogle Chromeの実装は素晴らしい洞察で問題を回避している。
後学のために読んでみるとよい。

573 名前:デフォルトの名無しさん [[ここ壊れてます] .net]
如何にして安全なスパゲッティ・コードを書くかというのがRustのアプローチなら。
C++の方法論は、「安全なスパゲッティなど存在しない、素麺にしましょう」ということ。
旧式のスパゲッティ・コードを書きたい人にとってC++は役に立たない。

574 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 08:09:28.79 ID:ywzuYu7m.net]
まぁ、c++でももっと積極的にスタックフレームに限定するアプローチは欲しいよね。

以前にインスタンスがスタックフレームに存在することを保証するスマート変数を作ろうとしたけど、インスタンス変数をどうしても制限できなくて挫折したことがある。
スマートポインタが必ずスタックにあるのなら、スマートポインタの参照渡しとかもっと活用できるのにね。

575 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 09:11:59.95 ID:msbrE3Yp.net]
スタックかどうかなんてどうでもよくねえ?
機能の問題でしょ?

576 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 09:19:43.25 ID:X/mZUHYK.net]
>>567
> 以前にインスタンスがスタックフレームに存在することを保証するスマート変数
それなんの意味があるんだ?
てかC++ならスタック上にインスタンス生成すればよくね?

577 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 09:41:11.96 ID:zre7odKU.net]
自動変数が嫌いな人一定数いるよね

578 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [[ここ壊れてます] .net]
大抵の環境でデフォルトのスタックサイズはそれほど大きくない。
数メガバイトというのは現代的な感覚では極端に小さいようにも見える。

でもまあだいたいこれで足りるし、足りるように書くのが普通なんじゃないの。

579 名前:デフォルトの名無しさん [2022/08/18(木) 11:28:19.94 ID:p/limWqp.net]
C > Nim > C++ > Rust

580 名前:デフォルトの名無しさん [2022/08/18(木) 11:29:37.71 ID:p/limWqp.net]
>>569
GC要らなくなる



581 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 11:47:13.53 ID:u9P7LJR3.net]
>>571
スタックオーバーフローしたら Linux/Unix は自動拡張しなかったっけ?
Windows はなぜか(オプションで可変出来るけどスレッド起動後は)固定なんだよね

582 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 11:47:44.39 ID:u9P7LJR3.net]
>>573
そりゃ全部スタック上で済むならね...

583 名前:はちみつ餃子 mailto:sage [2022/08/18(木) 12:03:37.12 ID:KKIhvA0h.net]
>>574
割り当てが足りなくなれば拡張するが、その上限の設定がデフォルトでは 8MB になっている。

584 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 12:29:58.75 ID:ywzuYu7m.net]
>>569
単にスタックフレームの入れ子のライフタイムを活用したいだけだな。

585 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 12:35:06.23 ID:R9m+Nq0X.net]
ポインタたくさん使う人っておじさんですよね?
実年齢か精神年齢かはともかく

586 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 12:37:54.86 ID:ywzuYu7m.net]
>>577
ちょっと補足。
スマートポインタがスタックにあるのなら、shared ptr の参照とかポインタみたいなヤバイのもそこそこ安全に扱える。余計なインクリメントデクリメントも発生しなくて良くなるし。

587 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 12:41:39.14 ID:cnxBrL/o.net]
なんでスタックである必要があるのかまったくわからん

588 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 13:27:16.43 ID:C4YsUD/k.net]
>>578
おまえさん、いくつなんだ?
工房や厨房までがおじさんに見えるなんて

589 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 13:29:45.98 ID:KxsikMs2.net]
>>563
つまりコンパイル時に参照数が決まらない場合はRustも参照カウントする

>>529
>・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるが
> Rustではそのコストを必要としない
従ってこれは間違っている

590 名前:デフォルトの名無しさん [2022/08/18(木) 13:34:11.90 ID:AgenDKWc.net]
>>579
一見その通りだけど
関数で参照を返したい時に、その実体が呼び出し元(かそれ以前)のスタックフレーム上なのか、
それとも消え去る現在のスタック上なのか、安全を保証するために区別する情報が必要となる

そのためにはライフタイムをもっと明確化すればよく、参照が指す実体がスタック上でより深く(か同じ)ことを保証できればよい

すると更に大きな利点が生じる
実体がスタック上に無くてヒープ上に有っても、それを管理するスマポ相当がスタック上にあればライフタイムは同じとなるからだ
結局、スタック上かヒープ上かよりも、ライフタイムを明確化することが重要であると分かる

以上を言語仕様に組み込んだのがRust



591 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 13:54:28.67 ID:cnxBrL/o.net]
>>583
c++も割と明確では
使いやすさはさておき

592 名前:はちみつ餃子 mailto:sage [2022/08/18(木) 14:09:16.33 ID:KKIhvA0h.net]
私もそう思う。 C++ でも明確で、解釈の余地はほぼない。
その上で知ってても人は間違うというところは問題で、チェックを自動化できるように整理したという Rust の功績は大きくはある。
ルール自体の差は C++ と Rust でそれほど大きくはない。

593 名前:デフォルトの名無しさん [2022/08/18(木) 14:18:54.74 ID:PTM9RcdX.net]
C++のライフタイムはプログラマーにとっては明確でもコンパイラにとっては明確でない
そのためC++では参照の安全性をコンパイラが保証することができない
そして複雑化した時に人間(プログラマー)はミスを無くすことが出来ない
そのためC++で書かれた多くのソフトウェアで常に穴が発生し続けている

594 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 15:34:56.12 ID:KxsikMs2.net]
unique_ptrやshared_ptrを使えば良いだけではないかな?

595 名前:はちみつ餃子 mailto:sage [2022/08/18(木) 16:15:40.31 ID:KKIhvA0h.net]
>>587
C++ のスマートポインタはやっぱり後付け感はある。
Teratail とかの質問サイトを見てたら (コンパイル時にエラーに出来ない形で) 使い方を間違ってセグフォしてたりするのはちょくちょく有る。
コンパイラがガッツリと検査してくれる Rust はありがたいよ。

596 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 16:20:56.69 ID:885GVGvO.net]
無能な働き者の軌道修正には良いかもな

597 名前:デフォルトの名無しさん [2022/08/18(木) 16:27:29.27 ID:9oKj6z2J.net]
桐蔭トリプルプレーだよ

598 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 16:37:31.46 ID:AkD9iM7C.net]
たまにはweak_ptrのことも思い出して下さい

599 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
>>587
unique_ptrやshared_ptrの使い忘れや使い方ミスなどをしてもコンパイラはエラーとすることができないためC++は安全性を保証できない
他にもget()して得たポインタを関数などに渡した後にそのライフタイムを逸脱しないかなどの保証もできない
全ては人間頼みとなるため多数の穴が生じてきた

600 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 19:33:28.16 ID:74ku3J2B.net]
性能厨としては何でもスタックフレームに置いて集積度を高くしたいところ。レジスタの効率とかキャッシュヒット率とか変わるだろうし。

Rustのスタックへのこだわりはいいんだけど、無駄に抽象化しているから余計に複雑になっている感じを受ける。



601 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 21:49:54.60 ID:SUTQRi3H.net]
C++のスマポは言語機能じゃないから書き方長くてだるいし
外部ライブラリは当然ナマポ使ってるから結局その辺でセグフォの危険を排除できないし
オウムみたいにスマポでいいじゃん連呼してるやつは本当に使ったことあんのか?

602 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 21:58:35.30 ID:KxsikMs2.net]
>>592
使えば?と私は提案してるので「使い忘れ」は論外として
「使い方ミス」はどんなミスでしょうか?
ミスのしようがないほど単純だと思います

Rustのコンパイル時にチェックしようという設計は
もちろん良いと思いますよ

603 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:02:08.08 ID:KxsikMs2.net]
>>594
ええ
私は最近はメモリ管理で全く失敗ないですね
デバッガの出番がないです

604 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:07:53.92 ID:0oaFEclW.net]
スマポにハンドルを突っ込む方法はないですかねえ‥‥

605 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:12:02.34 ID:3gZlWdNz.net]
>>596
君のような勘違い自信過剰な人がうっかりミスを起こして問題を引き起こしてきた
チェックを人間に依存している限りミスは必ず発生する

ソース記事
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/
グーグルによればAndroidに存在した深刻なセキュリティー脆弱性の70%近くがメモリー安全に関するバグに起因するという。
同様にマイクロソフトも、同社製品に存在したセキュリティー脆弱性の70%がメモリー安全に関するバグに起因すると述べている。
C/C++を使う限りセキュリティー脆弱性を根絶するのは不可能と

606 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:16:42.90 ID:SUTQRi3H.net]
使われないシステムってバグ出ないんだよね

607 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:17:29.31 ID:KxsikMs2.net]
>>598
> >>596
> 君のような勘違い自信過剰な人がうっかりミスを起こして問題を引き起こしてきた
私は最近はメモリ管理で全く失敗がないので私とは違うな

608 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:21:49.94 ID:KxsikMs2.net]
>>598
$ wget 'https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.19.1.tar.xz'
$ tar xJf linux-5.19.1.tar.xz
$ find linux-5.19.1 -name *.rs | wc -l
0
2021年4月30日の記事だけどまだコミットがないようだが?
Rustのsuffixってひょっとしてrsじゃない?

609 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:29:53.88 ID:6c/4Q98o.net]
>>600
それは貴方がアホだからミスに気付いていない可能性、使われないからバグが未発見なだけの可能性、単純なことしかしていないだけの可能性、…
複雑化すると、どんなにベテランでも、多数の人々がコードをチェックしていても、メモリ管理ミスが現実に起きている現実を受け入れましょ []
[ここ壊れてます]



611 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:43:58.49 ID:KxsikMs2.net]
>>602
俺が>>600で述べたのは俺のことのみだよ

612 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 22:54:56.26 ID:MfNSDyn2.net]
誰もお前なんかに興味無い訳だが

613 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 23:09:02.07 ID:KxsikMs2.net]
>>604
ごめんごめん
>>598がいちいち私を引き合いに出してきたので否定したまでだよ
>>598の書き込みも冒頭の「君のような」を書かなければ
良いのに何でいちいち書くのかね?

614 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 23:31:07.48 ID:RTRtwr2z.net]
どんな複雑なケースでも一度もミスをしたことがない!今後も絶対にミスをしない!
と言ってる人を信頼できるわけがない

615 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 23:38:25.32 ID:KxsikMs2.net]
>>606
>一度もミスをしたことがない!今後も絶対にミスをしない!
そんなことは一言もいっとらんがなw

616 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 23:42:25.87 ID:KxsikMs2.net]
本当にunique_ptrやshared_ptrでミスするかい?
信じられないほど単純なクラスだと思うけど
>>592の「使い方ミス」って何なの?

getで中身取り出して云々は割とあり得るんだろーけど
それはunique_ptrやshared_ptrの外の出来事だし

617 名前:デフォルトの名無しさん mailto:sage [2022/08/18(木) 23:58:49.20 ID:B1ZNmtqG.net]
もちろんgetを使った時点でスマポ管轄外となり保証が全く無くなるが
スマポ自体における使い忘れや使い間違いなども色々とあるぜ
例えば

C++11スマートポインタで避けるべき過ち Top10
https://postd.cc/top-10-dumb-mistakes-avoid-c-11-smart-pointers/

618 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 00:27:49.36 ID:SM6rQCcv.net]
>>609
有難う!読んでみたよ!過ちを列挙すると以下の通り
>過ちその1: uniqueptrで十分なところにsharedptrを使う
>過ちその2: shared_ptrで共有されたリソース/オブジェクトをスレッドセーフにしない
>過ちその3: 自動ポインタ(auto_ptr)を使う
>過ちその4: sharedptrの初期化にmakesharedを使わない
>過ちその5: オブジェクト(生ポインタ)を作成してすぐにshared_ptrに割り当てない
>過ちその6: shared_ptrで使用されている生ポインタを削除してしまう
>過ちその7: ポインタの配列にshared_ptrを使用する際にカスタムデリータを使用しない
>過ちその8: 共有ポインタを使用する時に循環参照を回避しない
>過ちその9: unique_ptr.release()で返された生ポインタを削除しない
>過ちその10: weak_ptr.lock()を呼び出す際に、有効か否かを確認しない

俺については4はmake_sharedを知らなかった時期にはやってたけど知ってからはないね
3はunique_ptrがstdに入って全部リプレースした
あとは過去にも犯さず使用しできてるよ
みんなはどうだい?

619 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 00:34:39.73 ID:aSCRajpd.net]
getを使ってしまったらthe endなわけだけど
getの使用を皆無で頑張ってるん?

620 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 00:47:36.81 ID:SM6rQCcv.net]
>>611
外部ライブラリの関数呼ぶのにget使うけど
意味するところを理解しているので
慎重になるから失敗した覚えはないなぁ

当たり前だけど自分の書く関数の引数に生ポインタを使うことはない



621 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 01:36:44.63 ID:Iq0pX04r.net]
>>612
ところで複数の関数呼び出しそれぞれに参照を渡したい時はどうしてる?
生ポインタ使わないからshared_ptr?

622 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 01:38:01.85 ID:M+KL048w.net]
なんでポインタ使うんですか?

623 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 02:09:43.59 ID:SM6rQCcv.net]
>>613
その書いている「参照」ってのはC++の参照ではないですよね?

関数にT型のオブジェクトを引数として渡すとき
関数がシーケンシャルに実行されるなら原則としてT &で渡す
中身が無効値である可能性があるならunique_ptr <T> &で渡す
関数が並行に実行されるならshared_ptr <T>を渡す

624 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 03:25:13.02 ID:oQfRblXd.net]
T&渡した時にそれが他へ転用され保持されて生き残り続ける可能性を考慮しないの?

625 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 05:39:15.80 ID:HCuI/gXC.net]
静的試験を絶対視するなーんにも分かっとらんやつが推すほどイメージが悪くなるな

626 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 07:27:50.77 ID:QMISJLeV.net]
>>616
だからポインタ使うの?
まあ寿命の長いオブジェクトを駆使しないほうがかっこいいのでは

627 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 08:01:50.73 ID:slQGFe9J.net]
>>617
動的チェックは不便だし重くて遅いよ
できる限り何でも静的にするのがベター

628 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 08:25:03.05 ID:SM6rQCcv.net]
>>616
は? 詳しく

629 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 08:45:24.08 ID:xzucV8hS.net]
>>597
constructor destructor関数オブジェクトを用意すれば良かったんじゃなかったっけ?smart ptrの典型的な応用例だから、調べりゃすぐ出てくるよ。

630 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 08:56:07.71 ID:HCuI/gXC.net]
>>619
ふーんチェックなのかpgr



631 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 10:22:48.97 ID:51hioa9S.net]
>>617
俺も以前はそう思っていたんだけど
わずかな補助情報を人間が与えるだけで
Rustコンパイラが静的試験してくれて
人間にとって面倒かつ慎重さを必要とする作業から解放してくれるのを知って考えが変わった

例えて言うなら
動的型付け言語を使っていたところを
わずかな型情報を人間が与えるだけで
静的型付け言語のコンパイラが静的試験をしてくれるようになったのと似てる

632 名前:はちみつ餃子 mailto:sage [2022/08/19(金) 11:08:02.29 ID:FT/EuRcZ.net]
昔とはソフトウェアの規模感が違う。
そしてプログラミングするのがプログラミングの専門化とは限らない領域が増えた。
(いわゆるエンドユーザー・コンピューティング)

職業的なプログラマにしてもプログラミングの専門化というよりは
別分野のそれぞれの専門化が道具としてのプログラムを作るというような場合も多い。
プログラミングのルールや作法を行きわたらせることは出来ないよ。
検査を強くするのは時代的な背景としても自然に思える。

動的な検査でも静的な検査でもいいが、
C/C++ は検査せずに未定義に突入するのがあまりにも簡単すぎる。

633 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 11:09:58.15 ID:HCuI/gXC.net]
>>623
ナマポひとつロクに扱いきれないスキルと
動的チェックなんて恥ずかしげもなく言っちゃう
バカ用言語があんたにとって有難いのは分かったよ

ここはC++相談室
C++という土俵に立っている者の場だ
落ちこぼれて逃げ出したやつの遠吠えは
誰も聞きたがってない
どっか行け、邪魔なんだよ

634 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 11:17:41.46 ID:HCuI/gXC.net]
自分のミスを道具のせいにするやつ
そういえば法案のミスをワープロのせいにするバカ役人がいたな

こういう手合いは一事が万事

635 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 11:44:22.83 ID:SM6rQCcv.net]
>>616が何を言いたいのか今もって分からない
悩む

636 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 11:53:43.76 ID:SM6rQCcv.net]
一般用語の参照を使ってると思われるあたり
この人(>>613)はC++の参照を知らないレベルだと思うんだよね
C++に関してはほぼ知識がないまま
受け売りでRustが生ポインタを廃止?した利点を主張している
(私もRustのコードは書いたことがないんだけども)
この人は何がしたいんだろうか?

637 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 11:59:22.84 ID:6kbXcgP9.net]
OSのAPIなりその他雑多なライブラリなりでポインタ要るからなあ・・・

638 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 12:19:36.97 ID:HCuI/gXC.net]
動的型付け・・・あー、もしかして動的型宣言のことかな?
だとすると具体的に何言語のことを言ってるんだろう?
Bにはそんなもんないし・・・

639 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 12:44:26.95 ID:BT0K6AVq.net]
昔構造体を値で渡したらポインタにしろっておっさんに怒られたっけ
速度を気にしないんだったらコピーでええのに糞めんどくさかったわ

640 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 12:47:51.92 ID:zzLlPl0v.net]
馬鹿が二人ほど恥を晒しております



641 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 12:51:04.37 ID:FysKbdqv.net]
>>630
動的型付けを知らないとは素人かね?
動的型宣言という言葉は存在しないぞ

642 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 13:06:02.28 ID:HCuI/gXC.net]
>>633
それwikipediaソースだろpgr
で、あんたdynamic type declarationのことを言ってたの?
それとも他の何かか? Bにあったものか?

643 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 13:47:12.04 ID:FysKbdqv.net]
>>634
あまりにも無知すぎて話にならないな
wikipediaでも何でもいいから勉強して出直して来い
動的な型と動的型付けの区別は最低限つけろ
静的型付け言語の中には動的な型と呼ぶものもあるが
静的型付けと動的型付けは基本的に排反の関係だ

644 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
>>616が何を言いたいのか今もって分からない
悩む

645 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 14:06:18.12 ID:zzLlPl0v.net]
その一文がわからないようなレベルの奴がメモリ管理で全く失敗ないとか言ってんだもん
みんな呆れてんだよ

646 名前:デフォルトの名無しさん [2022/08/19(金) 14:08:38.12 ID:SM6rQCcv.net]
>>637
本当に質問の意味が分からんから説明してよ
意味が分かったら返答するからさ

647 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 14:09:02.63 ID:HCuI/gXC.net]
>>635
俺は動的な型と動的型宣言を混同していることを露呈するような失言はしてないぞ
していると言うなら具体的にどこなのかを示せ
誤魔化しても構わんがそれも返事と取るからな

648 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 14:28:41.00 ID:SM6rQCcv.net]
>>628にも書いたけどC++相談室で一般用語の「参照」は
C++の参照と混同するので普通は避けるんだよね
C++で書いた経験が皆無なんだなと俺は判断している
それで>>616のような意味を計りかねる質問をしてしまう

649 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 14:40:23.82 ID:FysKbdqv.net]
>>639
そこまで恥を再び晒したいなら示す

>>630
> 動的型付け・・・あー、もしかして動的型宣言のことかな?

まず動的型宣言という用語は存在しない
"動的型付け" はググると7万件あり
"動的型宣言" はググると3件である

一般的に動的な型の宣言の話と広く解釈したとしても
動的な型の宣言と動的型付けは異なり互いに包含関係などもない
動的な型の宣言は静的型付け言語においても持つものがある
そして動的型付けは静的型付けの逆であり相反する

650 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 16:45:49.60 ID:SM6rQCcv.net]
>>637
説明が難しいなら簡単なコードでも良いよ
何を懸念しているのかそれで推察できると思うから



651 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
栄光在天
聖恩心から感謝申し上げます。
日ごろは激しい摂理の中、プログラム業ごくろうさまです。
さて、C++のコピーコンストラクタおよび代入演算子オーバーロードの質問でございますが、メンバ変数全てを関数定義内部で書き出すととてつもない量になってしまいます。

class Hoge
{
Hoge& Operator =(const Hoge&r);
int hage=0;
char sage=0;
std::unique-ptr<Hagehage> pHagehage;
etc…
Etc…
Eat…
};
Hoge& Hoge::operator=(const Hoge&r)
{
hage=r.hage;
sage=r.sage;
pHagehage=std::make-unique<Hagehage>(r);
Etc etc……
}
メンバにユニークポインタがあるので書き出さないとダメな感じになっちゃうのですが……量がががが(>_<)
これらにおいて、何か楽になるような裏技はありますか?
それとも一つづつ足していかなければならないのでしょうか?
もしかしたらコンパイラやIEDの部門で行うべき変な質問かなとも思いますが……何かやり方やティップがありましたら教えていただければ……
相対的に有田退治にもなります!

652 名前:はちみつ餃子 mailto:sage [2022/08/19(金) 17:19:48.26 ID:FT/EuRcZ.net]
>>643
メンバを

Hoge& Operator=(const Hoge&r)=default;

というように宣言すればデフォルトの定義が実装される。
全てのメンバに対して代入演算子を適用したのと同じことになる。
(もちろん全てのメンバを代入するという挙動で駄目な場合は自分で書くしかしょうがない。)

653 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 17:31:34.37 ID:HCuI/gXC.net]
>>641
そのレスには動的な型についての言及がないな
誤魔化したいわけね、返事ありがとう

動的型宣言という言葉は存在しないと言いながら
動的型付けとは【意味が違う】とはどういうことだ?
存在しないものは比較できないはずだぞ
operator<=>でSFINAEだなpgr

654 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 17:35:12.15 ID:HCuI/gXC.net]
>>624-629には沈黙か
大草原

655 名前:はちみつ餃子 mailto:sage [2022/08/19(金) 17:39:10.42 ID:FT/EuRcZ.net]
>>643
そもそも代入演算子は特に指定しなくても定義されるはずだな。
(ただし基底とメンバの全てが代入可能であるとき。)

class foo {
public:
int x, y, z;
foo(int x, int y, int z) : x(x), y(y), z(z) {}
foo(void) : x(0), y(0), z(0) {}
};

int main(void) {
foo x(1, 2, 3), y;
y=x; // 代入できる
}

656 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 19:46:49.43 ID:FysKbdqv.net]
>>645
おかしな人みたいだからこれ以上は相手にするのやめとく
動的型付けを知らなくて間違えたことは仕方ないとしても
それを指摘された後の逆ギレはみっともないから治したほうがいいよ

657 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 19:50:44.27 ID:HCuI/gXC.net]
>>648
勝ったーwww

658 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 19:52:29.50 ID:kYAWbXnu.net]
>>648
負けちゃったね・・・(´・ω・`)

659 名前:デフォルトの名無しさん [2022/08/19(金) 20:42:25.54 ID:rkGmDNWr.net]
>>644
>>647
規制されてしまいましたが643でございます。
メンバにユニークポインタがある場合は代入演算子とコピコンは削除された関数とされてしまい、コピーが実行できません(涙
ユニークポインタは明示的に複製されないとだめなのはわかるので、仕様には文句があるべくもないのですが……
例えばの話、データ型にint char等のメンバが100個あったとして、ユニークポインタのユーザー定義型が1個紛れ込むだけで、すべてのメンバを書き出しをしなければいけないのでしょうか?
みなさんはちゃんと書きだしているのですか?と疑問に思ったので・・・
まあユニークポインターを含むデータ型をコピーしない運用をなさっているのだと思うのですが、わたしは使ってしまいます(怒)
そこで、なにか裏技のような方法がないのかなとお聞きしてみた次第であります(`・ω・´)ゞ

660 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 20:46:36.71 ID:xBNdlDtB.net]
>>651
コピーコンストラクターや代入演算子で
deep copyするunique_ptr作ればええがな?



661 名前:デフォルトの名無しさん [2022/08/19(金) 21:01:24.21 ID:rkGmDNWr.net]
>>652
メンバ変数 std::unique_ptr<My_Uniq> my_uniq; において
this->my_uniq=std::make_unique<My_Uniq>(*(right_arg.my_uniq.get()));
とコピーできるのはシンプルなのですが……

struct hoge
{
hoge& operator=(const hoge& r);
int a=0,b=0,c=0;
char d=0,e=0,f=0;
std::string g,h,q;
std::unique_ptr<MyHage> pMHage;
};
といった構造体において、
hoge& hoge::operator=(const hoge& r)
{
//メンバ全部かかなきゃいけない( ;∀;)
}
という感じになってしまうのが困るというか……もっと楽できないかなと思いまして(´;ω;`)

662 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 21:08:44.41 ID:xBNdlDtB.net]
>>653
std::unique_ptrを使わない
カスタムのunique_ptr相当だよ

663 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
>>654
なるほど得心いたしました!
ユニークポインタをラップしたクラスにコピーコンストラクタを実装すればいいという……ってコト?
ですね?
ちょっと試してめます

664 名前:デフォルトの名無しさん mailto:sage [2022/08/19(金) 21:36:17.81 ID:rkGmDNWr.net]
643です
解決しました
皆様ご親切にありがとうござい甘いた
ラップしてオペレーター実装すればいいだけだったとは……
こんなので悩んでるの私だけではないだろうか

665 名前:652 mailto:sage [2022/08/19(金) 23:10:05.19 ID:SM6rQCcv.net]
>>656
携帯だったので書けなかったけどこんな感じで
template <typename T>
class deeep_copy_unique_ptr: private std::unique_ptr <T>
{
using Base_ = std::unique_ptr <T>;
public:
explicit deeep_copy_unique_ptr (T *p = nullptr): Base_ (p) {}
deeep_copy_unique_ptr (const deeep_copy_unique_ptr <T> &p): Base_ (std::make_unique <T> (*p)) {}
deeep_copy_unique_ptr &operator = (const deeep_copy_unique_ptr <T> &p) {Base_::operator = (std::make_unique <T> (*p)); return *this;}
using Base_::operator *;
};

666 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 17:45:23.06 ID:K3rnpbr9.net]
>>621
それがそうでもないんですよ。だれか簡単なソースで示してくれませんか?
ハンドルごとにデストラクタがいろいろと変わるのが難しいと考えています。

667 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 17:53:55.99 ID:zyxn7VyM.net]
ハンドルごとに異なるデストラクタを指定すればよいのでは?
何が難しいのかソースで示してくれませんか?

668 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 17:54:26.62 ID:ThG9yriU.net]
>>658
> ハンドルごとにデストラクタがいろいろと変わるのが難しいと考えています。
ハンドル毎にクラス作ればいい
と言うかハンドル毎にコンストラクタも色々変わるはずだがそっちはいいのか?

669 名前:はちみつ餃子 mailto:sage [2022/08/20(土) 18:23:11.87 ID:ktmIW8Jj.net]
>>658
ポインタ以外のリソース一般を扱うための unique_resource クラスの提案は出ている。
一部の処理系では使えるようになっているし、ポータブルな実装があるので導入してみてもいいかもね。

このような提案が出ているのは逆に言えばスマートポインタではハンドルを上手く扱えないということでもある。

670 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 20:02:38.48 ID:vLOPx7Du.net]
>>660
>ハンドル毎にクラス作ればいい
それはもうスマポじゃない‥‥



671 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 21:48:51.04 ID:XA6yEFAc.net]
>>658
そのハンドルって何? ハンドルを具体的に指定せずにソースで示せとな?

#include <memory>
#include <cstdio>
#include <string>
using namespace std;
int main ()
{
using File_Ptr = unique_ptr <FILE, decltype (&fclose)> ;
const string path ("hoge.txt");
File_Ptr fp (fopen (path.c_str (), "w"), &fclose);
const string buf ("hage\n");
fwrite (buf.c_str (), 1, buf.size (), fp.get ());
return 0;
}

672 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 21:51:59.51 ID:xbv+n9gR.net]
unique_ptr縛りですか?
shared_ptrならコンストラクタの第二引数にDeleter関数を渡せるけど

673 名前:デフォルトの名無しさん mailto:sage [2022/08/20(土) 21:53:07.34 ID:xbv+n9gR.net]
私が言いたいことを >>663が言ってくれたみたい

674 名前:デフォルトの名無しさん mailto:sage [2022/08/21(日) 01:35:54.66 ID:hxqq7KJv.net]
こんな昔ながらのRAIIクラスでいいじゃん

class FantasticHolder
{
FantasticHandle h = NULL_HANDLE;
errno_t e;
public:
FHHolder(int flag, void* data, FOption option)
{
 e = create_fantasy(&h, flag, data, option, false, NULL, Fantasy::DREAM);
}
close() {
 e = universal_fancy_destroyer(h, NULL, true, Fancy::FANTASTIC);
 h = NULL_HANDLE;
}
~FHHolder() { close(); }
const FantasticHandle& getHandle() const {return h;}
erron_t getError const {return e;}
};

675 名前:デフォルトの名無しさん [2022/08/21(日) 13:06:57.68 ID:j3ukytx2.net]
>shared_ptrならコンストラクタの第二引数にDeleter

ほんそれ

676 名前:デフォルトの名無しさん mailto:sage [2022/08/21(日) 18:27:12.08 ID:llGchqj4.net]
lzw書いたら、色々プリプロセス突っ込んでやったのにメルセンヌツイスタの前に敗北した。
2色ビットマップは1/5になったけど、ブロック

677 名前:\ートがアホみたいに遅い・・・。Orz []
[ここ壊れてます]

678 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 01:06:46.68 ID:iYSr5CJi.net]
ロシアで収監されているナワリヌイ氏が以下URLツイートで「無限ループ」という表現を使ったんだが、どう思う?
https://twitter.com/navalny/status/1562448816267149315
(deleted an unsolicited ad)

679 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 09:24:32.64 ID:q+czqL8k.net]
スレチ

680 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 10:04:27.81 ID:1QA/N1Qa.net]
サブルーチンsub、
subを呼ぶA、
subを呼ぶB、
があって、subをAとBからしか見えないスコープに置きたくなったんですが、そういうときはnamespaceを切るしかないですか?



681 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 10:09:20.76 ID:s36cDPHI.net]
>>671
sub, A, Bをひとつのファイルに入れてファイルスコープで区切るとかクラスにまとめてクラススコープで区切るとか

682 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 12:00:46.82 ID:1QA/N1Qa.net]
>>672
クラスに入れるとしたら毎回インスタンス作って呼ぶんですかね?
外から呼ぶためだけにstatic関数にするのもなーと思ってしまうのですが、そういうのはよくやられていることですかね?

683 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 18:28:04.89 ID:tuQ48GQq.net]
Javaとかではstatic関数まとめクラスはよく見るけどC++ではあんまり見ない
それこそnamespaceを使う

684 名前:はちみつ餃子 mailto:sage [2022/08/25(木) 18:44:56.88 ID:ktMJLYyQ.net]
それはどうだろう。
namespace は内部を隠蔽しない。
キッチリと隠したいなら翻訳単位を分けるか、
翻訳単位内でも隠蔽したいならクラスに入れるかしかやりようがない。

やろうと思えば namespace で区切ってここにはアクセスしないことにするという
規約で運用するとかも出来るが、その程度で足りるなら
そんなに分けなくてもよくない? って思うし。

685 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 20:19:01.82 ID:TTLAkLfZ.net]
subを公開ヘッダに書かずに非公開ヘッダに書くだけでよくね?もしくはヘッダを用意せずに各ソースコードからexternするとか。どっちも完全に隠蔽されるわけじゃないけど。

あとは全部同じソースコードに格納できるなら無名名前空間の中にsubを入れとくとか?

686 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 21:41:52.10 ID:nLwrVbOJ.net]
friend

687 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 22:33:54.95 ID:JbTCA7nE.net]
プライベートにズケズケ踏み込んで来るのは
友達としてちょっと...

688 名前:デフォルトの名無しさん mailto:sage [2022/08/25(木) 22:54:54.82 ID:9RZfx+i1.net]
キミも今日から新しいフレンズだね

689 名前:剛田武 mailto:sage [2022/08/25(木) 23:01:36.69 ID:JbTCA7nE.net]
おお!心の友よ!
お前のものは俺のもの
俺のものは俺のもの

690 名前:デフォルトの名無しさん mailto:sage [2022/08/26(金) 06:21:10.20 ID:DLmHAhGr.net]
>>674
char_traits
numeric_limits



691 名前:デフォルトの名無しさん mailto:sage [2022/08/27(土) 07:11:01.12 ID:I8td9Ncm.net]
ジャイアンはジャイ子の兄だから付いたアダ名

692 名前:デフォルトの名無しさん mailto:sage [2022/08/27(土) 14:49:53.46 ID:K1QPdrfW.net]
>>671
AとBがクラスなら共通のMix-inクラスをAとBでprivate(protected)継承するとか?

693 名前:デフォルトの名無しさん mailto:sage [2022/08/31(水) 19:31:25.12 ID:LmkW4fMO.net]
MessageBox()みたいな機能でボタンのテキスト変更できるファンクションありませんか

メッセージが"ぬるぽ"なら[ガッ]のボタンを押したいじゃないですか!
[ はい ]、[ いいえ ]だと"ぬるぽです。ガッする場合は[はい]を押してください"みたいに長々と説明しないといけないので(´・ω・`)

694 名前:デフォルトの名無しさん mailto:sage [2022/08/31(水) 20:06:27.16 ID:HFPaJDap.net]
>>684
C++の標準ライブラリにGUIは用意されてないのよ

695 名前:蟻人間 mailto:sage [2022/08/31(水) 20:19:53.88 ID:hXO4gkW+.net]
>>684
Vista以降ならTaskDialog

696 名前:デフォルトの名無しさん mailto:sage [2022/08/31(水) 20:40:57.36 ID:LmkW4fMO.net]
ありがとう調べてみます

697 名前:デフォルトの名無しさん [2022/09/01(木) 10:24:37.74 ID:0re8NfSH.net]
windowsのアプリの話
C++で作成するとランタイムが必要なんですか?
Cならランタイムは不要ですか?
windowsのアプリを作成するとしたらC++とCでどちらの方が良いでしょうか?

698 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 10:35:00.87 ID:J4auvpO0.net]
ランタイムライブラリはCでも必要
アプリ制作が目的ならC/C++はそもそも向いてないかもしれない
出来なくはないが、そのレベルの質問をするようだと今後苦労するかも

699 名前:デフォルトの名無しさん [2022/09/01(木) 10:38:04.37 ID:0re8NfSH.net]
>>689
ありがと

700 名前:はちみつ餃子 mailto:sage [2022/09/01(木) 10:47:53.40 ID:LhGLll4T.net]
>>688
C/C++ のランタイムライブラリの一部は Windows の一部として入っているからその範囲内でならどちらでもあまり関係がない。
ランタイムライブラリの一部はVisual C++ 再頒布可能パッケージとして配布されているものもあるが Windows のバージョンによっては
最初から入ってるとかもあるのでそのあたりの事情は複雑。
バージョンの混乱を避けるならスタティックリンク版を使ったほうが楽だと思う。

Windows のアプリケーションを C で書くのはだいぶんしんどいと思う。
C++ なら楽というわけでもないけど各種フレームワークが C++ を前提にしていたりするので全体としては楽をしやすい可能性が高い。
ただ、言語仕様としては C++ のほうがだいぶん複雑ではあるので言語に対する習熟がどの程度かにもよる。



701 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 10:58:27.89 ID:0gPlf6MI.net]
GDI+ なんかはC++ベースだしな

702 名前:デフォルトの名無しさん [2022/09/01(木) 11:08:01.39 ID:wgtUDrt5.net]
Runtime と API って結局何が違うん?

703 名前:デフォルトの名無しさん [2022/09/01(木) 11:10:18.56 ID:wgtUDrt5.net]
GDI+はCからでも使えるよな

704 名前:はちみつ餃子 mailto:sage [2022/09/01(木) 11:17:08.19 ID:LhGLll4T.net]
ランタイムは実行時に使われるライブラリ (およびその他の実行時サポート) で、
API はそれらを呼出すインターフェイスのこと。

ただ、そんなにしっかりした定義があるわけではなくて
スタティックリンクするライブラリのインターフェイスを API と呼ぶかどうかなどは人によるかも?
API の P はプロトコルの P なので独立性の高いモジュールの外部仕様なら
形態にかかわらず API と呼んでいいんじゃないかと個人的には思っているが。

705 名前:デフォルトの名無しさん [2022/09/01(木) 11:27:49.27 ID:wgtUDrt5.net]
ntdll.dll とか kernel32.dll は API って感じするけど
それ以外は全部 Runtime で良いんじゃないかとも思う
msvcrt を API かって言われたら絶対違う気がする

706 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 12:14:02.42 ID:NUg6437m.net]
Application Programming Interface

707 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 12:36:35.99 ID:GpP6p1Yr.net]
APIは「境界面・接点」だから、インターフェイスの向こう側は対象外。
ライブラリは「書庫」なので、中身を含めてライブラリ。

708 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 12:48:19.96 ID:0gPlf6MI.net]
ランタイムは、特定の開発手段(GCC, VSなど)に関係する実行環境に持ち込むもの
APIは、特定の操作対象(OS、アプリなど)に関係する関数など

709 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 13:18:41.91 ID:epb6+NRn.net]
「ランタイム」って不思議な名前だね
何語かな?

710 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 13:31:42.39 ID:NUg6437m.net]
Runtime library
https://en.wikipedia.org/wiki/Runtime_library



711 名前:デフォルトの名無しさん [2022/09/01(木) 13:39:01.39 ID:wgtUDrt5.net]
携帯電話をケータイと略してしまって何のことか判らなくなるのが日本人の本質

712 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 13:49:12.02 ID:epb6+NRn.net]
>>701
単なるライブラリじゃん

713 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 14:00:22.77 ID:epb6+NRn.net]
>>702
英語だと「mobile」だしそこは日本人に限らない

714 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 14:04:08.43 ID:oIm36FRE.net]
静的じゃなくて、かつ統合的な機能を提供しとるライブラリという感じ

715 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 14:06:48.53 ID:P/wcDX1Q.net]
いうて英語圏でも普通にRuntimeと表記されまくってるよ
CRTLよりCRTのが一般的だし。RTよりはRTLかもしれんが

>>703
したらわざわざ区別するような名称が付いたりしません

716 名前:はちみつ餃子 mailto:sage [2022/09/01(木) 14:15:18.72 ID:LhGLll4T.net]
>>702
いや、プログラムから呼び出されるライブラリだけでなく実行時サポートのための機構全般を含めてランタイムという場合もある。
たとえば WebAssembly の仮想機械の実装である wasmtime も "A fast and secure runtime for WebAssembly" と説明されている。
https://wasmtime.dev/

明確な用例を見つけられないんだけど .NET とかでも同じようなニュアンスだったはず……。

717 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 14:40:23.38 ID:veDjuKDC.net]
おまえらは用語の定義とかの話になると生き生きしはじめるな

718 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 14:46:45.68 ID:PGNFrqcy.net]
それがプログラマに大事な資質の一つだからまあ

719 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 15:06:04.82 ID:X5eV6Z9e.net]
WebAPI はどうでもいいとして
Win32API 以前は API ってあんまり聴かんかった気がする
もし時代が時代なら C Runtime は Console API とか
System Call API とか名付けられていたんじゃまいか

720 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 15:13:38.12 ID:epb6+NRn.net]
Linux界隈でもランタイムって用語は
あんまり馴染みない気がする



721 名前:はちみつ餃子 mailto:sage [2022/09/01(木) 15:45:49.43 ID:LhGLll4T.net]
ランタイム (実行時) という語をあてはめる以上は静的ではないというニュアンスが感じられるし、
ダイナミックリンクされるもの全般をふんわりとそう呼び始めたとかではないかなぁ。
あくまでも想像の域を出ないけど。

>710
それはどうだろう。
C ランタイムはコンソールの操作だけを司るわけではないし、ほとんどの関数はシステムコールしない。
あくまでも C という言語の事情に強く結びついているのでランタイムとは呼ばれなかったとしても
C ナントカという名前にはなったんじゃないかな。

722 名前:デフォルトの名無しさん [2022/09/01(木) 16:33:34.64 ID:X5eV6Z9e.net]
stdc

723 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 17:32:56.24 ID:pvebLOMF.net]
libc

724 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 17:56:44.20 ID:6yN4NXnZ.net]
libgcc

725 名前:デフォルトの名無しさん [2022/09/01(木) 20:14:05.79 ID:IftgsB+t.net]
DOSの頃はINT21hのシステムコールだしな。
描画はVRAM直だし。
APIと言うより割り込みだな。

726 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 21:31:42.28 ID:2+rvldGI.net]
APIという言葉からは、実装を絶対に見せたくないという強い意志のようなものを感じる

727 名前:デフォルトの名無しさん [2022/09/01(木) 23:17:08.92 ID:X5eV6Z9e.net]
oppapi

728 名前:デフォルトの名無しさん mailto:sage [2022/09/01(木) 23:26:48.72 ID:JiwZvitn.net]
A(あんまり) P(ぱっとしな) I(い)

729 名前:はちみつ餃子 mailto:sage [2022/09/02(金) 00:07:28.67 ID:4QwPhwTb.net]
>>716
DOS の用語ではファンクションコールじゃなかったっけ……
と思って資料を読み返したらなんだかあまり統一されてない感じだった。
ファンクションリクエストという用語を使っている場合もある。

当時の用語の混乱は置いといて、現代的にには
機械語レベルでの値の受け渡しやメモリの配置は ABI で決めるべきことで
API はその上に構築される高レイヤな概念と解される場合が多いと思う。
ソフトウェア割込みを使うという規約は ABI に属して、
どのような値を渡してどんな効果があるかは API に属すと考えるべきじゃないかな。

730 名前:デフォルトの名無しさん mailto:sage [2022/09/02(金) 07:20:17.05 ID:gHt2MaJh.net]
メインフレームではSVC
DIAGNOSEを使う馬合もあるけど



731 名前:デフォルトの名無しさん [2022/09/02(金) 09:12:32.54 ID:K5Jq4B80.net]
こんなのがあったんだけど

https://qiita.com/purigen/items/d68b146f341c41d260fc
c = c = testString.find_first_of(" ")

これってなんで2回も代入してりゅの???わからにゃいよ

732 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
誤植でしょ

733 名前:デフォルトの名無しさん [[ここ壊れてます] .net]
そっか誤植か〜
わかったニャン☆

734 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
Win32の頃はint2ehのだしな
描画はシステムメモリに書いてbitbltだし
APIと言うより割り込み棚

735 名前:デフォルトの名無しさん mailto:sage [2022/09/02(金) 12:14:46.88 ID:2iQGHF2d.net]
g++で以下の警告のようなメッセージ(`note')が出るのですが
これは何を意味しているのでしょうか?
コンパイラはaarch64-linux-gnu-g++-10で
オプション-std=c++14に変えるとメッセージは出ません
またx86_64-linux-gnu-g++-10でコンパイルすると
-std=c++17でも-std=c++14でもメッセージは出ません
恐らくC++の規格の問題だと思いますのでこちらに書かせて頂きます
$ cat test.cpp
#include <cmath>
#include <utility>
using namespace std;
pair <double, double>
hoge (double p_x, double p_y)
{
return make_pair (p_x, p_y);
}
int main () {return 0;}
$ g++ -std=c++17 test.cpp
test.cpp: In function ‘std::pair<double, double> hoge(double, double)’:
test.cpp:6:29: note: parameter passing for argument of type ‘std::pair<double, double>’ when C++17 is enabled changed to match C++14 in GCC 10.1
6 | hoge (double p_x, double p_y)
| ^

736 名前:デフォルトの名無しさん mailto:sage [2022/09/02(金) 13:54:12.27 ID:gHt2MaJh.net]
俺んとこでは -std=c++98 でも何も言ってこない
バージョンは g++ (Rev5, Built by MSYS2 project) 10.3.0

Microsoft(R) C/C++ Optimizing Compiler Version 19.33.31629 for x64 で /W4 にしても何も言ってこない

737 名前:デフォルトの名無しさん mailto:sage [2022/09/02(金) 14:42:37.96 ID:E472VNc+.net]
これかな
https://gcc.gnu.org/gcc-10/changes.html#empty_base

738 名前:はちみつ餃子 mailto:sage [2022/09/02(金) 14:46:58.07 ID:4QwPhwTb.net]
>>726
言語仕様上は問題ないけど、どうやら特定の環境で起こる GCC のバグを修正した
ために ABI の辻褄が合わないかもしれないというような事情っぽい。

739 名前:デフォルトの名無しさん mailto:sage [2022/09/02(金) 15:04:43.31 ID:2iQGHF2d.net]
>>727-729
有難うございます
難しすぎて書いてあることが良く分からんのですが
ABIなのでビルドし直せば問題ないと理解しました
みなさん凄い調査能力だな

740 名前:はちみつ餃子 mailto:sage [2022/09/02(金) 15:06:04.63 ID:4QwPhwTb.net]
>>730
いや、エラーメッセージでググったら stackoverflow で背景の説明をしてるのが見つかったぞ。



741 名前:デフォルトの名無しさん [2022/09/02(金) 18:13:40.07 ID:/OwM2R8K.net]
ω株 PI.3.14

742 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 14:35:12.50 ID:pQsEVmxh.net]
OSの板で聞くべきかもしらんが、終了シグナル受け取ったらメモリの中身を書き出して中断し、再びコマンドが叩かれたらメモリの中身を読み込んで途中から再開するみたいな仕組みを一番簡単にやる方法ってどんなですかね?
チェックポイント・リスタートっていうんでしょうか

743 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [[ここ壊れてます] .net]
>>733
Linux とか BSD で昔はメモリをダンプするシステムコールがあったはずだが廃止されたんじゃなかったっけ。
Emacs でそのシステムコールを使ってたから色々とゴタゴタしたような記憶がある。
(そのシステムコールの名前が思い出せない……。 すまぬ。)

再開に必要な情報を適当にシリアライズして書き出すしかしょうがないんじゃないの。

744 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 23:44:43.38 ID:Vl/J6nKl.net]
やったことないけどgdbでできそうな気はする

745 名前:デフォルトの名無しさん mailto:sage [2022/09/14(水) 01:15:05.96 ID:o/NVybOh.net]
ptraceは無敵

746 名前:デフォルトの名無しさん [2022/09/22(木) 16:50:54.43 ID:MKlA3Ol3.net]
おはこんばんわ
何度もお世話になっておりますが、今回も皆様のお知恵をお借りしたく書き込みをしております。
初歩的な質問かもしれませんが質問させてください!

私の質問は、動的な任意型を戻り値とする関数を作ることは可能でしょうか??という事です。
したい事は、
template <typename T>
T ret(int arg)
{
If(arg==0)return static_cast<hoge>(arg);
else if(arg==1)return static_cast<hage>(arg);
}
でホゲ型とホラン千秋型を引数によって変化させて返却したいのです……が、
私が見ても無理そうな感じなのです。ニパー
そもそもテンプレートってコンパイル時点で推察できないと無理ですよね?
この悩みに何か方法や別解があったりしたら教えていただきたく、スレ汚しを失礼しております。

感謝は先に申し上げておきます。
ありがとうございます!

747 名前:デフォルトの名無しさん mailto:sage [2022/09/22(木) 17:27:40.84 ID:vBAk//C3.net]
>>737
一般的には型システムの健全性と安全性のために
そのような用途では代数的データ型(タグ付き共用体)を用いる
C++ではstd::variantであるがパターンマッチングなどの言語サポートがないため若干扱いにくい

748 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [[ここ壊れてます] .net]
>>737
実行時の多相は抽象クラスを使うのが基本ということになってる。
その場合で言えば hoge と hage が共通のインターフェイスを持つ (抽象クラスを継承する) ようにクラス設計するのが普通。
まずは抽象クラスを学んでみて。

最初からクラス設計に関与することが出来ない場合 (既存のライブラリなので手を加えられないなど)
に動的に切り替える必要があるなら std::variant や std::any が使えるのだけれど……
使う箇所で元の型にキャストしなおしたり、 std::visit を経由したりで煩雑になりがち。

749 名前:デフォルトの名無しさん mailto:sage [2022/09/22(木) 21:37:36.04 ID:PsWl+Otb.net]
anyってstdに入ってるんだ!

750 名前:デフォルトの名無しさん mailto:sage [2022/09/22(木) 22:12:16.21 ID:PsWl+Otb.net]
>>737
argがコンパイル時点で決定しているのならやりようはあるが
実行時まで決まらないのならみなさんの言う通り
retをどう使うのか呼び出し側のコードを書いてみてよ



751 名前:はちみつ餃子 mailto:sage [2022/09/22(木) 22:27:10.41 ID:He0eupRY.net]
>>740
入ったのは C++17 だし、あまり積極的には使わない種類のものだから目立たないよな……

752 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 00:25:25.16 ID:LrToOuio.net]
any使えばクソコードは書けるがw

#include <iostream>
#include <any>
using namespace std;
struct hoge {
int value_;
hoge (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
struct hage {
int value_;
hage (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
std::any ret(int arg)
{
if(arg==0)return hoge (arg);
else if(arg==1)return hage (arg);
return std::any ();
}
int main () {
try {
any_cast <hoge> (ret (0)).output (cout) << endl;
any_cast <hage> (ret (1)).output (cout) << endl;
any_cast <hoge> (ret (1)).output (cout) << endl; // An exception will be thrown.
} catch (const std::bad_any_cast &) {
cerr << "std::bad_any_cast\n";
return -1;
}
return 0;
}

753 名前:デフォルトの名無しさん [2022/09/23(金) 02:10:00.16 ID:gD4It3Ab.net]
Python や tcl のコードだな

754 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 02:31:56.65 ID:LrToOuio.net]
argがコンパイル時に決まってるなら例えば以下の通りにディスパッチ
Loki::Int2Typeって今はC++に入ってるっけ?
#include <iostream>
using namespace std;
namespace Loki {
template <int v>
struct Int2Type {
enum { value = v };
};
}
struct hoge {
int value_;
hoge (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
struct hage {
int value_;
hage (int arg): value_ (arg) {}
std::ostream &output (std::ostream &os) {return os << value_;}
};
hoge ret(Loki::Int2Type <0> p){return hoge (Loki::Int2Type <0>::value);}
hage ret(Loki::Int2Type <1> p){return hage (Loki::Int2Type <1>::value);}
int main () {
ret (Loki::Int2Type <0> ()).output (cout) << endl;
ret (Loki::Int2Type <1> ()).output (cout) << endl;
return 0;
}

755 名前:デフォルトの名無しさん [2022/09/23(金) 17:57:04.27 ID:tVlOtcCS.net]
>>738
>>739
返信ありがとうございます。
variantで返すかUnionのようなもので返すか、という事ですね。
Unionの存在を初めて知ったので、できれば使いたいと思います。

756 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 18:13:00.58 ID:MklXD0R7.net]
そういう用途でタグ無しunionは危険で不便な昔の遺物
どの言語でも安全で便利なタグ付きunionを用いる
C++はパターンマッチングが弱いのでそこを改善すればさらに便利になるはずだ

757 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 19:52:56.72 ID:Ztvb6Y4W.net]
無名の共用体
anonymous union

758 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 23:41:53.30 ID:icgBEU6J.net]
anonymous union というとなにかこう、不穏なひびきがあるな
集団で徒党をくんでハッキングする的な

759 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 00:05:53.42 ID:G+JpnkhJ.net]
そもそも文脈なしのunionって労働組合だからもともと不穏な響きの単語

760 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 00:18:57.85 ID:JL9pTOdW.net]
ネトウヨ現る



761 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 00:38:49.83 ID:Pnjq2Ki8.net]
Union Jack

762 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 00:38:55.02 ID:NrutJXN/.net]
「集団」で「徒党」を組むって

763 名前:デフォルトの名無しさん [2022/09/24(土) 20:29:13.36 ID:7pBAspe1.net]
Visual Studio Community おそろしあ

764 名前:デフォルトの名無しさん mailto:sage [2022/09/24(土) 22:05:06.81 ID:51wpUqA8.net]
チューリンからメール北?

765 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 08:57:53.30 ID:Fzzl8jy0.net]
>>751
何が見えてるの…

766 名前:デフォルトの名無しさん [2022/09/26(月) 21:36:36.83 ID:T6INyDl8.net]
ちょっとわからなくなってきたため良ければ教えてください。
他言語を使用していて強く感じることですが、.hと.cppを行ったり来たりする開発スタイルがかなり面倒に感じます。
ヘッダに実装を書いても普通にビルド出来てしまうため個人的な開発はヘッダオンリで済ませています。
何番煎じの話かもしれませんが、分割するしないでのメリット・デメリットを教えてください。

767 名前:デフォルトの名無しさん mailto:sage [2022/09/26(月) 21:41:04.85 ID:yuD7kgln.net]
再コンパイルコストとインターフェイスと実装の分離

hに全部書いてしまうと、それの変更があった場合にincludeするすべてのファイルで再コンパイルが走り、時間がかかるようになる
hに全部書くため、変更の機会も当然多くなり、頻繁にビルド待ちの状態になるのは避けたい

インターフェイスと実装を分離しておくことは、保守や共有の最、理解を早くするという点で有用

どっちの話も大規模になると効いてくる話なので、小規模開発なら全部.hに書くスタイルでも構わないとは思う

768 名前:はちみつ餃子 mailto:sage [2022/09/27(火) 09:30:59.47 ID:ozjafOA0.net]
>>757
C の延長線上でなんとかしてきた C++ の言語仕様があんまり良くないんだよ……。
実装とインターフェイスを分けるのはカプセル化の観点からも好ましいのだけれど
C++ ではテンプレートを処理する都合上でこの分離が破綻しているので
そこらへんはまあ運用の工夫で……みたいな微妙な機微がある。

どうにもな

769 名前:らんのがわかってるから新しい C++ ではようやくモジュールが導入された。 []
[ここ壊れてます]

770 名前:デフォルトの名無しさん [2022/09/27(火) 09:41:59.52 ID:ZJUDc1gE.net]
FILE * は使っても
struct FILE の中身なんて知らなくて良いからな
使うだけなら void * で充分



771 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 11:09:05.55 ID:HLZr1vWv.net]
c#みたいにヘッダ無いのが良いことだとは思えんのだよなあ

772 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 11:20:16.93 ID:XJRFtCjW.net]
C#だけでなく今世紀のプログラミング言語は全てヘッダファイルなんて無いんじゃない?
不要なものなんだと思うよ

773 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 11:28:04.52 ID:dmYM9sG7.net]
.hppって拡張子でヘッダに処理を書いてるのを見たことある

774 名前:はちみつ餃子 mailto:sage [2022/09/27(火) 14:13:36.82 ID:ozjafOA0.net]
>>763
.hpp は C++ のヘッダとしてはありふれた拡張子。 定義を書くかどうかとは関係なく使われるよ。
昔は .hxx とか .h++ とかもあったし、テンプレートが含まれるヘッダには .tcc と付ける習慣が一部にはあった。
大文字で .H とか付けてるのも有ったけどファイルシステムによっては大文字と小文字が区別されないから早い内に廃れたと思う。

C と共用できるように書かれたヘッダを除いては .h という拡張子は避けたほうが運用しやすいと思うんだが、
そこらへんの考え方も慣例が確立していなくてなんだかグダグダなんだよなぁ。

775 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
>>763
template主体ならhppにガッツリ書いてたけど、ちな、どこに書くの?

776 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
ヘッダはテンプレートでごちゃごちゃしてなければどんな構造してるのかパッと見で分かりやすい

777 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
ヘッダに実装書く必要がある場合は
俺はインターフェース用ヘッダと実装用ヘッダに分けてるな
ヘッダには本来インターフェースのみが簡潔に書かれているのが望ましいと思う

778 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 20:14:12.91 ID:eLTt/hKm.net]
他のプログラミング言語はヘッダファイルが無くても困っていないから
ヘッダファイルは大昔当時のCコンパイラがサボるために用意しただけの本来は要らない子なんじゃ?

779 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 20:35:59.29 ID:c5I+FNto.net]
ソース公開出来ないようなハード実装ライブラリを隠蔽して提供するためにはヘッダは必須項目

780 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 20:41:17.15 ID:WqTtjjk3.net]
>>769
ハード実装をヘッダで表現することはできません
ソフト実装のみです



781 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 20:49:31.24 ID:3EQ0ZEAi.net]
>>768
必須じゃないけど便利だよ
使いたいけど実装なんか見たくないときは
プロトタイプだけヘッダに書かれてれば
それだけ見てれば良い

782 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 21:01:15.67 ID:uWssz7Bg.net]
>>771
時代遅れすぎだろw
今はそんなヘッダファイルを見なくても
ヘッダファイルが存在しなくても
ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
だからC/C++以外はヘッダファイルなんて存在しない

783 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 21:05:03.18 ID:3EQ0ZEAi.net]
>>772
>ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
それはヘッダがないから仕方なくなのではないかな?
C++でも自動抽出ツールされたドキュメントを見ても良いのだよ

784 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 21:08:18.80 ID:j15wYqDV.net]
>>773
つまりヘッダファイルの必要性はない、との結論になりますな

785 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 21:10:16.49 ID:3EQ0ZEAi.net]
ならない

786 名前:はちみつ餃子 mailto:sage [2022/09/27(火) 21:23:27.93 ID:ozjafOA0.net]
実装とインターフェイスを分離するという根本思想自体はよかったと思う。
それを実現するためにプリプロセッサで単純にヘッダをはめ込むというのは雑すぎるやり方だとも思う。

787 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 21:36:37.50 ID:D5WhN1Dz.net]
他の言語はヘッダ無くても何も困っていないから
本質的にはヘッダは不要物なのだと思われる

788 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 22:23:04.59 ID:vPBo+Ol+.net]
マルチパスコンパイルするオプションがコンパイラにあればいいのにね

789 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 22:28:17.08 ID:TG8VJWwA.net]
>>777
古い bcc には、確かヘッダを自動抽出するオプションがあった気がする

790 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 22:39:41.48 ID:EwsxhlHO.net]
仕組みが簡潔でドライなシステムを好む人もいるし
もはや把握しきれないカオスなシステムに帰依する人もいる

俺は前者だし、これからもそうありたい



791 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 22:51:33.49 ID:c5I+FNto.net]
カオスは崩壊へと繋がる
ATiのCatalystのようにな

792 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 23:37:44.35 ID:3EQ0ZEAi.net]
実装とインターフェイスの分離の点でC++が甘いのは
classのメンバー変数がヘッダに書くところ
俺はデフォルトでpimplにしてるけど

793 名前:デフォルトの名無しさん mailto:sage [2022/09/27(火) 23:55:22.40 ID:TrPk/9km.net]
>>780
最近の言語はどれもその簡潔な方式だよ
ヘッダファイルとソースファイルは二重管理だからソースファイルに統一
さらにソース付随コメントとドキュメントファイルも統合してソースファイルにのみ記述
シンプルになってる

794 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 00:14:01.17 ID:SR5jaMok.net]
自動生成みたいなことしても、特に見通しがよくなっとらんと思うんだよね
ヘッダファイルじゃなくてもいいけど、どこかでユーザにインタフェース提示を強制する必要はある気がする

795 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 00:21:27.19 ID:2Lj4foK2.net]
>>784
多くの言語は関数定義かそのままインターフェース宣言を兼ねていて一元化されてるよね
バラバラに用意することこそ不自然なのよ

796 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 00:52:38.13 ID:qgMCZEH2.net]
いや俺はインターフェースは簡潔にヘッダーにまとまってる方が良い
管理が二重になっている云々は同意せんでもないが
同一性はコンパイラがチェックしてくれるので全く問題なし
ドキュメントの自動生成ってリアルタイムに更新してくれるんかいな?
Doxygenみたいなのを想像してるんだが?

797 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 00:54:10.34 ID:qgMCZEH2.net]
C++に慣れすぎて実装とインターフェースが混在してるソース見ると
俺は読みたくなくなるんだが?

798 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 00:57:52.51 ID:ipyGSCwr.net]
>>787
めちゃめちゃわかりすぎる
関数なりクラスなりの定義部分だけ切りだして別ドキュメントにまとめてくれや(’A’)
っていう気分にいなる

799 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 01:57:05.38 ID:wKFGQzb0.net]
>>785
いや兼ねていてというか、ない
だからサポートするソフトが何らかの方法で提示してるんだけど、必ずしも見やすくなってないのは問題

800 名前:はちみつ餃子 mailto:sage [2022/09/28(水) 02:35:16.76 ID:koSj9wX0.net]
>>768
ヘッダを分けるのは最初は処理系の実装上の都合だったのは事実だと思う。
素朴なオブジェクトファイルは名前とアドレスの組でしか管理していない。
具体的な型をやりとりする仕組みは必要で、それがヘッダファイル。

リンカなどのツールチェインが充実していないのを
コンパイラとプリプロセッサがカバーする形なのでツールチェイン全体が上手く連携できるなら
ヘッダという仕組みは無くても良い。

それはそれとして処理に必要かどうかと言語の表現はまた別問題だ。
原理的に必要かどうかだけで言うならバイナリエディタだけあればプログラムは作れることになってしまうよ。
言語は機械に処理させる以上に人が読み書きする。

もちろんどんな言語が分かり易いかは人によるだろうけども
C++ に満足している C++ ユーザは実装とインターフェイス分離することを利点だと考えている場合は確実に多いよ。
私もそうだし。



801 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
単にヘッダファイルに慣れていて愛着があるだけです
冷静に考えれば分かります
他の言語はヘッダファイルがなくても機能しています
つまりヘッダファイルは不要なものです
他の言語はヘッダファイル方式を採用しませんでした
つまりヘッダファイルを採用するに値するアドバンテージはありません

802 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 08:10:47.02 ID:PNF1OAD8.net]
今は必要に応じてIDLを使うようになっているだけじゃない?Protobufぐらいしか知らないけど。

803 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 08:51:33.64 ID:qgMCZEH2.net]
>>791
C++もヘッダに実装書けば似たようなソースになるけど
読み難いんだってば

804 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 09:19:16.30 ID:H8fqr1nL.net]
c#のプロジェクト、実装してから設計起こした様なグダグダなのばっかになってるよね
pythonだとそうはならん気がするけど

805 名前:デフォルトの名無しさん mailto:sage [2022/09/28(水) 22:49:08.92 ID:6+yt9OFm.net]
obj や lib だけを提供する場合は、ヘッダは絶対に必要かと
他の言語ではどうしていますか?

806 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 03:41:22.05 ID:6tct/z4w.net]
ヘッダは無くてもいいがある方が便利なときがある

使い回すマクロの定数とか定義とかヘッダに書くのが一般だし
誰かが書いてたけどヘッダファイルに関数の説明とか書くスタイルなら
そこだけ見れば済むようになるし

無くても困らないけど結局は
include xxx.c なんてソースコードを見ることなると思う

807 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 03:46:51.96 ID:6tct/z4w.net]
>>795
javaは起動するときに.classファイルの中にある関数名を見てるのが
通常じゃないのかな

808 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 04:34:33.18 ID:MD5zUQsY.net]
ラムダ式でコピーキャプチャした変数ってなんでデフォルトで immutable なの?

あとそれに関連してるかもしれないけど、const int a があったとして、a をコピーキャプチャして mutable をつけたラムダ式の中で a を変更しようとすると許されないんだけど、これもなんで?

809 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 06:34:14.97 ID:Jka8tyPG.net]
最初にラムダ入れた時の設計ミス

810 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 07:34:10.57 ID:u1XdWODd.net]
ミスか?
俺はGJと思ったぞ
constの逆は欲しかった
明示的に書き込み許可すんの



811 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 08:13:36.08 ID:HMWtGy3T.net]
>>795
ドキュメントを配る

812 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 09:51:48.04 ID:r+IaQb6m.net]
ヘッダなんて特別なものはなくて
includeディレクティブがあるだけ

813 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 13:54:32.28 ID:o1fQB+Qf.net]
C++11以前なのでoverride演算子がないソースコードなのですが、
派生クラスでオーバーライドされている関数を簡単に見つける方法って
ありますか?
virtual関数を1つずつgrepするしかないですかね。

814 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 14:30:55.43 ID:o/ss6osA.net]
>>803 何の前提も無ければ自分がソース持ってないところでオーバーライドされてる可能性もあるので、
いろいろ前提を絞らないと無理かと。
override (「演算子」じゃなくて「キーワード」)があったとしても、付け忘れてる可能性もあるし。

815 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 15:19:58.87 ID:o1fQB+Qf.net]
>>804
失礼、修飾子でした。
やっぱそうですよね。
継承が3階層あって、その中間階層クラスのメンバ関数なので調べにくいのですが、
地道に1つずつチェックしようと思います。

816 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 15:27:09.76 ID:OAAH5wr1.net]
ヘッダに実装が書かれててもエディタでショートカット1個押して折りたたむだけでインターフェースすぐわかるくね?

817 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 17:04:17.17 ID:nKyEXpsu.net]
まっとうならバイナリなりだけ開発環境でインポートすれば、
綺麗にインターフェイスが見える。

818 名前:はちみつ餃子 mailto:sage [2022/09/29(木) 17:12:42.79 ID:xXycU9Ev.net]
共有オブジェクト (ダイナミックリンクライブラリ) の段階にまでなってしまうと型は別のところから与える必要があって、
基本的にはビルドの時に型情報を表すなんらかのファイルも生成できるけど、めんどいのは言語をまたぐときなんよね。
Windows API はいろんな言語から使えるような (バインディングの生成元に出来るような) メタデータを提供するという形で
対処しているのでこのへんは Windows API に限らず使いやすい

819 名前:謔、に規格化や環境整備が進むことを期待している。 []
[ここ壊れてます]

820 名前:803 mailto:sage [2022/09/29(木) 17:14:04.54 ID:o1fQB+Qf.net]
今はLinuxでgcc+vimを使っています。
どういう環境なら見えますか?



821 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 18:21:37.90 ID:YHMprl0j.net]
gtagsとか?

822 名前:はちみつ餃子 mailto:sage [2022/09/29(木) 21:13:35.71 ID:xXycU9Ev.net]
>>809
近頃は vim も LSP に対応してるはずだから clangd と合わせて使えばいいんでないの。
わいは vim についてはよう知らんけど VSCode では出来ているから原理的には出来るはず。

823 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 21:39:32.67 ID:o1fQB+Qf.net]
>>810,811
似たようなツールでdoxygenを使ったら簡単に見つけれるようになりました~
ありがとうございます!

824 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 21:44:06.62 ID:YHMprl0j.net]
似てねーw

825 名前:デフォルトの名無しさん mailto:sage [2022/09/29(木) 21:59:47.36 ID:xIdOGMqx.net]
ええ…

826 名前:デフォルトの名無しさん [2022/10/03(月) 10:37:30.67 ID:BGisZcin.net]
>>795
obj と lib と h (hpp) だけじゃ不十分
バージョン管理も必要
これ重要

827 名前:デフォルトの名無しさん [2022/10/03(月) 10:40:19.01 ID:BGisZcin.net]
>>790
template ですね判ります

828 名前:デフォルトの名無しさん mailto:sage [2022/10/05(水) 11:46:44.33 ID:qhw2L+Ej.net]
サイズが可変な自作クラスXのvectorを持ちたいとします。
このとき、Xの実体をいくつかvectorに入れて不用意に各要素のサイズを変更すると、メモリの割り当てがおかしくなりますよね?
実体ではなくポインタを持つ以外のワークアラウンドはありますか。

829 名前:はちみつ餃子 mailto:sage [2022/10/05(水) 11:58:22.13 ID:q7thXXzU.net]
>>817
メモリの割り当てがおかしくなると思う事例をコードで説明して。

830 名前:デフォルトの名無しさん mailto:sage [2022/10/05(水) 12:31:37.02 ID:Ghll8vG9.net]
>>817
「サイズが可変なクラス」の簡単な具体例を教えてくれないかしらん?



831 名前:デフォルトの名無しさん mailto:sage [2022/10/05(水) 12:38:22.59 ID:zqJzN+DI.net]
>>817
出来ます
Xの参照(ポインタ等)のベクターを持ちます
Xのサイズが可変でバラバラでも構いません

もしXのサイズに上限値があるならば
別の方法としてその上限値サイズのベクターを用意する方法もあります

832 名前:デフォルトの名無しさん mailto:sage [2022/10/05(水) 12:52:15.30 ID:qhw2L+Ej.net]
>>819
boost::multi_array の resize

833 名前:デフォルトの名無しさん mailto:sage [2022/10/05(水) 12:53:20.63 ID:qhw2L+Ej.net]
>>820

それは>>817の最終行の冒頭と何が違いますか

834 名前:はちみつ餃子 mailto:sage [2022/10/05(水) 13:05:31.97 ID:q7thXXzU.net]
sizeof の結果は常に定数なんだよね……。
https://timsong-cpp.github.io/cppwp/n3337/expr.sizeof#6
(C では VLA まわりで定数にならない場合もあってその挙動を拡張として取り入れている C++ 処理系もある。)
そういう意味ではサイズが可変なクラスは存在しない。

>>821
boost::multi_array もそれ自体の大きさは一定。
内部的にはポインタで保持してる。

835 名前:デフォルトの名無しさん mailto:sage [2022/10/06(木) 11:24:20.53 ID:0pxze5TV.net]
やっぱり817が思ってる「おかしくなりますよね?」の最小コード提示してもらわないと
実はそれおかしくならないって結論になりそうなんだが?

836 名前:デフォルトの名無しさん mailto:sage [2022/10/06(木) 14:37:24.06 ID:BJfOFqw4.net]
つまりおかしくなる理由が分からない人が相談に答えようとしているわけだな。

837 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
>>819,821,823の流れで解決してると思うのだが
>>817が返答も何もしないので>>824のようなのが出てくる

838 名前:デフォルトの名無しさん mailto:sage [2022/10/06(木) 18:12:29.65 ID:nyTo+ttU.net]
「サイズ(sizeof)が可変なクラス」なんて存在しないから817が何かを勘違いしてるのは確かだが
何をどう勘違いしてるのか分からんからお前さんの信念でコード書いてみなって話だろ
別におかしくない

839 名前:デフォルトの名無しさん mailto:sage [2022/10/06(木) 21:12:38.87 ID:2ZLAwlmb.net]
>>821>>817の考えていることは明らか
>>823以上は蛇足だよ

840 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 02:21:50.23 ID:qb/V/k6I.net]
>827
単にお前の読解力の話でしかなかったのか。
「サイズが可変な」はvectorに掛かってると考えるだろうふつう。理由は
> 「サイズ(sizeof)が可変なクラス」なんて存在しないから
と自分で指摘してるとおり。



841 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 06:51:34.90 ID:iCJcr8aJ.net]
「サイズが可変な」はクラスに掛かってると考えるだろうふつう。vectorは当然サイズ可変なんだから

842 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 07:35:25.67 ID:BBv/2c76.net]
sizeof(std::vector<T>)なんて気にせんだろふつー

843 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 07:47:52.68 ID:4lX0Ypwn.net]
まあクラスのサイズが変わるようなイメージだったよね

844 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 08:23:09.11 ID:0jEkBwds.net]
コード見せろ、この日本語が分からない奴に
このスレは無理

845 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 08:23:45.29 ID:2UgM0KPC.net]
質問者です
皆さんのおかげで解決しました
ありがとうございます

846 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 08:24:03.77 ID:2UgM0KPC.net]
もうこの話は終了でよろしくお願いします

847 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 11:13:53.12 ID:p6wqSRzL.net]
817の類似
https://ideone.com/81vcNn
e1, e2 と list の要素は別物だけど (2) の操作で list も同じく反映するようにするには
list を vector<X*> として ポインタ渡す他に何か手段あるのかな

848 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 11:34:57.30 ID:fogpWmkA.net]
std::vectorもboost::multi_arrayも要素数の変更ができるけど、その可変可能個数要素を格納する領域はクラスのインスタンスとは別のヒープ領域に確保されるようになっていて、クラスのインスタンにはそのヒープ領域へのポインタが格納される
したがって要素数を変更してもクラスのインスタンのサイズは変わらない
だよね?

849 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 11:35:56.48 ID:fogpWmkA.net]
インスタンじゃなくてインスタンス…

850 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 11:42:47.63 ID:Y5jy7O5b.net]
>>837
なぜ上で書かれてるのと同じことを書きたくなったの?



851 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 12:34:55.78 ID:UqkGeV53.net]
>>836
listに手を入れるとか手段はあるだろうけどそもそも
> list を vector<X*> として ポインタ渡す
で何が問題なのかを書いた方が良いかと

852 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 12:43:53.29 ID:p6wqSRzL.net]
>>840
自分で質問しといてなんだけど、たいした問題点でもなかったりするんだよな…

vector<X*> list; だと要素をアクセスする際に記述が煩雑になるところ
 list[i]->size(); ←おけ
 list[i]->push_back(hoge); ←おけ
 (*list[i])[j]; ←きもい

853 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 12:54:10.56 ID:p6wqSRzL.net]
実体のポインタを list に詰まず new したものを詰んだ場合
お漏らしやタングリングポインタになるかもしれんってのもあるかな
これだと問題点が前提とは別のところになりそうではある

854 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 13:55:22.13 ID:WQmSj+WJ.net]
>>841
ラッパー書きゃよろしいがな

template <typename T>
class Vector: private vector<T>
{
using Base_ = vector<T>;
public:
using Base_::push_back;
using Base_::size;
const typename remove_pointer <T>::type &operator [] (size_t i) const {return *Base_::operator[] (i);}
typename remove_pointer <T>::type &operator [] (size_t i) {return *Base_::operator[] (i);}
};

Vector<X*> list;
list[i]->size();
list[i]->push_back(hoge);
list[i][j];

855 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 14:39:47.78 ID:UqkGeV53.net]
>>841
>  (*list[i])[j]; ←きもい
list[i]->operator [](j) ← う~ん、もっときもいかw

>>842
まあ今時生ポインタは使わんわな
shared_ptr とかを入れれば多少安全かと

856 名前:ハノン ◆QZaw55cn4c mailto:sage [[ここ壊れてます] .net]
>>827
www.kouno.jp/home/c_faq/c2.html#6
のことでしょ?
これはもう C89 の昔から言われ続けており、太古の C99 でも
seclan.dll.jp/c99d/c99d04.htm#dt19990726
のとおり導入されたわけですし

今更なんですけれどね

857 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
>>834
どう解決したのかコメントを求む
まだ憶測他で引っ張ってるし

858 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 19:57:27.07 ID:T/Xux0J0.net]
>>845
それはただのポインタトリックであってsizeof(info_t)が可変になる訳じゃない
というかそのページでもsizeofのこと説明してんじゃん
相変わらずの無能っすね

859 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 20:10:14.06 ID:Znh4X5V+.net]
>>847
元の質問>>817はサイズが可変としか言っていない
つまりsizeofが固定であり可変でないという話こそどうでもよい話
本件は>>845氏の指摘する可変なサイズの構造体を作れる話が適切に該当していると思う

860 名前:デフォルトの名無しさん mailto:sage [2022/10/07(金) 21:32:58.03 ID:WQmSj+WJ.net]
>>819と聞いて本人は>>821と答えてるのに
何でそんな解釈を無理やりしてるのかサッパリ分からん



861 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 01:45:23.92 ID:wlHp0G63.net]
>>841
思い出したけど boost::ptr_vector なるものもある

862 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 03:10:20.17 ID:fnM9fLAu.net]
クラスメンバBの初期化が終わる前に、メンバAのコンストラクタにBのアドレスを渡すのって合法ですか?

863 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 08:08:39.60 ID:i+QsN2sY.net]
マルチアレーで思い出したけど、多次元配列クラスのSTL入ってどうなった?
boostとか自作クラスで対応せよってのは暴論だぜ
前者はパフォーマンス微妙だし管理されてない、後者はそれ言うなら何でもそうじゃん

864 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 10:25:38.57 ID:a+ry7eGB.net]
>>851
アドレス渡すだけなら合法
中身触ったら違法

865 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 13:47:19.43 ID:wlHp0G63.net]
>>852
template <typename T, size_t N0, size_t N1>
using multi_array = array <array <T, N0>, N1>;

866 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 14:59:34.51 ID:0p5f7aQJ.net]
>>854
センスね~~~

867 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
>>855
ではセンスある解を!

868 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net]
>>852
std::mdarrayのことなら揉めに揉めて伸びに伸びて今は一応C++26の予定
でもまだグチグチ揉めまくって収拾がつかなそうだからもう無理じゃないかな
代わりにstd::mdspanっていう配列に被せるガワが入りそう

869 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 15:56:11.12 ID:Ys4Rhd8B.net]
各次元の長さが可変で、全添字の走査が速くて、メモリの並びがFortran流かC流か選べるだけで良いのに何を揉める必要があるのか

870 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 16:31:31.20 ID:wlHp0G63.net]
その程度なら自前で直ぐに作っちまいそうだが
標準に入ってることが意味あるんだろうな



871 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 18:03:00.23 ID:Ys4Rhd8B.net]
そりゃそうじゃね
「std::vectorよりも自作の配列クラスの方が優れてる」という主張が本当だったことがない

872 名前:ハノン mailto:sage [2022/10/08(土) 19:46:47.28 ID:WoHyAHa2.net]
>>849
無能君はひっこんでなさい

>>848
ですよね!

873 名前:849 mailto:sage [2022/10/08(土) 20:25:53.87 ID:wHqQf0MD.net]
すいませんでしたw

874 名前:デフォルトの名無しさん mailto:sage [2022/10/08(土) 21:43:59.65 ID:cYIJtZRn.net]
>>862
こちらこそ申し訳ございませんでしたw

875 名前:デフォルトの名無しさん mailto:sage [2022/10/09(日) 00:52:23.28 ID:KNQys/Sq.net]
SIMD まで自分ではやりたくないのでnumpyを呼ぶのほうが早い

876 名前:デフォルトの名無しさん mailto:sage [2022/10/09(日) 17:16:44.85 ID:gpj8txwq.net]
>>864
じゃあ全部Pythonでよくねーか?

877 名前:デフォルトの名無しさん mailto:sage [2022/10/09(日) 20:20:03.73 ID:30oWykTj.net]
>>865
実際自分にとってはそんな感じですね。C++でpython とcudaとかopenmpを糊付けしている感覚があります

878 名前:デフォルトの名無しさん mailto:sage [2022/10/14(金) 19:23:56.82 ID:6Xf8KnhS.net]
>>871
ハッシュテーブルのサイズ、という地雷的制約は好まないのですけれどもね

879 名前:はちみつ餃子 mailto:sage [2022/10/15(土) 03:19:05.65 ID:nP2nOTvD.net]
std::map::operator[] は O(long(N)) のオーダーなんだが、
std::unorderd_map::operator[] のオーダーは平均で O(1) 、最悪で O(N) ということになってんよね。
意図的に最悪を引き当てる、つまり攻撃に晒されるような状況では unorderd_map のほうが不利になる可能性もある。

880 名前:デフォルトの名無しさん mailto:sage [2022/10/15(土) 18:57:25.60 ID:b3v/HVBd.net]
C++の例外処理は、class SomeClass {}; と中身の無いクラスであっても、
throw SomeClass{}; をcatch(SomeClass) {・・・}
で受け取ることが出来るらあしいけど、
どういう仕組みでcatchは、例外の種類を識別してる?
"SomeClass"のようなclass名の文字列のポインタでも一緒に渡している
のだろうか?
typeid(x)は、RTTI(実行時型情報)が必要で、仮想関数が定義されて無いクラス
に対しては上手く働かないのではなかったっけ?



881 名前:デフォルトの名無しさん mailto:sage [2022/10/15(土) 21:57:03.29 ID:QGPaA4bd.net]
まず基本を禿の本でも規格票でも読んで
C++例外処理ってそもそも何ってとこをわかってから
出直したら? そんな有様じゃマトモなレス付かないよ

882 名前:デフォルトの名無しさん mailto:sage [2022/10/15(土) 23:57:29.06 ID:xWZqYwiR.net]
>>869 typeid と同等の情報で照合すれば可能ではあるんだから、何を不思議に思うことがあるのか。
「上手く働かないのでは」なんて言うぐらいならコード書いて確かめればいいだろうし。

883 名前:はちみつ餃子 mailto:sage [2022/10/16(日) 01:59:22.59 ID:SvF0Fhwf.net]
>>869
例外を送出してスタックの巻き戻しをするのは例外を送出する側 (受け取る側ではなく) なんだよ。
つまり送出される例外オブジェクトの型はわかっている。
むしろどこまで巻き戻せばよいか (送出されるオブジェクトの型に対応する catch はどこにあるか) の情報が動的なものだ。

884 名前:デフォルトの名無しさん mailto:sage [2022/10/16(日) 14:48:55.82 ID:pwk0SnpM.net]
メンバ変数をまったく使っていないメンバ関数を見つける方法ってなんかある?
CppCheckとかでできるんだっけ

885 名前:デフォルトの名無しさん mailto:sage [2022/10/16(日) 15:16:25.24 ID:r52/9r+u.net]
まあ普通の静的解析はチェックしてくれるのでは

886 名前:デフォルトの名無しさん mailto:sage [2022/10/16(日) 17:18:37.82 ID:Y43orZLw.net]
>>871
typeidは仮想関数を持っているクラスにしか働かないと思っていたが、
働くのか。

887 名前:デフォルトの名無しさん mailto:sage [2022/10/16(日) 17:21:15.08 ID:Y43orZLw.net]
typeid(x)の返すオブジェクトは完全にtype_info型なのか、
それとも、type_infoを継承したクラスなのか、どっち?

888 名前:はちみつ餃子 mailto:sage [2022/10/16(日) 22:40:17.52 ID:SvF0Fhwf.net]
>>876
std::type_info から派生したクラスであることはあり得る。
https://timsong-cpp.github.io/cppwp/n3337/expr.typeid#1

889 名前:デフォルトの名無しさん mailto:sage [2022/10/17(月) 05:46:15.36 ID:SQKgR2D+.net]
それこそtypeidに聞いてみりゃいい
cout << typeid(typeid(some_one)).name();

890 名前:デフォルトの名無しさん mailto:sage [2022/10/17(月) 22:30:57.72 ID:K/vFJtXQ.net]
T x;
T y;
に対して
x=move(y); //(1)
とした場合、時系列



891 名前:的に
1. move代入演算子 T::operator=(T &&a);がyの中身をxに入れる。但しこれは、2とも
 関連しているがswap(x,y)とされることもある。
 swap(x,y)を使わない場合には、xにyの中身を入れる前に元々の xの中身が削除される。
2. swapを使って無い場合には、続いてmove代入演算子 T::operator=(T &&a);が
 y のポインタメンバなどに null 値を書き込む。
3. (1)の式の最後で、右辺のオブジェクト y に対してデストラクタが呼び出される。
4. デストラクタは、y ポインタメンバが null だと何も行なわない。
 yの中身がxに交換されていた場合は、もともとxの中身だったものを削除する。

というような流れになるという理解で合ってる?
[]
[ここ壊れてます]

892 名前:デフォルトの名無しさん mailto:sage [2022/10/17(月) 23:38:12.11 ID:w3P18B12.net]
実装依存では

893 名前:デフォルトの名無しさん mailto:sage [2022/10/17(月) 23:46:42.02 ID:K/vFJtXQ.net]
>>880
特に確認したいのは、
>3. (1)の式の最後で、右辺のオブジェクト y に対してデストラクタが呼び出される。
の部分。
stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
らしいが、それは常に正しいのかな?

894 名前:デフォルトの名無しさん mailto:sage [2022/10/18(火) 00:25:45.29 ID:FMJmuyaZ.net]
>>881
> stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
> らしいが、それは常に正しいのかな?
そういう型を作ることはできるけど、そんな動作をしたらスコープアウトで走るデストラクタを
止めないといけなくなって非常に使いづらくなる。正しくなさそう。
あなたが何か読み間違えてるものと思われる。

895 名前:デフォルトの名無しさん mailto:sage [2022/10/18(火) 00:27:10.46 ID:LFBcX+LO.net]
>>882
move代入の右辺のオブジェクトは、事後にデストラクタが呼び出される、
と書いてあったと思うが。

896 名前:デフォルトの名無しさん mailto:sage [2022/10/18(火) 03:36:36.81 ID:UO6WFDjC.net]
xの元の中身も適切に破棄されますよっていう話を歪んだ理解してそう

897 名前:デフォルトの名無しさん mailto:sage [2022/10/18(火) 08:32:29.82 ID:GEQmlbnE.net]
>>883
[訂正]
正しくは、
・move代入演算子 T::operator=(T &&a) 自体はデストラクタを呼び出さない。
・x=move(y) と書いたとき、コンパイラが 右辺の y に対してデストラクタを呼び出す。

2つのパターンが有る。パターン1:swapを使う。パターン2:swapを使わない。
いずれにせよ、コンパイラによって y.~T() が呼び出される。

擬似等価コード:
x.operator=(rvalue(y));
y.~T();

パターン1:
T &T::operator=(T &&a) {swap(*this,a); return *this:}

パターン2:
T &T::operator=(T &&a) {thisの中身を削除; aの中身をthisにコピー; aにnull値を書き込む; return *this;}

898 名前:デフォルトの名無しさん mailto:sage [2022/10/18(火) 08:42:53.23 ID:FMJmuyaZ.net]
>>883 あなたの読み間違いではないと主張したいなら出典を挙げられるのがよいかと。

899 名前:はちみつ餃子 mailto:sage [2022/10/18(火) 12:16:32.80 ID:PTXT62EI.net]
>>883
右辺と右辺値を混同しているとかじゃない? 右辺値と右辺値参照も違う概念。

右辺値 (というか prvalue) が完結式の終わりで解体されるのは保証された動作だけど、
std::move でキャストした結果はあくまでも参照を右辺値参照として返すってだけで
元のオブジェクト (この場合は y) は依然として左辺値だよ。
y のデストラクタが呼ばれるのは y のスコープの終わりであることは保証される。

900 名前:デフォルトの名無しさん mailto:sage [2022/10/19(水) 01:49:23.30 ID:ACk8fEyB.net]
>>887
>y のデストラクタが呼ばれるのは y のスコープの終わりであることは保証される。
なるほど。
でも結局、
T x;
T y;
x=move(y); //(1)
と書くと、(1) の部分で、
x.operator=(yを右辺値化したもの); //(2)
が行なわれて、
yの生存期間が終わる地点で、yのデストラクタであるところの y.~T() が呼び出される、
ということになることは間違いなのですね。
つまり、(2)が行なわれたら yはもはやmove後なのだから、yのデストラクタ呼び出しが
省略されるということではなく、yのデストラクタは絶対に必ず呼び出されるわけですね。
だから、T::operator=(T &&a) は、T::operator=(T &&a)の処理が終わった後に、
コンパイラによって yのデストラクタが呼び出されることを前提に処理しなければならない、
ということになる。



901 名前:デフォルトの名無しさん mailto:sage [2022/10/19(水) 02:44:50.18 ID:ACk8fEyB.net]
>>888
誤字訂正です:
誤: ということになることは間違いなのですね。
正: ということになることは間違いないのですね。

902 名前:はちみつ餃子 mailto:sage [2022/10/19(水) 04:13:29.85 ID:CfflWiLk.net]
>>888
そう。 move assignment operator と呼ばれてはいるが
右辺値であるということがわかる以上の違いはない。

ムーブは寿命を左右せず、内容の状態がどうなるかは実装次第。
具体例で言えば std::unique_ptr はムーブ後には空になる (メンバ関数 get は空ポインタを返す) ことが保証されるが、
std::string は (新たな内容が与えられるまでは) 未規定の値になる。

右辺値参照が導入されたのは C++11 からで、
デストラクタのタイミングが変わってしまうような変更を入れられるわけがない。

903 名前:デフォルトの名無しさん [2022/10/19(水) 23:39:12.93 ID:8y/Qrf1S.net]
C++で15年ぶりにプログラミングをすることになったんだけど、
C++11以降のことは何も知らないのでまずは復習もかねて勉強することにした
今でもbjarneの本が初心者にとって一番のテキストなの?
それとももっとシンプルで分かりやすい本が出てるのでしょうか?

904 名前:デフォルトの名無しさん mailto:sage [2022/10/19(水) 23:45:19.38 ID:w93eWlNE.net]
>>890
今考えてみれば、条件分岐の中だけでmove代入される場合も有るからかも知れませんね。

905 名前:デフォルトの名無しさん mailto:sage [2022/10/20(木) 03:01:20.64 ID:3bh5ldea.net]
昔のC++知ってるならとりあえずEffective Modern C++.でいいんじゃないの

906 名前:デフォルトの名無しさん mailto:sage [2022/10/20(木) 06:31:14.16 ID:pIDfWPXL.net]
>>891
本は読者との相性があるから一概には言えないが
俺的にはやっぱ禿の本だな
変に手加減してこないところに安心感がある

ただし「プログラミング言語C++第4版」は
あくまでC++11で、C++14以後には触れていないので
構造化バインディングやコンセプトは学べない
俺はこのあたりはここやQiitaできっかけだけ拾って
あとは規格票やhttps://cpprefjp.github.io/で憶えてる

907 名前:はちみつ餃子 mailto:sage [2022/10/20(木) 13:52:31.60 ID:w/WeLGfC.net]
>>891
C++ はごちゃごちゃした歴史的事情を継ぎ接ぎして出来ているので
説明を整理しようとするとかえって事情がよくわからなくなる。
どう頑張ったってそんなに簡潔にはならんよ。

場当たり的に追加された変則的なルールでも
実際に挙動に絡んでくるのなら知っておくしかしょうがないし、
きちんとした説明はそれなりの分量にもなる。
おそらく >>894 が述べる「変に手加減してこない」というのはそういう意味だと思う。

908 名前:デフォルトの名無しさん mailto:sage [2022/10/20(木) 17:53:11.99 ID:ieIEHaM0.net]
ビャーネの本、章の構成がよく分からんのだけど何がどうしてああなったん

909 名前:デフォルトの名無しさん mailto:sage [2022/10/20(木) 18:26:02.35 ID:zGrDbuOl.net]
昔は、ロベールが鉄板だった

910 名前:デフォルトの名無しさん mailto:sage [2022/10/20(木) 18:47:34.03 ID:sgmqUmRA.net]
bj氏の本のダブルディスパッチの部分と、次のVisitorの部分、
どっちもよく分からなかった。
まず、前者のShape&の引数が何のためにあって、どういう役割を果たしているか
誰か教えて。



911 名前:デフォルトの名無しさん mailto:sage [2022/10/20(木) 18:49:51.30 ID:sgmqUmRA.net]
>>898
プログラミング言語C++第四版 日本語版の
p.653, 22.3.1 ダブルディスパッチの辺りから。
bool intersect(const Shape&);
関数が無くてもこの例だと動作すると思うんだけど、
なんなん?

912 名前:デフォルトの名無しさん mailto:sage [2022/10/20(木) 19:41:09.72 ID:tMcnfqkZ.net]
ダブルディスパッチは勘違いしやすいよね

913 名前:はちみつ餃子 mailto:sage [2022/10/20(木) 23:26:04.47 ID:w/WeLGfC.net]
今でも「ロベールの C++ 入門講座」で学ぼうとしているらしいやつを Teratail や Qiita でたまに見るぞ。

C++03 と C++11 でほとんど互換性は維持されてはいるはずなんだがちょっとは非互換もあるし、
残されている機能でも今となってはあまりお勧めできないということもあるから
なるべくなら新しい本のほうがよいとは思うんだが、
俺自身が読んだことがある本が古すぎていまどきの良い本が全然わからん。

914 名前:はちみつ餃子 mailto:sage [2022/10/20(木) 23:52:16.92 ID:w/WeLGfC.net]
>>899
メンバーアクセス演算子によるメンバの選択は抽象クラスなら動的 (仮想関数テーブルを辿る) だが、
引数を元にしたオーバーロード解決は静的型 (static type) の情報が元になる。

静的型はあくまでも Shape だから一旦は Shape& で受けて
オブジェクトと引数を入れ替えてもういちど intersect を呼び出すことで両方とも動的な型でディスパッチすることになるんだよ。

普通はメンバアクセスの側だけが動的ディスパッチだから二つのオブジェクトについて動的ディスパッチをするには
こういうトリックが必要になる。 ふたつの動的ディスパッチをするからダブルディスパッチなの。

915 名前:デフォルトの名無しさん mailto:sage [2022/10/21(金) 03:42:31.85 ID:sdgXBR6P.net]
>>902
なるほど。
Shape x, y;
x.intersect(y);
とした場合、x の方は仮想関数で振り分けられるけど、yの方はそんな機能が無いから
ということのようですね。

916 名前:デフォルトの名無しさん mailto:sage [2022/10/21(金) 19:14:57.19 ID:RdD+Edtl.net]
>>980
これは分かりにくかったかも知れません。
void func(Shape &a, Shape &b)
{
 x.intersect(y); //(1)
}

Circle c{xxx};
Box b{xxx};
func(c, b);
のような場合に、(1)において、x の部分は仮想関数によってC++のもともとの機能で
実行時の型によって動的に振り分けできるが、y については、仮想関数では
そのような意味では振り分けできないから特殊な方法が必要になる、ということですね。

917 名前:デフォルトの名無しさん mailto:sage [2022/10/22(土) 00:28:36.65 ID:76y4d7LL.net]
>>904
訂正:
誤: void func(Shape &a, Shape &b)
正: void func(Shape &x, Shape &y)

918 名前:デフォルトの名無しさん mailto:sage [2022/10/22(土) 21:57:41.88 ID:Q+2x5vm1.net]
モジュールはヘッダファイル・ソースファイルに代わるものと聞きました
これからは今までインクルードしていたものは全てモジュールにすればよいのでしょうか
また、グローバル変数のみのヘッダファイルや、定数のみのヘッダファイルも
モジュールにした方がよいのでしょうか
ビルド時間が速くなるそうなので気になっています

919 名前:デフォルトの名無しさん mailto:sage [2022/10/22(土) 22:33:36.63 ID:TUU3opDF.net]
>>904
ideone に動くソースを貼ってください、全然意味がわかりません

920 名前:はちみつ餃子 mailto:sage [2022/10/22(土) 22:47:49.35 ID:+VggblGg.net]
>>906
時期尚早だと思う。
現状の gcc ではオプションに -std=c++20 を付けるだけではモジュールは有効にならず、
明示的に -fmodules-ts を付ける必要があるようにしてあるので、普段使いするにはまだ早いという意図を感じる。
ドキュメントにはまだ完璧じゃないと書いてあるし。
(他のコンパイラの状況は知らんけど。)

それに C++20 の段階ではモジュールの基礎の基礎が決まっただけで
標準ライブラリすらモジュールとして再編できていない。 一応は C++23 でやることになってるけど
現在の C++ の規格は三年ごとに話がまとまった分を入れる、
つまり出来てない分を完成させるために期限を延長したりはせず三年後に先送りするという運用なので
C++23 がどこまで出来るものなのか全然わからん。
標準ライブラリを再編していく内にモジュール機能の問題点が発見されたりするかもしれん。

個人的に遊ぶ分には色々とやってみてわかったことはどんどん発信してほしいけど、
製品レベルのプロジェクトではやめておいたほうがいい。



921 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 00:24:14.37 ID:Ti8rkbHi.net]
>>908
msvc2022なら、と思いましたがこちらもモジュールはオプションで試験段階のようでした
もう少しvcの更新を経てから新規の小さいプロジェクトで試してみようと思います []
[ここ壊れてます]

923 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 06:09:10.65 ID:lOKqFCBz.net]
MSは怪しい機能は/std:c++latestにしてるよな

924 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 08:32:09.89 ID:lOKqFCBz.net]
C++17のfilesystemもそうだったけど
練りきれてない未完成品を無理に入れるのやめて欲しい

バグ出ししたいんなら拡張規格かoptionalとして出してみて
標準のmandatoryにするのはしっかり固まってからにしろやって

つーかSTLもboost由来のもISO以外のところでそこそこユーザに揉まれてから来たものだろ
開拓は標準規格の役目じゃねえよ

925 名前:はちみつ餃子 mailto:sage [2022/10/23(日) 10:56:19.39 ID:V+VjUFIF.net]
完璧になるまで練ってたらいつまでも進まんから三年ごとに出来た分を規格に入れるという方針に変更されたんじゃないか。
不格好でも不完全でも今使えることが大事だというのは元々の理念だし。

未完成はともかく欠陥報告を乱発するのは良くはないけどさ。

926 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 11:55:48.92 ID:d3fh3q91.net]
使ってる所だけ直せばいいライブラリと違って(だからって良いわけじゃないけど)
モジュール作り込んでからやっぱdefectでしたって言われたら困るからなあ

927 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 12:11:50.11 ID:ncgNttCh.net]
ライブラリとモジュールの違いって何ですか?

928 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 12:51:46.87 ID:d3fh3q91.net]
使うだけの標準ライブラリと、モジュール自作する時の仕様のつもりだった

929 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 13:12:57.82 ID:HPAI20x7.net]
filesystemって未完成なん?

930 名前:デフォルトの名無しさん [2022/10/23(日) 13:25:59.97 ID:lOKqFCBz.net]
C++17の時点ではfile_clockがなかった



931 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 14:32:45.34 ID:ecBGWNL0.net]
file_time_type があったと思うが

932 名前:デフォルトの名無しさん [2022/10/23(日) 14:45:23.56 ID:lOKqFCBz.net]
あったけど使いものにならんかった

933 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 14:59:53.65 ID:NDMzlX+C.net]
その昔、iostreamというのがあってだな
皆阿鼻叫喚の断末魔の雄叫びを上げたもんじゃった

934 名前:デフォルトの名無しさん [2022/10/23(日) 16:01:34.86 ID:lOKqFCBz.net]
printfやscanfに毒舌三昧してる人に対して持っていた、お暇な方ですねという思いが蘇る

935 名前:はちみつ餃子 mailto:sage [2022/10/23(日) 17:49:58.24 ID:V+VjUFIF.net]
ファイルシステムやらスレッドやらはシステム (OS) 側の都合があるからなぁ。
細かいことは環境依存の機能を使えという前提で
標準ライブラリを最小限にとどめるのは C の時代からの基本的な姿勢だっただろう。

環境依存だからこそ標準で吸収しておいてくれという気持ちもあるし、
現状が良いとも思わんけど…… なんというか……
C++ ってそういうもんだろと思って納得してるから不満には感じないな。

936 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 20:20:25.05 ID:7je1ARgT.net]
iosteamはいかにもC++初心者がやりそうな「オペレータをオーバーロードできるから
見た目イカすちょっとシャレた表記法にしようぜ!!」っていう厨二スピリット全開だったからな
でてきた時点で「あ、これはクソなやつだ」ってわかったよ

937 名前:デフォルトの名無しさん [2022/10/23(日) 20:43:19.02 ID:lOKqFCBz.net]
C with classesを始めようとして
たとえばと始めたことをずいぶん後になって
鬼の首を取ったようにキリッ

938 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 22:04:42.81 ID:d3fh3q91.net]
演算子チェーン自体は別に悪いもんじゃない
iostreamがクソなのはそこじゃない

939 名前:デフォルトの名無しさん [2022/10/24(月) 11:04:17.76 ID:yfd8l8Lke]
https://eraina.web.2nt.com/3.html

940 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 22:42:38.11 ID:9PrlG1Sf.net]
でも競プロで何も考えずにcin >> N >> M;とかできるでしょ



941 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 23:18:01.98 ID:a4G1Se92.net]
なにかとiostream叩かれやすいけど
よく聞いてみると大した批判ではないよね常に
聞くに値するiostream批判ってお目にかからないね

942 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 23:21:04.29 ID:HPAI20x7.net]
iostreamが本当にクソならイカした再実装はあるだろう?
まさかcstdioとか言わんでくれよ

943 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 23:23:02.52 ID:d3fh3q91.net]
まあstd::cout << foo << bar;がつい最近まで規格上未定義動作だったのは擁護のしようがないけどな

944 名前:はちみつ餃子 mailto:sage [2022/10/23(日) 23:33:00.12 ID:V+VjUFIF.net]
iostream が設計された当時は I/O のための専用の言語機能が
必要という論調があって、 Bjarne Stroustrup 氏はそれに抵抗して
当時の C++ の範疇でライブラリを作ったという経緯がある。

ここで抵抗しなければ入出力用の文法が (ライブラリとしてではなく)
言語機能として導入することになっていたかもしれないと思うと
iostream にある粗くらいは許せてしまうなぁ。

少なくとも printf みたいな型チェックがガバガバなのは C++ 的に
放置できなかったし、バッファリングと書式化をまとめつつ拡張やカスタマイズが可能で
I/O 以外も含めてストリームというインターフェイスを一般化するというのは
当時としてはこれ以上考えられない素晴らしいデザインだと思う。

ひとつこれは (iostream 設計当時でも) どうにかできただろうと思うのは
書式の変更 (マニピュレータを使うなど) をしたら陽に戻すまではそのままというのが良くなかった。
スコープを抜けたらリセットできるような方法が標準で欲しかった。
(boost にあったような気がするが名前を忘れてしまった……。)

945 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 23:47:22.83 ID:d3fh3q91.net]
ステートはクソで出来るだけ無くすべきっていう現代の常識が当時はなかったからな
書式をストリームのステートにしてしまったのは今思えば大失敗だがあの時代は自然な設計だったんだろうな

946 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 23:48:05.17 ID:yEdZxD03.net]
>>930 foo, bar がどのように定義されていたらその式が未定義動作になるの?

947 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 23:48:47.26 ID:a4G1Se92.net]
批判する者にその資格が無いってパティーン多々あるよな
iostream批判するやつだって
じゃあどんな素晴らしい入出力ライブラリを用意したの?
実装したの?どこの誰がどれだけ使ってるの?っていう
タダ飯喰らいがかーちゃんのご飯批判してるようなこと

948 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 23:55:56.29 ID:RbY+y3zv.net]
未定義じゃなくて、引数の評価順が未規定だったって話では?

949 名前:デフォルトの名無しさん mailto:sage [2022/10/23(日) 23:56:39.14 ID:d3fh3q91.net]
>>933
何だろうと未定義(C++17以前)。なぜなら一つの式の中でstd::coutを2回変更してるから
(a+=1)+=1とか++(++a)とかも同じ
この大欠陥が見つかったせいで、式の中の評価順は基本コンパイラの好き勝手にしていいというCからの伝統を一部諦める羽目になった

950 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 00:00:00.66 ID:9tRgjj9T.net]
>>936
foo, bar の評価順が未規定だった件を未定義動作と勘違いしてるのか。
https://cpprefjp.github.io/lang/cpp17/expression_evaluation_order.html

cout に対する操作は関数呼び出しの内外の順序付けが入るから未定義動作にはならないよ。



951 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 00:02:05.10 ID:9tRgjj9T.net]
>>936 (a+=1)+=1 も ++(++a) も未定義動作にはならないよ。必ず a が 2 増えて、 a への参照が得られる。

952 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 00:24:37.42 ID:hB4gzcTK.net]
>>936
<<は左から評価じゃね?

953 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 00:26:04.46 ID:hB4gzcTK.net]
もっというと同じ2項演算子が複数でてきたら左から評価では?
数学と同じ

954 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 00:43:11.90 ID:g4dlefHT.net]
cout<<a<<b;
の場合、左結合なので、評価順序は、
(cout<<a)<<b;
となるが、aとbの中に関数や演算子が書いてあるような場合、
それがいつ評価されるのは実装依存だったような気がする。つまり、
operator<<(operator<<(cout,a),b);
みたいに評価はされることは決まっているが、aとbの評価が、aが先かbが先かは
決まってない、というような話。もっと言えば、cout自体の部分が式や関数になって
いる場合も、cout,a,bの評価順序が決まって無いかも。

955 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 00:45:03.87 ID:g4dlefHT.net]
>>941
もっというと、
x+y;
の場合、xとyのどちらが先に評価されるかも決まってない。

956 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 00:54:22.51 ID:etIo9wEk.net]
未規定の動作(unspecified behavior)と未定義動作(undefined behavior)は違うよ

957 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 01:00:58.84 ID:hB4gzcTK.net]
>>941,942
なるほど言わんとしてることは分かったが
左から順に評価するのが当たり前なのでは?
つまりcout, a, bの順

958 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 01:15:48.16 ID:g4dlefHT.net]
>>944
実は、x86などでは、スタックが、メモリーアドレスの大きい方からから小さい方
に成長するようになっているので、引数は右側から左側に評価した方が効率が良い。
そのため、逆さまに評価する処理系があっても不思議ではない。

959 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 01:33:32.70 ID:1OFaOw+N.net]
ちょっと前までの規格では単一式(≒セミコロンとセミコロンの間)の中の評価順は基本的にコンパイラが好き勝手に弄る事が許されてた
例えばa[++b]=cとかはヒトの常識的にはbをインクリメントしてからa[b+1]にcを代入するけど、別にa[b+1]にcを代入してからbを増やしたって構わない(この前のどっかでa[b+1]を参照してればその方が最適化したら効率的かもしれない)
そんな感じで最適化に都合がいいように評価順には寛容すぎるほど寛容だったんだが、カオスを防ぐためのルールがあって、それが「単一式で同じオブジェクトを2回変更したら未定義」というもの
例えば(a+=1)+=1はどっちの1を先にaに足してもいいが、そういう自由度がある時点で未定義というルールになっていた
もっと分かりやすい例だと(a+=2)*=3は最初のaが1なら常識的には9になると思うけど、評価順ルール的には3を先に掛けてから2を足して5にしたっていい
9か5の二択で済むこれはマシな方で、ポインタが絡むと収拾がつかなくなるから、同じもん2回以上書き換えたらもう知らん未定義じゃってのがCとちょい前までのc++の規格の趣旨だった

で、この話をさっきのiostreamに持ち込むと、operator <<はconstメンバー関数じゃないので、cout << foo << barはcout << fooと、(cout<<fooの戻り値==coutの参照) << barの2回のcoutへの変更を順序は不確定な単一式でやってることになる。つまりさっきのaと同じように未定義動作って事
(cout <<fooを先に実行しないと戻り値確定しないからこっちが先に決まってるのでは?と思うだろうけど、規格の文言上はcout <<fooの戻り値を「予測」して<<barの適用を先にやったって構わないのである。そんな病的なコンパイラがたまたま実在しなかったから今まで問題にならなかったんだろうけどね)

という話がrangesのパイプでoperator|のチェーンの検討をしてるときに発覚してみんな真っ青になって慌てて評価順のルールが見直されたっていう、まあアホ臭い話でした
幸い病的な最適化コンパイラが生まれる前だったから規格文言だけの話で実害はない

960 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 01:59:23.78 ID:hB4gzcTK.net]
aが1のとき(a+=2)*=3が5に成り得たと書いているがほんまかいな?



961 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 02:10:09.65 ID:JEuztk1D.net]
9か5かってのは説明上の話で、実際は未定義で鼻から悪魔だから9でも5でも0でも-1でも42でも4394967295でもどんな可能性もあった
今の規格では必ず9になった

962 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 02:11:12.04 ID:b0depGja.net]
https://ja.cppreference.com/w/cpp/language/eval_order
スカラーオブジェクトに対する変更にしかUB関係なくね?

963 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 02:19:24.78 ID:od8Ytdiw.net]
operator<<が触ってるcoutのメンバ変数やグローバル変数にスカラーオブジェクトが一切含まれてなければ関係ないけど普通はそんなはずは無い

964 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 07:45:35.99 ID:bUVy0t4Y.net]
テキストがバラけたり変数の並び順を変えられなくてi18n対応が困難になるのがiostreamの一番の問題かな

965 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 08:12:37.76 ID:OQANp5iI.net]
>>946
実際どっちが正しいかは知らんが説明がよくわからん。
cout << foo << bar の例えに (a+=2)*=3 を持ってくるのは正しいのか?

966 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 09:31:36.65 ID:9tRgjj9T.net]
>>946
> それが「単一式で同じオブジェクトを2回変更したら未定義」というもの

C++11 より前のシーケンスポイント(副作用完了点よるルールの話だとしても関数呼び出しの前後には
シーケンスポイントが入るので cout の operator<< で未定義動作が起こるような話にはならない。

967 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 09:49:55.97 ID:9tRgjj9T.net]
>>946
「rangesのパイプでoperator|のチェーンの検討をしてるとき」とか言ってるから
本気で C++17 改定前の話をしてるっぽいなぁ。

> それが「単一式で同じオブジェクトを2回変更したら未定義」というもの
ここから間違い。 C++11 以降は "sequenced before" の順序関係に基づくルールになっていて、
そんな大雑把なルールではない。

> 例えば(a+=1)+=1はどっちの1を先にaに足してもいいが、そういう自由度がある時点で未定義というルールになっていた
C++11 時点で代入式の値取得は代入より後になると規定されているよ。
https://timsong-cpp.github.io/cppwp/n3337/expr.ass#1
> In all cases, the assignment is sequenced after the value computation of
> the right and left operands, and before the value computation of the assignment expression.

関数呼び出し前後に順序関係もある。
https://timsong-cpp.github.io/cppwp/n3337/intro.execution#15
> When calling a function (whether or not the function is inline), every value
> computation and side effect associated with any argument expression,
> or with the postfix expression designating the called function, is sequenced before
> execution of every expression or statement in the body of the called function.

968 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 23:16:53.41 ID:Fd/xLFmz.net]
どなたか、clangコンパイラのソースコードで、main()関数がどのソースファイル
にあるか分かりませんか?

969 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 23:38:51.20 ID:uNnUskRf.net]
grepで始めよう
新しい検索を

970 名前:デフォルトの名無しさん mailto:sage [2022/10/24(月) 23:50:22.01 ID:Fd/xLFmz.net]
>>956
もちろんgrepはしていますが、
test用のソースコードなどに大量に出てきてしまうのでどれか分からないのです。
探しているのですが、むしろ、clangコンパイラ自体のmain関数は存在して
無いのではないかと思えてしまいます。



971 名前:デフォルトの名無しさん [2022/10/25(火) 00:20:05.85 ID:ALWiFOZj.net]
>>957
grepでtestっぽいのを除外していけば見つけられると思うけど、
スマホでgithub見た感じdriver/tools/driver.hppじゃね

972 名前:デフォルトの名無しさん [2022/10/25(火) 00:20:30.61 ID:ALWiFOZj.net]
まちがえたdriver.cppね

973 名前:デフォルトの名無しさん [2022/10/25(火) 15:32:20.93 ID:VfaC5Wzc.net]
このコードでfunc(a)だけがコンパイル通らないんだけどどう対策すれば綺麗な感じになる?
ユニバーサル参照の受け取りのとこでT=int&がstd::integralを満たさないのが原因なんだけど

integral_or_lrefコンセプト作るしかない?

#include<utility>
#include<concepts>
template<std::integral T>
void func(T&&);

int main(){
int a=0;
func(0);
//func(a);
func(std::move(a));
}

974 名前:デフォルトの名無しさん [2022/10/25(火) 15:33:30.00 ID:Ct0eul8Q.net]
超初心者+わかりにくい文章で、ごめんなさい。
今までは、.NetFramewor4.72でWinFormを使って実装していました。

今、.Net6.0 の WinFormで実装する必要が出てきたので

.Net6.0 で実装しています。
.NetFramewor4.72 でWindowsBaseの参照の追加で使えていた
System.Windows.Threading.Dispatcher が

.Net6.0 では、「依存関係」の「COM」で設定しようとしても、
WindowsBaseが表示されず、WindowsBaseを設定できなくて
System.Windows.Threading.Dispatcherが使えなくて、困っています。
同じような課題を諸先輩方は
どのように解決されましたか?

975 名前:デフォルトの名無しさん [2022/10/25(火) 15:37:45.19 ID:VfaC5Wzc.net]
>>961
C#はこっちで
https://mevius.5ch.net/test/read.cgi/tech/1639965805/

976 名前:デフォルトの名無しさん mailto:sage [2022/10/25(火) 15:39:23.68 ID:Yrt8fN18.net]
CLIはこっちか?

977 名前:はちみつ餃子 mailto:sage [2022/10/25(火) 15:54:18.45 ID:kIG3TWOj.net]
>>960
参照を剥がすのを入れるのが常道じゃないかな?

template<class T>

requires std::integral<std::remove_reference_t<T>>

void func(T&&);

978 名前:デフォルトの名無しさん [2022/10/25(火) 16:15:10.24 ID:2SxwmPby.net]
>>962
大変失礼しました。
アドバイスありがとうございます。

979 名前:デフォルトの名無しさん mailto:sage [2022/10/25(火) 18:06:59.76 ID:NHQVrZyF.net]
そういうとき脳死でstd::decay使っちゃうけどあんま行儀良くないかな

980 名前:デフォルトの名無しさん mailto:sage [2022/10/25(火) 18:13:31.96 ID:UwkZi3XT.net]
>>958
ありがとう。関数名が main() ではなく、
clang_main()
なんですね。
cmakeすると、これがすぐ呼び出されるような main() 関数が
作られるようです。
cmakeがどういう仕組みでそうやっているのかは分かりませんが。



981 名前:デフォルトの名無しさん mailto:sage [2022/10/25(火) 18:15:07.22 ID:UwkZi3XT.net]
>>958
古いWzEditorのgrepを使ってるんですけど、除外フォルダが指定できないんです。
何かいい方法は有りますかね。

982 名前:デフォルトの名無しさん mailto:sage [2022/10/25(火) 20:38:52.33 ID:m6AygvvN.net]
どっちかってーと リンカで実行時のエントリポイントを細工してるんじゃないのかな?

983 名前:デフォルトの名無しさん mailto:sage [2022/10/26(水) 01:01:19.91 ID:lrkwz/4D.net]
追加質問です。
llvm のソースの中に、以下の様に、
配置 new に似ていてもそれとは違うような new 演算子の使用方法が
有りますが、分かる人いますか? 例えば、
new (2) CatchReturnInst(CatchPad, BB, InsertBefore);
は、配置 new の new (p) T(引数列) に似ていますが、
p の位置は、アドレスを指定することになっているのに、
「2」という整数値を指定しています。

llvm-project-main/llvm/include/llvm/IR/Instructions.h

class CatchPadInst : public FuncletPadInst {・・・}
の中の
 static CatchPadInst *Create(Value *CatchSwitch, ArrayRef<Value *> Args,
               const Twine &NameStr = "",
               Instruction *InsertBefore = nullptr) {
  unsigned Values = 1 + Args.size();
  return new (Values)
    CatchPadInst(CatchSwitch, Args, Values, NameStr, InsertBefore);
 }

class CatchReturnInst : public Instruction {・・・}
の中の
 static CatchReturnInst *Create(Value *CatchPad, BasicBlock *BB,
                 Instruction *InsertBefore = nullptr) {
  assert(CatchPad);
  assert(BB);
  return new (2) CatchReturnInst(CatchPad, BB, InsertBefore);
 }

984 名前:はちみつ餃子 mailto:sage [2022/10/26(水) 01:03:41.11 ID:UI6BPQPg.net]
>>970
placement new だろ。

985 名前:デフォルトの名無しさん [2022/10/26(水) 01:09:20.17 ID:AzbtQsoy.net]
>>967
ごめん、tools/driver/driver.cppだった。321行目

986 名前:あたりにmainあるけどこれじゃないの?
>>968
msysとかgit bashとかwslのgrepを使う、じゃダメ?vscodeでも除外設定はできるけど
[]
[ここ壊れてます]

987 名前:デフォルトの名無しさん mailto:sage [2022/10/26(水) 01:53:26.73 ID:U/bwzoe1.net]
>>971
以下の様に、new (Us) CatchReturnInst(引数列)は、
Userクラスの operator new(Size, Us) を使っていて、
で、Usには、アドレス値ではなく、Use 型の個数を入れるようです。
通常の operatoe new()では、第二引数はアドレス値です。

class CatchReturnInst : public Instruction {・・・};
class Instruction : public User,
public ilist_node_with_parent<Instruction, BasicBlock> {・・・};

void *User::operator new(size_t Size, unsigned Us) {
return allocateFixedOperandUser(Size, Us, 0);
}

void *User::operator new(size_t Size, unsigned Us, unsigned DescBytes) {
return allocateFixedOperandUser(Size, Us, DescBytes);
}

void *User::allocateFixedOperandUser(size_t Size, unsigned Us,
unsigned DescBytes) {
・・・
uint8_t *Storage = static_cast<uint8_t *>(
::operator new(Size + sizeof(Use) * Us + DescBytesToAllocate));
・・・
}

988 名前:デフォルトの名無しさん mailto:sage [2022/10/26(水) 01:56:10.10 ID:U/bwzoe1.net]
>>972
>ごめん、tools/driver/driver.cppだった。321行目あたりにmainあるけどこれじゃないの?
そのサイトは、mirrorサイトで「legacy」とされ、だいぶ古いバージョンなんです。
最新バージョンのソースでは、driver.cpp には clang_main()しかないと思います。
cmakeすると、buildフォルダに、
int main(int argc, char *argv[]) { return clang_main(argc, argv); }
のような一行の関数が出来ます。

989 名前:デフォルトの名無しさん mailto:sage [2022/10/26(水) 02:33:27.35 ID:U/bwzoe1.net]
>>974
(1) 本当の clang の main() 関数本体 :
(llvm-project-main/clang/tools/driver/driver.cpp):

int clang_main(int Argc, char **Argv) {
・・・
・・・
}

(2) clang_main() を呼び出す main() 関数 :
(llvm-project-main/build/tools/clang/tools/driver/clang-driver.cpp):

build は、cmake の destination ディレクトリです。


int clang_main(int argc, char **argv);

int main(int argc, char **argv) { return clang_main(argc, argv); }

↑本当にこんな風に一行の関数になっています。恐らく、cmake が
生成したものと思われます。

990 名前:デフォルトの名無しさん [2022/10/26(水) 09:07:24.21 ID:AzbtQsoy.net]
>>974-975
なるほどすまんかった。
たまたま古いソースをみてたからmainを見つけられたんだね。勉強になりました。



991 名前:デフォルトの名無しさん [2022/10/26(水) 09:39:06.48 ID:8n8wOLOb.net]
>>964
やはりrequiresを1行足すしかないか...

template<allow_ref<std::integral> T>
void func(T&&);

とでも書きたかったけど、コンセプトを受け取るテンプレートが書けないっぽいから諦めた

992 名前:デフォルトの名無しさん mailto:sage [2022/10/27(木) 02:01:40.47 ID:XIiqnbUh.net]
clangのソースで、CPUのマシン語を生成している場所を調べていて、
X86AsmPrinter クラスや X86MCInstLower クラスがそれに強く関与していることが分かって
きました。
X86AsmPrinter クラスや X86MCInstLower クラスは、お互いに参照されてますが、
この2つのクラスは、いずれも「作られている場所」が見つかりません。
「作られている」とは、new X86AsmPrinter や、X86AsmPrinter a;、
new X86MCInstLower や X86MCInstLower b; のようにしている場所です。
どなたか分かりませんか?

993 名前:デフォルトの名無しさん mailto:sage [2022/10/27(木) 02:32:01.95 ID:XIiqnbUh.net]
>>978
すみません、多分、以下の部分ですね。
これで、new X86AsmPrinterしたアドレスを、getTheX86_32Target()やgetTheX86_64Target()
が返した Target クラスのシングルトンのインスタンス xxx に対して
xxx.AsmPrinterCtorFn = アドレス;
のように記録しているようです。

extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86AsmPrinter() {
RegisterAsmPrinter<X86AsmPrinter> X(getTheX86_32Target());
RegisterAsmPrinter<X86AsmPrinter> Y(getTheX86_64Target());
}

template <class AsmPrinterImpl> struct RegisterAsmPrinter {
RegisterAsmPrinter(Target &T) {
TargetRegistry::RegisterAsmPrinter(T, &Allocator);
}
private:
static AsmPrinter *Allocator(TargetMachine &TM,
std::unique_ptr<MCStreamer> &&Streamer) {
return new AsmPrinterImpl(TM, std::move(Streamer));
}
};
/// TargetRegistry - Generic interface to target specific features.
struct TargetRegistry {
・・・
static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
T.AsmPrinterCtorFn = Fn;
}
・・・
};

994 名前:デフォルトの名無しさん mailto:sage [2022/10/27(木) 02:43:40.35 ID:InDGsMhW.net]
なんかコンセプト以前にテンプレートにもあまり慣れてなさそう

995 名前:デフォルトの名無しさん mailto:sage [2022/10/27(木) 02:44:18.56 ID:XIiqnbUh.net]
間違えました。
xxx.AsmPrinterCtorFn に登録しているのは、new X86AsmPrinterの
アドレスではなく、
RegisterAsmPrinter<X86AsmPrinter>::Allocator(・・・)
のアドレスのようですね。
そして、このAllocator (==関数)を呼び出すと、new X86AsmPrinter
を行なえるようです。

996 名前:デフォルトの名無しさん mailto:sage [2022/10/27(木) 08:37:49.38 ID:yP/aIJbf.net]
関係ないけどあんまりnewせんほうがええよ
それしかないと思ってるならちょっと古い感じ

997 名前:デフォルトの名無しさん mailto:sage [2022/10/27(木) 22:03:08.74 ID:+UGgATct.net]
あんまりデータメンバに直アクセスしないほうがええよ
あんまりグローバル変数使わんほうがええよ
あんまりSendMessageを直に使わんほうがええよ
あんまりナマポ使わんほうがええよ
あんまりアセンブラ使わんほうがええよ
あんまりC++使わんほうがええよ

ラップしろってことだろうけど
一切離れたやつはもうC++使いじゃない

998 名前:デフォルトの名無しさん mailto:sage [2022/10/28(金) 00:40:37.68 ID:sQHy7sst.net]
>>982
イリノイ大学のclangやLLVMの開発者に言ってください。
コンパイラでは最先端かも知れませんが。

999 名前:デフォルトの名無しさん mailto:sage [2022/10/28(金) 08:56:31.64 ID:+oOKe7Yr.net]
可変長テンプレートはじみて使ったけど便利だなこれ

1000 名前:デフォルトの名無しさん mailto:sage [2022/10/28(金) 09:06:12.57 ID:kPJo8naK.net]
threadがあんなに使いやすくなっているのは
ひとえにtemplate-parameter-packのおかげ



1001 名前:デフォルトの名無しさん mailto:sage [2022/10/29(土) 23:34:49.08 ID:Ank2ZEY0.net]
>>946の話は終わりかな?
レスついたけど反論がないようだけど

1002 名前:デフォルトの名無しさん mailto:sage [2022/10/30(日) 03:51:06.75 ID:i1fpLCEI.net]
5ch始めたばかりなのかな?

1003 名前:デフォルトの名無しさん mailto:sage [2022/10/30(日) 11:42:15.05 ID:/mJPvv5N.net]
気になるじゃん

1004 名前:デフォルトの名無しさん mailto:sage [2022/10/30(日) 15:52:08.41 ID:zpZIwFpu.net]
仕事ハネた後のヨレヨレ状態で見てるから
長文()を読もうとすると寝落ちしかねない

1005 名前:デフォルトの名無しさん [2022/10/31(月) 13:27:29.89 ID:Q1JWQuIa.net]
VC++ や GCC で <cstddef> をインクルードすると、
std の明⽰的修飾、using 宣言、using 指令がなくても
size_t が使えるのですが、これは C++ 標準の仕様ですか?

1006 名前:はちみつ餃子 mailto:sage [2022/10/31(月) 13:53:23.25 ID:HpV/6ZOj.net]
>>991
いいえ。 未規定です。
std 名前空間内で定義されることは当然に保証された動作ですが、
グローバルには定義されてもされなくてもかまいません。
逆に言えばグローバルに定義されていることはありうると想定する必要があります。
(なので自分が定義する名前がそれに衝突しないようにするべきです。)

1007 名前:デフォルトの名無しさん mailto:sage [2022/10/31(月) 13:55:26.92 ID:cQbFxG4K.net]
size_tを知らんでもsizeofは使える?

1008 名前:はちみつ餃子 mailto:sage [2022/10/31(月) 14:17:38.34 ID:HpV/6ZOj.net]
>>992 の根拠
https://timsong-cpp.github.io/cppwp/n3337/headers#4

1009 名前:デフォルトの名無しさん mailto:sage [2022/10/31(月) 14:31:14.54 ID:J5sgTSch.net]
C++相談室 part162
https://mevius.5ch.net/test/read.cgi/tech/1667194175/

1010 名前:デフォルトの名無しさん mailto:sage [2022/10/31(月) 14:31:53.89 ID:J5sgTSch.net]
立てました



1011 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 162日 17時間 8分 25秒

1012 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<290KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef