前スレ
C++相談室 part160
https://mevius.5ch.net/test/read.cgi/tech/1649979572/
探検
C++相談室 part161
レス数が1000を超えています。これ以上書き込みはできません。
2022/05/21(土) 21:23:29.59ID:kYXfaM+5
2022/05/21(土) 21:44:08.96ID:G0xPeqqL
C(ちんちん)+(ぷら)+(ぷら)
2022/05/22(日) 00:57:58.97ID:SQ8NOhuX
おいおいまだ続けんのかよ!
2022/05/22(日) 03:20:20.13ID:sZoQvYay
ODRってC++処理系の仕様?
処理系はODRの記述を含まない仕様だけあればその通り作ったら
合理的な手間で検知可能な範囲のODR違反コードをエラーにする
ふるまいになるというのが当然で、つまりODRは仕様の結果であってODRを仕様に含めるのは論理的に冗長という印象
どっちかというとODRは正しく動くためにプログラマーが従わねばならないルール、という認識やったわ、
この観点ではinlineがODRの例外というのは例外も糞もなくてそんなプログラムは書いたらあかんからODR違反
コンパイラが合理的な手間でそれを検出できなかったり、それがあってもコードの動きに破綻が無いこととは関係無い
的な、
処理系はODRの記述を含まない仕様だけあればその通り作ったら
合理的な手間で検知可能な範囲のODR違反コードをエラーにする
ふるまいになるというのが当然で、つまりODRは仕様の結果であってODRを仕様に含めるのは論理的に冗長という印象
どっちかというとODRは正しく動くためにプログラマーが従わねばならないルール、という認識やったわ、
この観点ではinlineがODRの例外というのは例外も糞もなくてそんなプログラムは書いたらあかんからODR違反
コンパイラが合理的な手間でそれを検出できなかったり、それがあってもコードの動きに破綻が無いこととは関係無い
的な、
2022/05/22(日) 09:08:20.74ID:1lbS1FjX
ちんちん!シュッ!シュッ!シュッ!
7はちみつ餃子 ◆8X2XSCHEME
2022/05/22(日) 09:12:58.50ID:9X/55aF0 >>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 と書いてある部分については (可能であれば処理系も検出するけど) どちらかというとユーザに対する要求というニュアンスはあるかも。
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.24ID:WUnKKX5R 有料無料関係なしで最高のIDEってなに?
9ハノン ◆QZaw55cn4c
2022/05/22(日) 19:52:14.59ID:rj0GqvkC >>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インライン関数の本体内の文字列リテラルは、異なる翻訳単位で同じオブジェクトを指す。
>インライン関数は同じアドレスを持つ (事実上統合することの要求)
それはもうインラインではないですね…
そうではなくて、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はちみつ餃子 ◆8X2XSCHEME
2022/05/22(日) 20:04:27.44ID:9X/55aF02022/05/22(日) 20:07:42.95ID:ZvvsRMN9
12はちみつ餃子 ◆8X2XSCHEME
2022/05/22(日) 20:15:45.42ID:9X/55aF0 >>8
人によって使いやすさって違うからアドオンとかドキュメントの量とかが重要になってくるんだよ。
いくら潜在的に良い出来栄えであってもちょっとしたカスタムを全部自分で書かなきゃならないようでは面倒くさすぎる。
どこをどういじればいいのかいちいちソースコードを見ないとわからないのではダルい。
なんだかんだ不満があってもユーザ人口の多いものは全体としては良い選択になりがち。 物量重要。
人によって使いやすさって違うからアドオンとかドキュメントの量とかが重要になってくるんだよ。
いくら潜在的に良い出来栄えであってもちょっとしたカスタムを全部自分で書かなきゃならないようでは面倒くさすぎる。
どこをどういじればいいのかいちいちソースコードを見ないとわからないのではダルい。
なんだかんだ不満があってもユーザ人口の多いものは全体としては良い選択になりがち。 物量重要。
2022/05/22(日) 20:19:45.26ID:sBUJB3wj
vs以外だとIDEっていうよりエディタとコマンドでやってるイメージ
ボーランドとか死にかけだしなあ
ボーランドとか死にかけだしなあ
15デフォルトの名無しさん
2022/05/22(日) 20:37:44.89ID:WUnKKX5R2022/05/22(日) 20:39:19.63ID:rj0GqvkC
17はちみつ餃子 ◆8X2XSCHEME
2022/05/22(日) 20:50:26.55ID:9X/55aF02022/05/22(日) 22:42:48.81ID:rj0GqvkC
>>17
なるほど。私の元の主張に反するのですが、規格上はそのように誘導されてしまうのですね…‥(呆然)
なるほど。私の元の主張に反するのですが、規格上はそのように誘導されてしまうのですね…‥(呆然)
2022/05/22(日) 22:53:10.16ID:j/hmX3ds
www.youtube.com/watch?v=uaUmAUMvs2o
20デフォルトの名無しさん
2022/05/28(土) 13:34:18.53ID:kIghR+Cp C++入門書でオススメがあったら教えてください
2022/05/28(土) 13:51:21.59ID:y4EmUyIA
昔からC++を使ってる人が多いから最近の入門書なんて誰も知らん
https://cppmap.github.io/learn/books/
https://cppmap.github.io/learn/books/
22デフォルトの名無しさん
2022/05/28(土) 14:07:22.40ID:kIghR+Cp >>21
多謝多謝!
多謝多謝!
2022/05/28(土) 15:19:08.43ID:72vE6z5l
禿本の5、来ないね・・・
24はちみつ餃子 ◆8X2XSCHEME
2022/05/28(土) 15:44:53.73ID:IqCM7SI4 C++ はそれなりに歴史が長いから仕様も変わってるし思想や習慣の変化もある。
上述で私は「inline は ODR の例外の意味!」と主張したけどさ、 D&E を読むと (inline 指定導入初期の判断としては)
「コンパイラによるインライン化の判断がザコなので指定できるようにした」
という意味のことを書いてあって、大元はやっぱりインライン化の指定なんだよね……。
色んな事情が絡むし、単純に C++ が巨大なのでどうせ一冊でちゃんとした理解にはならないと思う。
適当なやつをどれから読み始めてもいいんじゃないかね。
まあ、あまり古い奴は避けた方がよいだろうというのが最低限の基準かな。
上述で私は「inline は ODR の例外の意味!」と主張したけどさ、 D&E を読むと (inline 指定導入初期の判断としては)
「コンパイラによるインライン化の判断がザコなので指定できるようにした」
という意味のことを書いてあって、大元はやっぱりインライン化の指定なんだよね……。
色んな事情が絡むし、単純に C++ が巨大なのでどうせ一冊でちゃんとした理解にはならないと思う。
適当なやつをどれから読み始めてもいいんじゃないかね。
まあ、あまり古い奴は避けた方がよいだろうというのが最低限の基準かな。
2022/05/28(土) 16:12:25.28ID:m/lYnlWz
C 言語でなぜかC++のコメント行がいつの間にか許されている不思議
2022/05/28(土) 16:25:05.55ID:gMoQJtfo
なぜかってC99でサポートされたからではなくて?
27デフォルトの名無しさん
2022/05/28(土) 17:21:17.26ID:DrsyU/Zk 違うでしょうなあ。
2022/05/28(土) 19:31:09.65ID:72vE6z5l
> いつの間に
情弱からはこう見えるようだな
情弱からはこう見えるようだな
29ハノン ◆QZaw55cn4c
2022/05/28(土) 20:36:31.97ID:HcUv+Nxj2022/05/31(火) 21:24:16.90ID:YEMisgK+
このコードがコンパイルできないんだけど、なんで?
struct hoge {
std::map<int, std::unique_ptr<struct hoge>> m = {};
void x() {
struct hoge &r = *this;
r = *(m.begin()->second.get()); // ここがまずい
}
};
struct hoge {
std::map<int, std::unique_ptr<struct hoge>> m = {};
void x() {
struct hoge &r = *this;
r = *(m.begin()->second.get()); // ここがまずい
}
};
2022/05/31(火) 21:37:16.47ID:Cpwrpvdc
コピーコンストラクタが呼ばれて、最終的にmapのunique_ptrがコピーできないってことか。。。
C++98の人間だし10年以上離れてたから最近のC++まったくわからんわ・・・
C++98の人間だし10年以上離れてたから最近のC++まったくわからんわ・・・
2022/05/31(火) 21:49:44.41ID:prs/eEEO
33蟻人間 ◆T6xkBnTXz7B0
2022/05/31(火) 22:00:19.02ID:eSF5ElRz rは*thisの別名。
*thisの所有物を*thisにコピー。だめ。
*thisよりも高位じゃないと。。。
*thisの所有物を*thisにコピー。だめ。
*thisよりも高位じゃないと。。。
34はちみつ餃子 ◆8X2XSCHEME
2022/05/31(火) 22:30:18.12ID:+LJ4L5Ht 根拠。
https://timsong-cpp.github.io/cppwp/n3337/container.requirements#tab:containers.allocatoraware
コンテナを代入するとき、コンテナの要素の型は CopyAssignable であり、
コンテナに対して CopyInsertable であることを要求する。
https://timsong-cpp.github.io/cppwp/n3337/container.requirements#tab:containers.allocatoraware
コンテナを代入するとき、コンテナの要素の型は CopyAssignable であり、
コンテナに対して CopyInsertable であることを要求する。
2022/05/31(火) 23:45:41.75ID:xnVZpK0y
>>(前スレ)695
のFFTで2^(2^34)-1を計算する奴
https://ideone.com/xSaa6x
を倍速で動くようにしたったわ……!
↓↓↓
https://ideone.com/q0O74K
オリジナルが2200秒なところを962秒で計算完了
出力結果は一致
メモリ消費量はオリジナルと同等(完全in-place、sinテーブルは1GB(計算時間と誤差が劣化するがシュリンク可能))
のFFTで2^(2^34)-1を計算する奴
https://ideone.com/xSaa6x
を倍速で動くようにしたったわ……!
↓↓↓
https://ideone.com/q0O74K
オリジナルが2200秒なところを962秒で計算完了
出力結果は一致
メモリ消費量はオリジナルと同等(完全in-place、sinテーブルは1GB(計算時間と誤差が劣化するがシュリンク可能))
2022/05/31(火) 23:48:59.95ID:xnVZpK0y
さすがに天才の漏れも三角関数って何だっけというあたりからスタートしたので
日数がかかってしまったが、いまやバッタフライ演算を完全に理解したから
純アルゴリズム的には最善の実装になっていると言える(希ガス、
(参考)
基礎からの周波数分析(9)-「高速フーリエ変換(FFT)」
https://www.onosokki.co.jp/HP-WK/eMM_back/emm140.pdf
あとはメモリアクセスの時間局所性を改善して1000倍にする、
日数がかかってしまったが、いまやバッタフライ演算を完全に理解したから
純アルゴリズム的には最善の実装になっていると言える(希ガス、
(参考)
基礎からの周波数分析(9)-「高速フーリエ変換(FFT)」
https://www.onosokki.co.jp/HP-WK/eMM_back/emm140.pdf
あとはメモリアクセスの時間局所性を改善して1000倍にする、
2022/06/01(水) 00:23:05.24ID:0xwrfx4r
こういうのに燃えてるような人が日本を支えていたのかもな
38デフォルトの名無しさん
2022/06/01(水) 07:38:09.36ID:g+4BWW21 過去形でワロタ
2022/06/01(水) 08:08:59.08ID:X1odZl5o
スペアナ以外に使い道あるのか
2022/06/01(水) 09:38:46.33ID:0/3ltNwW
2022/06/01(水) 10:00:14.05ID:vvQTEkHX
>>36
漏れや希ガスというタイポや、バタフライ演算とかいう大学2年の信号処理の課題で出る程度のアルゴリズムを自信満々に書いちゃうあたり、かわいそうな人なのかな
漏れや希ガスというタイポや、バタフライ演算とかいう大学2年の信号処理の課題で出る程度のアルゴリズムを自信満々に書いちゃうあたり、かわいそうな人なのかな
2022/06/01(水) 10:09:19.65ID:IxX6jh1U
その辺はタイポじゃなくて20年近く前の2ch語なのじゃ……
イタいことには変わりないが
イタいことには変わりないが
2022/06/01(水) 10:31:05.57ID:RHCtS9cS
41がむしろ異常にみえる
2022/06/01(水) 10:39:26.49ID:m3Paz3vX
最近は大学2年で信号処理やってるのかい?
2022/06/01(水) 11:39:44.35ID:vvQTEkHX
>>44
うちは二年前期の専門科目だった
うちは二年前期の専門科目だった
2022/06/01(水) 11:40:41.11ID:XFKMacmT
>>43
どう異常に見えるのか書いてない時点で…
どう異常に見えるのか書いてない時点で…
2022/06/01(水) 13:51:18.40ID:pJ9e03Xl
template <class T> void F(const T &t){ auto x = t; }
って関数があった場合、autoで推論(導出?)されるxの方はconst T&になるの?
ついでにここらへん分かりやすい資料があったら教えてほしい。
って関数があった場合、autoで推論(導出?)されるxの方はconst T&になるの?
ついでにここらへん分かりやすい資料があったら教えてほしい。
48はちみつ餃子 ◆8X2XSCHEME
2022/06/01(水) 14:22:19.84ID:YMgHeGpL >>47
テンプレートの実引数推論と同じ規則が適用される。
つまり
template<class U> void foo(U u);
というテンプレートが仮にあったとして、これに
foo(t);
としたときの U の型がその場合の x の型になる。
故に x の型は T であって const も参照もつかない。
テンプレートの実引数推論と同じ規則が適用される。
つまり
template<class U> void foo(U u);
というテンプレートが仮にあったとして、これに
foo(t);
としたときの U の型がその場合の x の型になる。
故に x の型は T であって const も参照もつかない。
49デフォルトの名無しさん
2022/06/01(水) 22:01:40.23ID:g+4BWW21 auto&にすればconst参照も推論されるし、右辺値も取り得るならauto&&にしておけば間違い無いんだっけ
50はちみつ餃子 ◆8X2XSCHEME
2022/06/01(水) 22:56:35.59ID:YMgHeGpL auto& x = t;
と書いた場合には上述 (>>48) の規則に当てはめると
template<class U> void foo(U& u);
と同等の推論をするし、
auto&& x = t;
と書いた場合には
template<class U> void foo(U&& u);
と同じ推論になるわけだね。
と書いた場合には上述 (>>48) の規則に当てはめると
template<class U> void foo(U& u);
と同等の推論をするし、
auto&& x = t;
と書いた場合には
template<class U> void foo(U&& u);
と同じ推論になるわけだね。
2022/06/02(木) 02:04:50.78ID:uWYOiZpw
じゃぁ、あらゆる場面でauto&&と書くのはあり?
2022/06/02(木) 08:19:43.47ID:X8QTJG9M
駄目
53デフォルトの名無しさん
2022/06/02(木) 10:55:52.02ID:MPFVtYTL54デフォルトの名無しさん
2022/06/02(木) 10:56:54.96ID:MPFVtYTL バッタフライってバッタとハエのことか
2022/06/02(木) 11:39:13.84ID:2jh3vW7l
バッタのフライだよ
昆虫食
昆虫食
2022/06/02(木) 22:50:27.49ID:W32R/zzX
>>37-46
んまー藻前らの言う通り
>>(前スレ)695 のオリジナルのプログラムが書き方が変にIQ高すぎたせいで
漏れが普通に書いたプログラムの方が速かったということかもしれませ
んね、
しかしこれをここから2^3倍にするというのが真の天才の仕事なので
ご気体くだち、
んまー藻前らの言う通り
>>(前スレ)695 のオリジナルのプログラムが書き方が変にIQ高すぎたせいで
漏れが普通に書いたプログラムの方が速かったということかもしれませ
んね、
しかしこれをここから2^3倍にするというのが真の天才の仕事なので
ご気体くだち、
2022/06/02(木) 22:51:31.90ID:W32R/zzX
なお^がべきなのか排他的論理和なのかは結果を見て決める、
2022/06/03(金) 06:03:05.77ID:2JsQlaOH
operator^をべきにするやついたら当然シバくよな
59デフォルトの名無しさん
2022/06/03(金) 06:10:12.11ID:3ErUtwIg 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));
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));
2022/06/03(金) 07:50:26.34ID:AsLopwGr
moveでなくてforwardが正しいです
2022/06/03(金) 08:54:35.11ID:I7UEGKwl
2022/06/03(金) 09:14:32.48ID:wV0TqfjJ
>>56
相変わらずタイポしてて草
相変わらずタイポしてて草
63はちみつ餃子 ◆8X2XSCHEME
2022/06/03(金) 09:33:30.85ID:ysQR9TY92022/06/03(金) 09:48:25.29ID:IxeUpLcv
push_backが適切にやってくれるだろうし素人がここで手入れするところではないな
2022/06/03(金) 09:49:48.62ID:I7UEGKwl
>>63 a.add(std::move(x)) の move 外したらコンパイルエラーになるでしょ。
2022/06/03(金) 09:56:37.41ID:IxeUpLcv
そりゃド素人が作成した自作関数に&&しか定義してないからでしょ
2022/06/03(金) 11:21:49.67ID:2JsQlaOH
xをコンストラクタに渡すならemplaceじゃね?
6959
2022/06/03(金) 14:58:35.62ID:3oYQiySt これでいいってことですか?
void add(vector<int> &&x){
vec.push_back(std::forward(x));
};
あと、
>「常に」ムーブさせたい
という言葉が気になるんですが、右辺値を受け取る場合に「ムーブさせない」場合があるんでしょうか?
void add(vector<int> &&x){
vec.push_back(std::forward(x));
};
あと、
>「常に」ムーブさせたい
という言葉が気になるんですが、右辺値を受け取る場合に「ムーブさせない」場合があるんでしょうか?
2022/06/03(金) 15:42:06.91ID:g1oXgs2q
引数が forwarding reference になるのは型変数の場合だけ
https://en.cppreference.com/w/cpp/language/reference#Forwarding_references
コンクリートな型の場合 && で取ったら確実に rvalue だから forward は要らん
んで vector<T>#push_back は (const T&) と (T&&) に対してオーバーロードされてるから (後者のバージョンが選ばれるので) move も要らん
つまり >>64 が正解。なんで適当答える前に手元で確認しないのか
https://en.cppreference.com/w/cpp/language/reference#Forwarding_references
コンクリートな型の場合 && で取ったら確実に rvalue だから forward は要らん
んで vector<T>#push_back は (const T&) と (T&&) に対してオーバーロードされてるから (後者のバージョンが選ばれるので) move も要らん
つまり >>64 が正解。なんで適当答える前に手元で確認しないのか
71はちみつ餃子 ◆8X2XSCHEME
2022/06/03(金) 15:44:21.94ID:ysQR9TY92022/06/03(金) 16:02:28.52ID:I7UEGKwl
>>70 move しなかったら push_back(const T&) になっちゃうでしょ。なんで適当答える前に(ry
2022/06/03(金) 16:06:42.00ID:g1oXgs2q
2022/06/03(金) 16:10:12.85ID:g1oXgs2q
75デフォルトの名無しさん
2022/06/03(金) 18:50:26.25ID:lbrgnw5P >>73
さてはrvalueの挙動理解してないな?
https://wandbox.org/permlink/rtkW4N7gWRu9yyqK
rvalueとして受け取った時点でlvalue扱いなんだよ
moveするまで所有権を持っていて、moveで所有権を放棄する。
所有権はT&&を受け取る関数に移る。
さてはrvalueの挙動理解してないな?
https://wandbox.org/permlink/rtkW4N7gWRu9yyqK
rvalueとして受け取った時点でlvalue扱いなんだよ
moveするまで所有権を持っていて、moveで所有権を放棄する。
所有権はT&&を受け取る関数に移る。
76デフォルトの名無しさん
2022/06/03(金) 19:12:19.64ID:lbrgnw5P >>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する
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する
2022/06/03(金) 19:43:48.13ID:+R1h67E5
Revive! Vive! unifyde call syntax!! revive!!!
2022/06/04(土) 12:47:58.32ID:TQBK1egQ
cpp経験のあるエンジニアが面接に来たんですがboost知らないとかあり得るんでしょうか
79デフォルトの名無しさん
2022/06/04(土) 13:11:38.01ID:FGCXQeDT あり得ません、エアプです
2022/06/04(土) 13:13:16.94ID:to7UVp4p
でもC++を完全に理解してるスーパーエンジニアが君の会社に来ることはないんだ
81デフォルトの名無しさん
2022/06/04(土) 13:41:01.98ID:vvbHqYcO boost知ってても使ってないとか黙殺するとかなら有り得るんじゃね
82デフォルトの名無しさん
2022/06/04(土) 13:51:08.17ID:cj+dvlSK CとCppは似てるらしいけど最初はCから始めて
基礎を身につけた方がいいとかありますか?
基礎を身につけた方がいいとかありますか?
2022/06/04(土) 14:02:22.31ID:1SIgUGMa
まあコンパイル時間が伸びるとかで使わない所も多いしな
2022/06/04(土) 14:05:58.45ID:OQ3usAsV
C++のほうがコンパイル時の文法チェックが親切なので、g++でコンパイルするのが吉
85はちみつ餃子 ◆8X2XSCHEME
2022/06/04(土) 14:18:00.05ID:Ah6rlskA 余談だけど cpp って書いたら C プリプロセッサのことを指す場合もある。
86デフォルトの名無しさん
2022/06/04(土) 14:37:22.59ID:cj+dvlSK >>83-85
ありがとうございます!勉強になります!
ありがとうございます!勉強になります!
2022/06/04(土) 14:38:35.97ID:qJZvQBHL
boostつかうひと嫌い
2022/06/04(土) 14:45:24.57ID:wH3cIPcT
マリオカートの遊び方に縛り入れてんじゃねぇよ!
2022/06/04(土) 16:03:47.30ID:OQ3usAsV
今どきの人がCの機能を学ぶにしても、最初のうちはC++コンパイラを使ったほうがいい
C++コンパイラは初心者がやりがちな意図しない型キャストに警告を出してくれる
C++コンパイラは初心者がやりがちな意図しない型キャストに警告を出してくれる
90デフォルトの名無しさん
2022/06/04(土) 16:44:33.09ID:vvbHqYcO91デフォルトの名無しさん
2022/06/04(土) 21:34:58.76ID:TQBK1egQ2022/06/04(土) 21:43:09.92ID:OQ3usAsV
93デフォルトの名無しさん
2022/06/04(土) 21:48:20.42ID:nRM2q6cY2022/06/04(土) 22:16:16.74ID:IRaDT1CY
>>83も書いてるけどboost使わない職場はそれなりにあるから俺もboost使える?って聞かれたら使ったことないからよく知らんって答えると思う
そもそもそんな事で採用決めるような会社はこちらから断ると思うが
そもそもそんな事で採用決めるような会社はこちらから断ると思うが
2022/06/04(土) 22:23:56.45ID:FR2x7OcT
はい、職歴に書かれた内容に曇りがないか見極めたかっだけなので、Boostに知見があるかどうかはさほど問題にしてません
2022/06/04(土) 22:54:17.16ID:cXL4Xuwo
2022/06/04(土) 22:56:04.77ID:4luU2XzE
>>79はネタで言ってるかエアプだと思うよ
boost役に立つものもあるし個人では使うが、仕事で必須かというとそんなことはない
boost役に立つものもあるし個人では使うが、仕事で必須かというとそんなことはない
2022/06/04(土) 22:59:46.47ID:+8Ow3LIK
標準じゃないもん使うのはアホ
人格に問題がある
人格に問題がある
2022/06/04(土) 23:04:03.58ID:BuoePqDI
知ってるけどあんまり使ってない、使ったことないから詳しくは知らない、とかならまあ別に普通だけど
知らない聞いたことすらないってのはヤバい
知らない聞いたことすらないってのはヤバい
100デフォルトの名無しさん
2022/06/04(土) 23:12:35.97ID:3rcQlGgA 仕事では使わないなあboost
必須のミドルウェアは使うけど
必須のミドルウェアは使うけど
101デフォルトの名無しさん
2022/06/04(土) 23:12:59.31ID:4luU2XzE >>98
その標準じゃないもん、にはOSのAPIとか目的のソフトに必須のライブラリ群も含んでる?
その標準じゃないもん、にはOSのAPIとか目的のソフトに必須のライブラリ群も含んでる?
102デフォルトの名無しさん
2022/06/05(日) 00:13:46.63ID:/AT5pgYO boostもサードパーティのライブラリも使わんて人は、コマンドラインのパーサーとか任意精度のライブラリとか自分で毎回書いてるのか?
正気か?
正気か?
103デフォルトの名無しさん
2022/06/05(日) 00:46:57.94ID:/ywqNijR そんな便利なものは存在しないから標準ライブラリ+Win32でどうにかしてるだけじゃね?
104デフォルトの名無しさん
2022/06/05(日) 01:30:20.47ID:TqTpE262 boost::sort::block_indirect_sort()はstd::sort()より速いので使ってる
105デフォルトの名無しさん
2022/06/05(日) 03:05:51.19ID:IC6BDqn3106デフォルトの名無しさん
2022/06/05(日) 05:03:18.77ID:O5HYGw/G >>95
c++標準の勉強をしていれば単語としてboostを聞いたことあるだろう。
知らないのなら大した勉強はしていないだろうから、せいぜい業務で通り一辺触ったことがあるくらいじゃないかね。
どこまでのスキル求めているかによるけど、業務内容に近い課題を与えてテストしてみたらいいんじゃない?
業務でc++を使わないなら、c++スキルに金を払うわけじゃないから気にすんな。どうせ募集要項にc++とか書いてないんだろ。
c++標準の勉強をしていれば単語としてboostを聞いたことあるだろう。
知らないのなら大した勉強はしていないだろうから、せいぜい業務で通り一辺触ったことがあるくらいじゃないかね。
どこまでのスキル求めているかによるけど、業務内容に近い課題を与えてテストしてみたらいいんじゃない?
業務でc++を使わないなら、c++スキルに金を払うわけじゃないから気にすんな。どうせ募集要項にc++とか書いてないんだろ。
107デフォルトの名無しさん
2022/06/05(日) 06:28:02.59ID:kEvpwCAH 自分の知ってる世界がすべてだと思ってる人間の方が危険。
C++が使われる範囲が広すぎるから、言語の経験有無よりもどの分野で開発してたのかを聞くべき。
ガラケー時代のカーネルドライバ書いてたり、携帯キャリア向け機器の組み込みやってた時はboostどころかstlすら使ってなかった。
というか使えなかった。
一方でスマホゲーのバックエンドを書いてた時はboostまみれだった。
C++が使われる範囲が広すぎるから、言語の経験有無よりもどの分野で開発してたのかを聞くべき。
ガラケー時代のカーネルドライバ書いてたり、携帯キャリア向け機器の組み込みやってた時はboostどころかstlすら使ってなかった。
というか使えなかった。
一方でスマホゲーのバックエンドを書いてた時はboostまみれだった。
108デフォルトの名無しさん
2022/06/05(日) 07:05:01.15ID:xi1K2Yw5 任意精度ってGMP使いませんか?
109デフォルトの名無しさん
2022/06/05(日) 08:31:22.07ID:sROqatdZ boost知らない人は自分が使ってる環境がC++11/14/17/20なのかも知らないとかありそう
大昔のC++文法しか知らない人とかいるし
面接ではこれも聞いてほしい
大昔のC++文法しか知らない人とかいるし
面接ではこれも聞いてほしい
110デフォルトの名無しさん
2022/06/05(日) 09:22:33.51ID:Zl7Pb69A 昔はboostでも使わんと正規表現扱えなかったでしょ(ヽ´ω`)
今の子は知らんのかな?
今の子は知らんのかな?
111デフォルトの名無しさん
2022/06/05(日) 10:41:52.09ID:GvBqEMar edはC++,boostで書かれていた!?
112デフォルトの名無しさん
2022/06/05(日) 10:57:35.83ID:TqTpE262 今や正規表現ライブラリはpcre2使っておくのが最適解でしょ
boostもre2も速度遅すぎ
最速軽量がre2の長所だったのは昔の話
boostもre2も速度遅すぎ
最速軽量がre2の長所だったのは昔の話
113はちみつ餃子 ◆8X2XSCHEME
2022/06/05(日) 11:09:32.30ID:XG05O5RB Boost 内のライブラリは組み合わせやすかったりもするだろうし、単独で性能が良いというだけが指標ではないだろう。
もちろん性能が良いに越したことは無いが、数倍程度の違いなら全体としては問題にならないことも多い。
もちろん性能が良いに越したことは無いが、数倍程度の違いなら全体としては問題にならないことも多い。
114デフォルトの名無しさん
2022/06/05(日) 11:33:39.66ID:TqTpE262 STLでregexクラステンプレートが追加されたのだから各正規表現ライブラリの供給元がstd::regexに準拠したラッパークラスを提供してくれるのかと思いきや、ほったらかしだしなあ
115デフォルトの名無しさん
2022/06/05(日) 13:02:35.05ID:u0j22vIZ おまいの募集要項にboost使用するって描いてないならおまいが可笑しい
boost以外の部分でC++の知識や使えるかどうかを確認するべき
boost以外の部分でC++の知識や使えるかどうかを確認するべき
116デフォルトの名無しさん
2022/06/05(日) 13:05:40.20ID:u0j22vIZ >>108
mpirだな
mpirだな
117デフォルトの名無しさん
2022/06/05(日) 13:23:08.93ID:VgN5DVM1 ただの文字列なら速さで選ぶのも良いけど、HTMLやXMLのような注釈を含むテキストは、STLやboostを使うのがスマート。
118デフォルトの名無しさん
2022/06/05(日) 13:27:27.15ID:TqTpE262 re2は遅いうえに\1みたいな後方参照をサポートしてないのが痛い
119デフォルトの名無しさん
2022/06/05(日) 13:44:58.69ID:JAUYaj4s 別に即戦力求めてるわけじゃないので開発言語で縛って間口狭くしたくないんですよ でも質疑応答のクオリティ上げるためには突っ込んだ質問って必要じゃないですか 今回はそれが上手く出来なかっただけです
120デフォルトの名無しさん
2022/06/05(日) 15:40:19.58ID:udiiYXiV ようするに基礎があるかどうかと伸びしろがあるかどうかだろ
今知らなくても調べればすぐ判ることが出来れば問題無い罠
今知らなくても調べればすぐ判ることが出来れば問題無い罠
121デフォルトの名無しさん
2022/06/05(日) 16:50:16.03ID:sROqatdZ 本人が経歴盛ってるならクズだが、営業やエージェントが勝手に盛ってることもあるからな
その辺も見極めて大目に見てほしい
その辺も見極めて大目に見てほしい
122デフォルトの名無しさん
2022/06/05(日) 17:21:37.24ID:dinbGc5/ 自分のとこが金をいくら出せるのか考えてからマウント取ってほしいもんだわ
123デフォルトの名無しさん
2022/06/05(日) 17:37:12.61ID:DpfkldE/ 対価は市場感より高めに設定していますね
AWSと同じぐらいのはずです
AWSと同じぐらいのはずです
124デフォルトの名無しさん
2022/06/05(日) 17:59:03.07ID:MGWqyCtZ >>117
そもそもそんな用途にC++ってどうなの?
そもそもそんな用途にC++ってどうなの?
125デフォルトの名無しさん
2022/06/05(日) 18:15:07.18ID:VgN5DVM1 >>124
ブラウザでctrl+f押してみ。
ブラウザでctrl+f押してみ。
126デフォルトの名無しさん
2022/06/05(日) 18:28:12.08ID:dinbGc5/ >>123
手取りで1000万くらいですか?
手取りで1000万くらいですか?
127デフォルトの名無しさん
2022/06/05(日) 19:24:35.36ID:/AT5pgYO htmlは知らんがxmlの読み書きはC++のプログラムで一般的じゃね
128デフォルトの名無しさん
2022/06/05(日) 22:30:48.15ID:n7vwmg3m C言語の基本を学んでC++を勉強を始めました
バッファのフラッシュについて教えてください
プログラムは最後に全てのバッファがフラッシュされると思いますが、
std::flashやstd::endlはどういった時に使えばいいのでしょうか?
また、フラッシュの処理時間を考えるとstd::endlよりも'\n'を使った方が軽くなると思いますが、
あえてstd::endlを使う意味はありますか?
このフラッシュという概念はC言語になかったですよね…?
バッファのフラッシュについて教えてください
プログラムは最後に全てのバッファがフラッシュされると思いますが、
std::flashやstd::endlはどういった時に使えばいいのでしょうか?
また、フラッシュの処理時間を考えるとstd::endlよりも'\n'を使った方が軽くなると思いますが、
あえてstd::endlを使う意味はありますか?
このフラッシュという概念はC言語になかったですよね…?
129デフォルトの名無しさん
2022/06/05(日) 22:41:22.00ID:FJOOY/QK fflush()を知らずにC言語を使ってきたなら気にする必要はない
130デフォルトの名無しさん
2022/06/05(日) 22:53:56.06ID:ypMgugQ8 >>128
キミの疑問の中に答えがあると思うんだが
>プログラムは最後に全てのバッファがフラッシュされると思いますが、
逆に言えばプログラムの途中ではいつバッファの内容がflashされるかわからないってことじゃん
どういった時に使えばいいのか、なんてプログラムの最後ではなく途中でflashしたい時だろ
キミの疑問の中に答えがあると思うんだが
>プログラムは最後に全てのバッファがフラッシュされると思いますが、
逆に言えばプログラムの途中ではいつバッファの内容がflashされるかわからないってことじゃん
どういった時に使えばいいのか、なんてプログラムの最後ではなく途中でflashしたい時だろ
131デフォルトの名無しさん
2022/06/05(日) 22:55:08.26ID:JCaRLrt5 stderr(バッファリング無し)とstdout(デフォルトでバッファリング有り)のリダイレクト先が同じ(コンソール等)のとき、
printf()とfprintf()の実行順にprintf()とfprintf()の出力結果を並ばせたいときに早速ffush(stdout)の出番が、
あとfflush()せずにabort()したらバッファ上のデータが失われることがある
もっともabort()を呼ぶしかない状況とかはどうしようもない状況なので盲目的なfflush()が適切とは言えないケースも
ありえるかもし
れんが
printf()とfprintf()の実行順にprintf()とfprintf()の出力結果を並ばせたいときに早速ffush(stdout)の出番が、
あとfflush()せずにabort()したらバッファ上のデータが失われることがある
もっともabort()を呼ぶしかない状況とかはどうしようもない状況なので盲目的なfflush()が適切とは言えないケースも
ありえるかもし
れんが
132デフォルトの名無しさん
2022/06/05(日) 23:00:34.55ID:JCaRLrt5 んまー通常はファイルのクローズでフラッシュされるから明示的にファイルポインタに対してfflush()する必要に迫られることはなさげ
腸人工的なシチュエーション(でありかあまり良い設計でない例)として、
オープンしたままのファイルA、Bにこの順でデータが追記されることを気体するプロセスが他に居るときに
A、Bの順で追記するとき要る?ぐらい??
腸人工的なシチュエーション(でありかあまり良い設計でない例)として、
オープンしたままのファイルA、Bにこの順でデータが追記されることを気体するプロセスが他に居るときに
A、Bの順で追記するとき要る?ぐらい??
133デフォルトの名無しさん
2022/06/05(日) 23:11:06.10ID:TqTpE262 他のプロセスと通信する時に明示的なバッファフラッシュが必要になることがあるよ
134デフォルトの名無しさん
2022/06/05(日) 23:17:22.56ID:JCaRLrt5 >>133
それは思わないでもなかったが、
1. バッファに入った順で出ていく
2. ほっといてもバッファ内容がどんどん出ていく
3. 通信は送りっぱなしまたはロジカルなハンドシェーク手順
である場合にfflush()が必須というケースが思いつきませなんだ、
それは思わないでもなかったが、
1. バッファに入った順で出ていく
2. ほっといてもバッファ内容がどんどん出ていく
3. 通信は送りっぱなしまたはロジカルなハンドシェーク手順
である場合にfflush()が必須というケースが思いつきませなんだ、
135デフォルトの名無しさん
2022/06/05(日) 23:24:31.44ID:/ywqNijR 1行ごとに結構重い処理をしたり、std::cinが入ってくるタイミングが不定期だったりするときに1行ごとにflushしておくと便利。
C言語でも使うテクニックだけどね
C言語でも使うテクニックだけどね
136デフォルトの名無しさん
2022/06/05(日) 23:25:34.70ID:TqTpE262 送信側(自アプリ)じゃなくて受信側(他アプリ)の都合次第なので
137デフォルトの名無しさん
2022/06/05(日) 23:36:59.90ID:JCaRLrt5 >受信側(他アプリ)の都合次第
どのような都合かkwsk、
fflush()したら動いて、fflush()しないと止まってしまう通信処理とかはなんかおかしいのでは……
ほっといてもバッファ内容がどんどん出ていく 限りfflush()せずとも送信は成立する
受け取れたかどうかはACKかNAKでも返してもらえばワカルから、
受信タイムうアウト検知ぐらいしかタイミングが関係する要素は無さげ、
どのような都合かkwsk、
fflush()したら動いて、fflush()しないと止まってしまう通信処理とかはなんかおかしいのでは……
ほっといてもバッファ内容がどんどん出ていく 限りfflush()せずとも送信は成立する
受け取れたかどうかはACKかNAKでも返してもらえばワカルから、
受信タイムうアウト検知ぐらいしかタイミングが関係する要素は無さげ、
138デフォルトの名無しさん
2022/06/05(日) 23:57:14.80ID:TqTpE262 「受け取れたかどうかはACKかNAKでも返してもらえばワカル」ってのがすでに受信側の都合だろ
139デフォルトの名無しさん
2022/06/06(月) 00:02:59.46ID:NTJIoMOy コンテキストスイッチをきっかけにフラッシュするような仕組みはあるん?
140デフォルトの名無しさん
2022/06/06(月) 00:15:14.95ID:1jBvtBty それがフラッシュしておかないと停電のときデータ全部持ってかれるんだよな
141デフォルトの名無しさん
2022/06/06(月) 00:19:06.76ID:68av+k9D とりあえず言っておくが、水がもったいないからと言って水洗トイレを流さずに退出するのはやめたほうがいい
142デフォルトの名無しさん
2022/06/06(月) 00:21:03.22ID:68av+k9D >>139
小便用トイレだと赤外線で退出を探知して水を流してくれるものもある
小便用トイレだと赤外線で退出を探知して水を流してくれるものもある
143デフォルトの名無しさん
2022/06/06(月) 00:23:36.15ID:1jBvtBty フラッシュってのはハードディスクにどこまでデータ書いたか正規化する目的で行うから、フラッシュしないで停電モードでクラッシュすると、復旧したときに書いてたデータはゼロバイトのままだったりするが、こまめにフラッシュでデータを確定申告してる場合は書いた分がきちんと残ってたりする
144デフォルトの名無しさん
2022/06/06(月) 00:26:15.98ID:Wu7kw3Sh これからは税務署に追徴課税されないように足繁く通うことにします。
145デフォルトの名無しさん
2022/06/06(月) 00:28:00.96ID:1jBvtBty ま、無停電装置つけてたり電源不足などでHDDが頻繁に切断される環境でなければ問題ないけどね
146デフォルトの名無しさん
2022/06/06(月) 00:28:38.87ID:68av+k9D 一休はすでに縄を持って待ち構えてくれているのだから、義満が虎を屏風から追い出せばいいだけ
簡単なことだろ
簡単なことだろ
147デフォルトの名無しさん
2022/06/06(月) 02:46:25.01ID:ETmHHhEk 誤解している人が多そうだけど
fflush()はC標準ライブラリの中のバッファリングデータを全て吐き出すだけであって
システムコールでいえばwriteするだけだよ
一方でカーネルがディスクなどに書き出すのを保証するのはシステムコールではsync/fsyncであってこれはfflush()しても行われない別のもの
fflush()はC標準ライブラリの中のバッファリングデータを全て吐き出すだけであって
システムコールでいえばwriteするだけだよ
一方でカーネルがディスクなどに書き出すのを保証するのはシステムコールではsync/fsyncであってこれはfflush()しても行われない別のもの
14859
2022/06/06(月) 03:12:54.60ID:hkI7oR+t 遅レスすいません。
右辺値参照周りを自分でも見直してきたんですが、
最終的に「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))
この理解であってますか?
右辺値参照周りを自分でも見直してきたんですが、
最終的に「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))
この理解であってますか?
149デフォルトの名無しさん
2022/06/06(月) 08:55:53.89ID:Ug3DHjCK150デフォルトの名無しさん
2022/06/06(月) 09:02:16.31ID:Ug3DHjCK151デフォルトの名無しさん
2022/06/06(月) 10:28:12.30ID:x36Ky4fa WinだとFileFlushBuffersだけで完結する
152デフォルトの名無しさん
2022/06/06(月) 10:28:30.66ID:0alNkgKE noexceptの有無で動作が変わるなんてC++ムズすぎィ!
154デフォルトの名無しさん
2022/06/06(月) 11:43:05.77ID:Ug3DHjCK まあ原因と結果が全然離れた別の場所で起こるっていう意味では難易度高いとは思う
155デフォルトの名無しさん
2022/06/06(月) 12:41:54.06ID:jOQJjNZV >>148
あってる
あってる
156デフォルトの名無しさん
2022/06/06(月) 21:20:45.44ID:FY57Ayyt >>126
この国は累進課税なのでそのラインは難しいですね
この国は累進課税なのでそのラインは難しいですね
157デフォルトの名無しさん
2022/06/08(水) 00:14:11.77ID:0qhQo4nk158デフォルトの名無しさん
2022/06/08(水) 00:17:03.29ID:xZpQpCco moveをやれるヤツはmoveをやる勇気があるヤツだけだ
159デフォルトの名無しさん
2022/06/08(水) 22:59:00.34ID:lI0dIi5c >>138
話をそらすでないは;;;
通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
受信側(他アプリ)に伝わるやんけ
fflush()全然必須じゃないやんけ
fflush()に関してはやっぱ受信側の都合も糞も無いやんけ;;;
んまー今日日の計算機は速いから、世迷言てんこ盛りの呪術指向プログラミングでも
比較的まともっぽく動くが、
話をそらすでないは;;;
通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
受信側(他アプリ)に伝わるやんけ
fflush()全然必須じゃないやんけ
fflush()に関してはやっぱ受信側の都合も糞も無いやんけ;;;
んまー今日日の計算機は速いから、世迷言てんこ盛りの呪術指向プログラミングでも
比較的まともっぽく動くが、
160デフォルトの名無しさん
2022/06/08(水) 23:03:01.67ID:lI0dIi5c fflush()にはフロー制御で止まっている送信を動かす力は無いし、
ブロック型デバイスの書き込みのトリガーになる保証は無いしで
やっぱ使いどころは>>131みたいに多対1の書き込み(dstが同じ)というケースでの論理的な書き込み順序保証ぐらいしか無さげ
ブロック型デバイスの書き込みのトリガーになる保証は無いしで
やっぱ使いどころは>>131みたいに多対1の書き込み(dstが同じ)というケースでの論理的な書き込み順序保証ぐらいしか無さげ
161デフォルトの名無しさん
2022/06/08(水) 23:39:12.93ID:TQgrAlst >>159
水に流せ
水に流せ
162デフォルトの名無しさん
2022/06/09(木) 19:04:36.80ID:d61AFL9R 受信側の都合どうこうの話は知らんが
>通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
それは送信側がどんどん送り出している場合でしょ
>通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
それは送信側がどんどん送り出している場合でしょ
163デフォルトの名無しさん
2022/06/09(木) 19:12:48.98ID:6LGi7Ubo 高機能トイレしか使ったことない人は、何もしなくても離席したら勝手に排泄物が流されていくと思っているからね
164デフォルトの名無しさん
2022/06/09(木) 19:16:36.26ID:ftpPDZQh 停電おこったことないんだろうね
165デフォルトの名無しさん
2022/06/09(木) 21:05:58.36ID:Y+xZp6wU トイレの水流すのもflushだったなwww
166デフォルトの名無しさん
2022/06/09(木) 21:14:08.39ID:0SCWcBb2 むしろコンピュータ用語のflushの方がトイレからの連想
167デフォルトの名無しさん
2022/06/10(金) 18:08:30.15ID:PT4Yy0z8 flushつったらズリセンだろ
168デフォルトの名無しさん
2022/06/10(金) 18:15:06.01ID:q3uEdydr 長時間ストリーミング書き込み時にFileFlushBuffersコールしてなかった停電時の悲劇
169128
2022/06/11(土) 13:05:09.88ID:qY+svW4r なんとなく分かりましたが、C言語でfflush()を使っていなかったので困ることもなさそうです
改行は'\n'を使ってもう少し勉強を進めてから改めて皆さんのレスを読み返そうと思います
返事が遅くなりました、ありがとうございました
改行は'\n'を使ってもう少し勉強を進めてから改めて皆さんのレスを読み返そうと思います
返事が遅くなりました、ありがとうございました
170デフォルトの名無しさん
2022/06/11(土) 15:25:15.53ID:b1p/w9+9 https://ideone.com/P9fDXn
コンパイル通らねー。
コンパイル通らねー。
171デフォルトの名無しさん
2022/06/11(土) 21:16:14.33ID:ZeuO2q0P172デフォルトの名無しさん
2022/06/11(土) 21:25:33.69ID:ZeuO2q0P >>168
左様停電に対して備えたいならI/Oストリームのバッファ階層の操作で満足するのではなくて
ioctlレヴェルの働きかけで掃き出し操作を保証を行うべき、(デバイスによってやるべきことが違う
というわけで論理的思考う能力に乏しい香具師がfflush()万能教にはまっている悪寒、
左様停電に対して備えたいならI/Oストリームのバッファ階層の操作で満足するのではなくて
ioctlレヴェルの働きかけで掃き出し操作を保証を行うべき、(デバイスによってやるべきことが違う
というわけで論理的思考う能力に乏しい香具師がfflush()万能教にはまっている悪寒、
173デフォルトの名無しさん
2022/06/11(土) 21:47:10.33ID:ZeuO2q0P ていうかそもそも馬鹿でかいバッファを用意しておいてから停電を恐れるというのはアレな発想でありまして、
真に停電に備えたいなら馬鹿でかいバッファを備えたデータのストリームとは別に、
どこまで書き込みが終わったかというだけの小さいサイズのジャーナル情報を
こまめに書くというのがファイナルアンサーであって
停電の際はジャーナル情報だけ保証して停電の瞬間に馬鹿でかいバッファ上にあったデータは諦めるのが正しいシステム
停電による処理中データの喪失がどうしても嫌ということなら速度の方を諦めてアンバッファーにするかバッファを小さくしてくだち、
真に停電に備えたいなら馬鹿でかいバッファを備えたデータのストリームとは別に、
どこまで書き込みが終わったかというだけの小さいサイズのジャーナル情報を
こまめに書くというのがファイナルアンサーであって
停電の際はジャーナル情報だけ保証して停電の瞬間に馬鹿でかいバッファ上にあったデータは諦めるのが正しいシステム
停電による処理中データの喪失がどうしても嫌ということなら速度の方を諦めてアンバッファーにするかバッファを小さくしてくだち、
174デフォルトの名無しさん
2022/06/11(土) 21:56:10.36ID:ZeuO2q0P まとめ:
この地球上のどこを探しても停電への備えがこまめなfflush()(笑)ということはありえない
この地球上のどこを探しても停電への備えがこまめなfflush()(笑)ということはありえない
175デフォルトの名無しさん
2022/06/11(土) 22:48:11.94ID:fc6R3/Uh まだ言うか!
176デフォルトの名無しさん
2022/06/11(土) 23:31:57.10ID:pfxnOy19 小さいサイズでもそれが即座に反映だれるとは限らないけどな
停電に備えるならUPSだろ
何がこまめに書くのがファイナルアンサーだよ
突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな
停電に備えるならUPSだろ
何がこまめに書くのがファイナルアンサーだよ
突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな
177デフォルトの名無しさん
2022/06/11(土) 23:44:48.33ID:/CWj/UNa 粗悪なUPS使って電源破損した事あるから良い印象ないな
178デフォルトの名無しさん
2022/06/12(日) 13:55:23.39ID:0uPAg53b 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スレッド
■ オリジナル
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スレッド
179デフォルトの名無しさん
2022/06/12(日) 13:55:40.64ID:0uPAg53b なんかもう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分ぐらい、
達成感みある、
ただし実行時間の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分ぐらい、
180デフォルトの名無しさん
2022/06/12(日) 14:00:10.22ID:0uPAg53b OpenMPは昨日始めたのでなんか間違ってるかもしれん……orz
行列の転置が8スレッド使って(2回目以降も)実行時間1/8にならない件について:
https://ideone.com/rFCMy5
のfftb6::transpose()のコードの書き方だと50%ぐらいにしか短縮されなんだ 。n_
行列の転置が8スレッド使って(2回目以降も)実行時間1/8にならない件について:
https://ideone.com/rFCMy5
のfftb6::transpose()のコードの書き方だと50%ぐらいにしか短縮されなんだ 。n_
181デフォルトの名無しさん
2022/06/12(日) 14:02:02.73ID:0uPAg53b つなみにVS2019でOpenMP有効にするには
「構成プロパティー」→「C/C++」→「言語」→「OpenMP のサポート」
で逝ける、
「構成プロパティー」→「C/C++」→「言語」→「OpenMP のサポート」
で逝ける、
182デフォルトの名無しさん
2022/06/12(日) 14:04:35.42ID:0uPAg53b >>176
>何がこまめに書くのがファイナルアンサーだよ
NTFSの実装、、、
>突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな
しらそん
それはUPSを買う金もないのに停電とかを引き合いに出してきた香具師に言ってやってくだち
>何がこまめに書くのがファイナルアンサーだよ
NTFSの実装、、、
>突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな
しらそん
それはUPSを買う金もないのに停電とかを引き合いに出してきた香具師に言ってやってくだち
183デフォルトの名無しさん
2022/06/12(日) 14:10:01.25ID:6VBjP0iK 8スレッドで4倍くらいになってほしいね
184デフォルトの名無しさん
2022/06/13(月) 00:27:41.34ID:HWF8Czmy もちついて考えたら
#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についても言える)
#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についても言える)
185デフォルトの名無しさん
2022/06/13(月) 14:39:57.67ID:efPEc9j/ std::complexは使わないの?
186デフォルトの名無しさん
2022/06/13(月) 15:28:43.59ID:Wf2qSIvf びーまいべいべー
187デフォルトの名無しさん
2022/06/13(月) 23:36:52.53ID:dm71PatD 並列処理に何でマルチスレッド使ってんだよ
昭和からタイムスリップしてきたのか?
昭和からタイムスリップしてきたのか?
188デフォルトの名無しさん
2022/06/14(火) 00:17:42.26ID:SQz7DEKB omp って単語を見るとおまんぽにしか見えない
189デフォルトの名無しさん
2022/06/14(火) 01:23:09.85ID:e+DfEXd1 >>187
この問題でasyncプログラミングがどうやってマルチスレッドに太刀打ちするのか教えて
この問題でasyncプログラミングがどうやってマルチスレッドに太刀打ちするのか教えて
190デフォルトの名無しさん
2022/06/14(火) 16:46:20.69ID:yDV29Um0 教えてください
C++で書かれたDLLがあります
とあるCエクスポート関数を呼び出すと稀に Access Violation 0xc0000005 が発生することがありプロセスが異常終了してしまいます
幸いなことにこの関数は大した仕事をしておらず結果が得られなければそれで困ることもありません(結果が得られれば少し役に立つ程度です)
なのでこの関数の失敗を握り潰したいのですが、C++ でアクセス違反を try-catch で握り潰すことはできるのでしょうか?
それともアクセス違反は致命的なエラーなので必ずプロセス終了に至るのでしょうか?
C++で書かれたDLLがあります
とあるCエクスポート関数を呼び出すと稀に Access Violation 0xc0000005 が発生することがありプロセスが異常終了してしまいます
幸いなことにこの関数は大した仕事をしておらず結果が得られなければそれで困ることもありません(結果が得られれば少し役に立つ程度です)
なのでこの関数の失敗を握り潰したいのですが、C++ でアクセス違反を try-catch で握り潰すことはできるのでしょうか?
それともアクセス違反は致命的なエラーなので必ずプロセス終了に至るのでしょうか?
191デフォルトの名無しさん
2022/06/14(火) 16:54:42.88ID:Vdns4Gf+ またこのネタ掘り起こしたいのか・・・
192デフォルトの名無しさん
2022/06/14(火) 17:18:04.76ID:NNc5VmHP >>190
.NETは使っとらんの?
.NETは使っとらんの?
193デフォルトの名無しさん
2022/06/14(火) 17:23:59.58ID:rBU/2bdp https://docs.microsoft.com/ja-jp/cpp/build/reference/eh-exception-handling-model?view=msvc-170
呼び出し側のコンパイルで /EHa オプションつければ try-catch で握りつぶせるんでね?
呼び出し側のコンパイルで /EHa オプションつければ try-catch で握りつぶせるんでね?
194デフォルトの名無しさん
2022/06/14(火) 18:22:20.04ID:WigeF4Tr195デフォルトの名無しさん
2022/06/14(火) 18:39:01.73ID:yDV29Um0196デフォルトの名無しさん
2022/06/14(火) 19:23:09.63ID:bI70PJIL DLLが例外出してるのをCで握り潰してるのが原因だろ
197デフォルトの名無しさん
2022/06/15(水) 20:40:34.83ID:RdmQ7I01 素人の質問でごめんなさい。(ここが一番関連ありそうだったので)
バイオインフォマティクスをやっているのですが、例えば主にC++で書かれたUnicycler (https://github.com/rrwick/Unicycler)というソフトウェアでは、--threadsオプションで使用するスレッド数を指定できます。
デフォルトだとスレッド数8なのですが、仮にそれを1コアを使って実行した際はどのような挙動になるのでしょうか。
コア数<スレッド数なので失敗するかと思ったのですが、思いの他うまく実行できてしまいます。
一般的にこういう場合、並列 (parallel)処理ではなく並行 (concurrent)処理で、スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか・・・
バイオインフォマティクスをやっているのですが、例えば主にC++で書かれたUnicycler (https://github.com/rrwick/Unicycler)というソフトウェアでは、--threadsオプションで使用するスレッド数を指定できます。
デフォルトだとスレッド数8なのですが、仮にそれを1コアを使って実行した際はどのような挙動になるのでしょうか。
コア数<スレッド数なので失敗するかと思ったのですが、思いの他うまく実行できてしまいます。
一般的にこういう場合、並列 (parallel)処理ではなく並行 (concurrent)処理で、スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか・・・
198はちみつ餃子 ◆8X2XSCHEME
2022/06/15(水) 20:45:50.35ID:VY0KZJ3n >>197
> スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか
せやで。
OS がスケジューリングしてスレッドを交互に実行しとる。
コア数以上のスレッドに分けても実行速度が上がったりはしないよ。
コンテキスト切り替えのコストの分だけむしろ遅くなると思う。
> スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか
せやで。
OS がスケジューリングしてスレッドを交互に実行しとる。
コア数以上のスレッドに分けても実行速度が上がったりはしないよ。
コンテキスト切り替えのコストの分だけむしろ遅くなると思う。
199デフォルトの名無しさん
2022/06/15(水) 21:02:51.51ID:RdmQ7I01 >>198
なるほど、OS賢いですね。。
つまり1コアでやるときは複数スレッドの処理もできるけど、無難に1スレッドの処理にした方がむしろ速い、ということですね。
勉強になりました!ありがとうございます!
なるほど、OS賢いですね。。
つまり1コアでやるときは複数スレッドの処理もできるけど、無難に1スレッドの処理にした方がむしろ速い、ということですね。
勉強になりました!ありがとうございます!
200デフォルトの名無しさん
2022/06/15(水) 21:05:28.34ID:74xVOU49 各スレッドがio待ちしてるかも知れんし、コア数より多くても早くなる場合もあるんじゃね
gcc動かすときもコア数1.5倍位指定してる
gcc動かすときもコア数1.5倍位指定してる
201デフォルトの名無しさん
2022/06/15(水) 21:28:42.61ID:RdmQ7I01 調べてみたらコンテキストスイッチにもプロセスコントキストスイッチとスレッドコンテキストスイッチがあって、
後者の方がコストが格段に低いとありました。
この場合は同一プロセス中の複数スレッドで後者なので、
>>200さんの言っていることもありますし、コア数よりスレッド数を少し多めに設定しても速くなるのかもしれませんね。
実験して確かめるのが一番かもですね。
後者の方がコストが格段に低いとありました。
この場合は同一プロセス中の複数スレッドで後者なので、
>>200さんの言っていることもありますし、コア数よりスレッド数を少し多めに設定しても速くなるのかもしれませんね。
実験して確かめるのが一番かもですね。
202デフォルトの名無しさん
2022/06/15(水) 21:38:32.69ID:vqdnmmaI まあ今の実装は大抵スレッドといいつつプロセスだったりするけどね
203デフォルトの名無しさん
2022/06/15(水) 22:07:11.11ID:Ltc382Vw >>202
何の話だ?
何の話だ?
204デフォルトの名無しさん
2022/06/15(水) 22:21:16.61ID:5/k7QI1P pythonはそんな感じがする
205デフォルトの名無しさん
2022/06/15(水) 22:28:16.78ID:Ltc382Vw pythonでもマルチスレッドとマルチプロセッシングは別物だろが
206デフォルトの名無しさん
2022/06/15(水) 22:34:39.36ID:Z7kfo4VR Linuxのスレッドはプロセスだと聞いた
207はちみつ餃子 ◆8X2XSCHEME
2022/06/15(水) 22:56:22.65ID:VY0KZJ3n そのへんは色んな論が合って今の主流がどうなってんのかよくわからん。
でも一度はプロセスを軽くする方向 (スレッドの実態をプロセスとする方向) になったというのは私も聞いたことがあるような気がする。
(BSD 系の話と混ざってるような気もする。 だいぶんうろ覚え。)
プロセスを軽くするというよりは段階を分けるというか、
プロセスをスレッド的な範囲で使っている分にはスレッド程度の処理しかしないみたいな感じ。
ただ、それは最終的には管理コストが思ったより大きくてそれほど効果的ではないというオチじゃなかったっけ?
でも一度はプロセスを軽くする方向 (スレッドの実態をプロセスとする方向) になったというのは私も聞いたことがあるような気がする。
(BSD 系の話と混ざってるような気もする。 だいぶんうろ覚え。)
プロセスを軽くするというよりは段階を分けるというか、
プロセスをスレッド的な範囲で使っている分にはスレッド程度の処理しかしないみたいな感じ。
ただ、それは最終的には管理コストが思ったより大きくてそれほど効果的ではないというオチじゃなかったっけ?
208デフォルトの名無しさん
2022/06/15(水) 23:10:10.79ID:vqdnmmaI >>203
OSのカーネルスレッドの実装の話だ
OSのカーネルスレッドの実装の話だ
209デフォルトの名無しさん
2022/06/15(水) 23:14:22.38ID:8Ciw/luQ forkもCoWがあるからオーバーヘッド大したことないんだっけ?
210デフォルトの名無しさん
2022/06/16(木) 06:09:16.40ID:acnLqVz4211デフォルトの名無しさん
2022/06/16(木) 06:36:56.71ID:GA9mXaJg212デフォルトの名無しさん
2022/06/16(木) 07:01:31.35ID:ilsRfae9 >>199
ユニプロセッサでも例えばI/O待ちやユーザ入力待ちしている間にできることをやっとくんだよ
ユニプロセッサでも例えばI/O待ちやユーザ入力待ちしている間にできることをやっとくんだよ
213デフォルトの名無しさん
2022/06/16(木) 07:17:28.07ID:lg2Mpz7e 例えばシングルスレッドのみを利用のサーバーでも
その中で非同期タスクを1万個動かしてクライアント同時接続1万個の処理が可能
ほとんどがネットワーク待ちとディスク待ちだから非同期ならばそれだけ同時に並行処理(≠並列処理)できる
その中で非同期タスクを1万個動かしてクライアント同時接続1万個の処理が可能
ほとんどがネットワーク待ちとディスク待ちだから非同期ならばそれだけ同時に並行処理(≠並列処理)できる
214デフォルトの名無しさん
2022/06/16(木) 07:30:29.25ID:lg2Mpz7e もし同期プログラミングしか出来ないと
その多数のクライアントを捌くためにスレッド数を増やすことで対応することになるが
スレッドリソースを喰うため大きいためスレッド数を増やせず
スレッドスイッチングも重いため圧倒的に不利となってしまう
その多数のクライアントを捌くためにスレッド数を増やすことで対応することになるが
スレッドリソースを喰うため大きいためスレッド数を増やせず
スレッドスイッチングも重いため圧倒的に不利となってしまう
215デフォルトの名無しさん
2022/06/16(木) 08:51:16.63ID:ilsRfae9 ネットのサーバーは本質的にマルチタスクで
たとえシングルで力技かましてても外から見て複数のタスクを同時にこなしている
たとえシングルで力技かましてても外から見て複数のタスクを同時にこなしている
216デフォルトの名無しさん
2022/06/16(木) 09:12:07.56ID:LWbVArCN 1対1スレッドがマルチプロセッサ使えて実装が楽で悪いことないよね
217デフォルトの名無しさん
2022/06/16(木) 09:53:32.18ID:JxXqg7BH218デフォルトの名無しさん
2022/06/16(木) 10:11:35.67ID:LWbVArCN >>217
非同期のスレッドってどういうのを指すの?
非同期のスレッドってどういうのを指すの?
219デフォルトの名無しさん
2022/06/16(木) 11:53:53.45ID:ilsRfae9 マルチスレッドは基本的に非同期だけどな
必要に応じてミューテックスやシグナルで待ち合わせする
必要に応じてミューテックスやシグナルで待ち合わせする
220デフォルトの名無しさん
2022/06/16(木) 16:20:36.89ID:OqC2jk+r ノンブロッキング=非同期でいいのかな
221デフォルトの名無しさん
2022/06/16(木) 16:31:27.35ID:WGtrzJPY いいよ違うけど
222デフォルトの名無しさん
2022/06/16(木) 17:24:48.01ID:Vxm/sO96 しかしまあどこかにライブラリを作ってる人がいるんだけど、その事実を認識できんプログラマというのはおるよな
223デフォルトの名無しさん
2022/06/16(木) 17:38:45.90ID:5Mp0JkOM ジャップにはOSS読んだり一次情報確認しにいく文化がそもそも無いからな
224デフォルトの名無しさん
2022/06/16(木) 17:39:26.55ID:T9ZCQ85W 非同期プログラミングでは多くの言語でPromiseもしくはFutureと呼ばれる同じ概念の抽象化を用いて行なう
つまりこれから行われることを期待する未来の約束という抽象化したものに次々と託していくことで
プログラムコードの見かけ上の記述順とは異なり並行して非同期に複数のタスクが走ることで非常に効率的に実行
それらは一つのスレッド内で何十も何千も非同期に並行して動かすことが可能であるがマルチスレッドを使えばさらにそのコア数倍を動かせる
>>216
それだと効率が悪すぎてお子様向け
つまりこれから行われることを期待する未来の約束という抽象化したものに次々と託していくことで
プログラムコードの見かけ上の記述順とは異なり並行して非同期に複数のタスクが走ることで非常に効率的に実行
それらは一つのスレッド内で何十も何千も非同期に並行して動かすことが可能であるがマルチスレッドを使えばさらにそのコア数倍を動かせる
>>216
それだと効率が悪すぎてお子様向け
225デフォルトの名無しさん
2022/06/17(金) 01:35:07.48ID:UGOae7/Q プログラマー目指してるんですが、C++やるなら03と11の両方勉強しておいた方がいいですか?
226デフォルトの名無しさん
2022/06/17(金) 01:42:46.88ID:OGNvxC9Z はて?
C++11やればC++03もカバーしたことになるからC++11以降一択だよ
細かいことはコンパイルエラーが出てから考えればいいんだよ
C++11やればC++03もカバーしたことになるからC++11以降一択だよ
細かいことはコンパイルエラーが出てから考えればいいんだよ
227デフォルトの名無しさん
2022/06/17(金) 03:02:19.62ID:2abskYGH 今C++03の案件とかあるんかな
あっても正直関わりたくないな
あっても正直関わりたくないな
228デフォルトの名無しさん
2022/06/17(金) 05:01:48.39ID:GnlLskBw autoなしで書きたくない
229デフォルトの名無しさん
2022/06/17(金) 05:20:26.86ID:zopwF6/i 何を言うとるか
今憶えるべきはC++20に決まっとろうが
今憶えるべきはC++20に決まっとろうが
230デフォルトの名無しさん
2022/06/17(金) 09:56:39.22ID:UGOae7/Q C++11を勉強しておけば良さそうですね
独習C++をやります
ありがとうございました
独習C++をやります
ありがとうございました
231デフォルトの名無しさん
2022/06/17(金) 13:24:12.81ID:SEHo94h9 c++11で書いたコードをC++20でコンパイルしようとしたらエラー出まくりんぐ
教えてエロい人
教えてエロい人
232デフォルトの名無しさん
2022/06/17(金) 13:40:57.68ID:zopwF6/i 実例出してくれれば解説できる・・・かも知れないw
233デフォルトの名無しさん
2022/06/17(金) 14:29:06.62ID:sTQyUMOv ソースを貼らないワカランゴよ
234デフォルトの名無しさん
2022/06/17(金) 15:09:02.12ID:SEHo94h9 スマソ、C++11じゃなくてC++14だた
vector<int> unkos;
for each (auto unko in unkos) { }
これがエラー出てコンパイル通らない
環境が壊れてるんかな?
IDEはVS2022 17.2.4
vector<int> unkos;
for each (auto unko in unkos) { }
これがエラー出てコンパイル通らない
環境が壊れてるんかな?
IDEはVS2022 17.2.4
235デフォルトの名無しさん
2022/06/17(金) 15:34:14.31ID:tDJ88+fU C#かなんかと混ざってない?
vector<int> unkos;
for(auto unko : unkos) { }
vector<int> unkos;
for(auto unko : unkos) { }
236デフォルトの名無しさん
2022/06/17(金) 15:55:37.01ID:SEHo94h9 しょっちゅうC++とC#往復するから頭おかしくなるな
でもコードスニペットで自動的にfor each (auto unko in unkos)みたいな構文に補完されるんだよね
てか以前までこれでビルド通ってたし
VSのバグかな?
でもコードスニペットで自動的にfor each (auto unko in unkos)みたいな構文に補完されるんだよね
てか以前までこれでビルド通ってたし
VSのバグかな?
237蟻人間 ◆T6xkBnTXz7B0
2022/06/17(金) 16:03:50.87ID:GnCwfahh 拡張子間違ってない?
238デフォルトの名無しさん
2022/06/17(金) 16:10:31.33ID:SEHo94h9 確認したけど.cppと.hで試してる
C++17まではビルド通るけどC++20にするとエラーだわ
C++17まではビルド通るけどC++20にするとエラーだわ
239デフォルトの名無しさん
2022/06/17(金) 16:18:22.80ID:G79h5Zer C++11 以前はもう忘れていいとは思うけど
以前と以降の違いは知ってた方が良いとも思う
以前と以降の違いは知ってた方が良いとも思う
240デフォルトの名無しさん
2022/06/17(金) 16:19:50.60ID:2abskYGH for each inはmsvcの独自拡張らしいな
241デフォルトの名無しさん
2022/06/17(金) 16:20:08.55ID:G79h5Zer >C++17まではビルド通るけど
マジか?
マジか?
242デフォルトの名無しさん
2022/06/17(金) 16:38:08.56ID:SEHo94h9243デフォルトの名無しさん
2022/06/17(金) 17:16:26.61ID:iqIqAnpY 参照&とか、左辺値とか、moveとか、copyとか、体系的に学びたいんだけど、
その辺、いいKindle本ない?
オススメない?
その辺、いいKindle本ない?
オススメない?
244デフォルトの名無しさん
2022/06/17(金) 17:24:24.76ID:G79h5Zer その質問が出て来る時点で既に体系的に知ってるだろ
245デフォルトの名無しさん
2022/06/17(金) 17:42:51.03ID:2abskYGH C++の書籍紙の本ばっかだよな
ネット上のドキュメント漁れって事なんだろうけど
ネット上のドキュメント漁れって事なんだろうけど
246243
2022/06/17(金) 18:07:25.78ID:iqIqAnpY C++をclassの使えるCとしか使ってなくて(そんなに使ってない)、
んで参照&を使った左辺値?を見よう見真似で使ったんだけと、うまくいかなくて(結局ポインタを使った参照を使いました)
あとRustの本読んだらmove、copyを知って、その概念はC++でもあるとどこかで見て、体系的に知りたいと思いました。
Webだと細切れなのでKindle本で読みたいと思います。
オライリーのEffective modern C++なんか適当でしょうか?
でもKindleないんだよなぁ
んで参照&を使った左辺値?を見よう見真似で使ったんだけと、うまくいかなくて(結局ポインタを使った参照を使いました)
あとRustの本読んだらmove、copyを知って、その概念はC++でもあるとどこかで見て、体系的に知りたいと思いました。
Webだと細切れなのでKindle本で読みたいと思います。
オライリーのEffective modern C++なんか適当でしょうか?
でもKindleないんだよなぁ
247デフォルトの名無しさん
2022/06/17(金) 18:20:30.66ID:sBNVv+WO kindleはないけど
オライリーは公式に電子書籍あるよ
オライリーは公式に電子書籍あるよ
248デフォルトの名無しさん
2022/06/17(金) 18:22:00.18ID:OGNvxC9Z 所有や共有の機能が欲しいなら shared_ptr 使えば良いだけだろ
249デフォルトの名無しさん
2022/06/17(金) 18:41:26.72ID:sTQyUMOv >>234
こ、こんな裏技が((( ;゚Д゚)))
こ、こんな裏技が((( ;゚Д゚)))
250デフォルトの名無しさん
2022/06/17(金) 18:48:02.47ID:OGNvxC9Z それはつまりinが予約語になっているってことでもあるのかな
251デフォルトの名無しさん
2022/06/17(金) 18:53:09.50ID:aIhMpcwB C++/CLIなんじゃないの
252デフォルトの名無しさん
2022/06/17(金) 19:29:48.79ID:SEHo94h9 いや、たしかに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アプデが原因っぽい感じするし、大人しく推奨の構文使うようにするよ
お騒がせしてスマソ
数年前から使ってる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アプデが原因っぽい感じするし、大人しく推奨の構文使うようにするよ
お騒がせしてスマソ
253デフォルトの名無しさん
2022/06/17(金) 19:38:58.95ID:bL392TY5254デフォルトの名無しさん
2022/06/17(金) 19:41:36.72ID:bL392TY5255デフォルトの名無しさん
2022/06/17(金) 19:48:56.19ID:sTQyUMOv >>254
両方使えるって書いてあるけど
> この非標準のキーワードは、C++/CLI プロジェクトと C++ ネイティブ プロジェクトの両方で使用できます。 ただし、これを使用することはお勧めしません。
両方使えるって書いてあるけど
> この非標準のキーワードは、C++/CLI プロジェクトと C++ ネイティブ プロジェクトの両方で使用できます。 ただし、これを使用することはお勧めしません。
256はちみつ餃子 ◆8X2XSCHEME
2022/06/17(金) 19:50:56.98ID:Ic1RtTnb >>246
「江添亮のC++入門」は比較的ハードルが低く基礎を理解できるように書かれてると思う。
(別途学習する前提で継承まわりをごっそりと省いたりしてるけど……)
元になった原稿は無料で公開されてて、 Markdown で書かれているので
適当なツールを使えば Kindle で読める形式にもできるんじゃないかな。
「江添亮のC++入門」は比較的ハードルが低く基礎を理解できるように書かれてると思う。
(別途学習する前提で継承まわりをごっそりと省いたりしてるけど……)
元になった原稿は無料で公開されてて、 Markdown で書かれているので
適当なツールを使えば Kindle で読める形式にもできるんじゃないかな。
257デフォルトの名無しさん
2022/06/17(金) 19:59:43.68ID:SEHo94h9 >>254
コード読めるのに文章読めないの?
コード読めるのに文章読めないの?
258デフォルトの名無しさん
2022/06/17(金) 20:05:32.50ID:wjEVmEJW C++/CLIはC++20で見捨てられてるので強制的にC++17としてコンパイルされる
昔から使ってるvcxprojなら知らん間に追加のオプションつけてたり、今のVSで規定値が変わったりしてるだろうからビルドが通らないのもありうる。
ちょっとしたプログラムならwandboxとかでgcc/clang試してみてもいいんじゃない?
MSVCは独自拡張とか、標準ライブラリでも新しいバージョンのものを先行実装してたりするよ
昔から使ってるvcxprojなら知らん間に追加のオプションつけてたり、今のVSで規定値が変わったりしてるだろうからビルドが通らないのもありうる。
ちょっとしたプログラムならwandboxとかでgcc/clang試してみてもいいんじゃない?
MSVCは独自拡張とか、標準ライブラリでも新しいバージョンのものを先行実装してたりするよ
259はちみつ餃子 ◆8X2XSCHEME
2022/06/17(金) 20:06:26.13ID:Ic1RtTnb MSVC を使ってないからよう知らんけど拡張を抑制するオプションとかないの?
260デフォルトの名無しさん
2022/06/17(金) 20:22:45.13ID:k/CpGzsk C++/CLIはC++ではないのだよ!
261デフォルトの名無しさん
2022/06/17(金) 20:37:27.17ID:2abskYGH 日本語読めない奴が多いなしかし
262デフォルトの名無しさん
2022/06/17(金) 23:05:28.99ID:nJOnHnXa C++/CLI捨てられちゃうのか
じゃあ今後C#とかとのグルーには何使えばいいの?
じゃあ今後C#とかとのグルーには何使えばいいの?
263デフォルトの名無しさん
2022/06/17(金) 23:21:00.48ID:cGGfCEhk 漢は黙ってP/Invoke
264デフォルトの名無しさん
2022/06/17(金) 23:39:45.06ID:OGNvxC9Z 中国人じゃない人はどうすればいいですか?
265デフォルトの名無しさん
2022/06/17(金) 23:43:23.56ID:+i8GyaaY 中国人に非ずば人に非ず。
266デフォルトの名無しさん
2022/06/17(金) 23:57:35.61ID:OGNvxC9Z PCREやbregonig.dllなどのPerl互換正規表現ライブラリでは、日本の漢字と中国の汉字が同じ\p{Han}に一絡げにされてるから注意しなよ
267デフォルトの名無しさん
2022/06/18(土) 20:22:14.05ID:jYGrUTdl ユニコードだからってことじゃなくて?
268デフォルトの名無しさん
2022/06/19(日) 08:07:25.77ID:w/1mSXjt www.mercari.com/jp/search/?keyword=hr400p
こういう安い中古チューナ買って、Coinyをスカパープレミアム放送のICカード化して、
スカパープレミアムのチャンネル全部見れるし、USB HDDに録画フリー。
【avoCADO】 Coiny card Part4【仮想通貨】
https://mevius.5ch.net/test/read.cgi/avi/1640762750/
こういう安い中古チューナ買って、Coinyをスカパープレミアム放送のICカード化して、
スカパープレミアムのチャンネル全部見れるし、USB HDDに録画フリー。
【avoCADO】 Coiny card Part4【仮想通貨】
https://mevius.5ch.net/test/read.cgi/avi/1640762750/
269デフォルトの名無しさん
2022/06/19(日) 09:39:07.73ID:G0R2gGHa 誤爆かな
270デフォルトの名無しさん
2022/06/19(日) 15:42:17.20ID:pCkywCXr 夏休みの自由研究の成果を今ここに発表するのぜ、
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倍速、
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倍速、
271デフォルトの名無しさん
2022/06/19(日) 15:42:37.86ID:pCkywCXr 計測条件:
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マクロ定義をコメントアウト。元に戻せば前と同じになる。)
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マクロ定義をコメントアウト。元に戻せば前と同じになる。)
272デフォルトの名無しさん
2022/06/19(日) 15:44:13.95ID:pCkywCXr つなみに同じような調子で時間計測すると、(コードは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倍を達成したのであった、
■ 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倍を達成したのであった、
273デフォルトの名無しさん
2022/06/19(日) 15:57:54.28ID:pCkywCXr じつはさらに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キャッシュ間の帯域をうまいぐあいに有効活用してくれているっぽい
ここらになってくると詳細は調べようが無いので漏れもソフトウェアー呪術者にならざるおえない
どうも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キャッシュ間の帯域をうまいぐあいに有効活用してくれているっぽい
ここらになってくると詳細は調べようが無いので漏れもソフトウェアー呪術者にならざるおえない
274デフォルトの名無しさん
2022/06/21(火) 20:57:53.90ID:MIxQo51/ そっか頑張ったね
275デフォルトの名無しさん
2022/06/21(火) 21:17:43.90ID:EegZBjzo 相変わらず漏れとか加齢臭するスラング使ってんのか
276デフォルトの名無しさん
2022/06/21(火) 21:26:26.57ID:5USpVKBQ 初老の漏れ易いジジイなんだろ
察して差し上げろ
察して差し上げろ
277デフォルトの名無しさん
2022/06/21(火) 23:41:17.67ID:Nd0elFbL 内容に関係のないクソみたいな指摘しかできないお前らも大概終わってるけどな
まあこんなとこじゃなくてブログとかSNSにまとめろよとは思う
まあこんなとこじゃなくてブログとかSNSにまとめろよとは思う
278デフォルトの名無しさん
2022/06/22(水) 00:04:15.50ID:nUS9+NCG ジジイだから周りのこととかスレの流れとか見えてないんだろう
前頭葉が加齢で萎縮して空気を読む能力が衰えたのかな
前頭葉が加齢で萎縮して空気を読む能力が衰えたのかな
279デフォルトの名無しさん
2022/06/22(水) 02:07:39.75ID:mxrPsC3u >>277
> 内容に関係のないクソみたいな指摘しかできない
ハァ?
文盲じゃなかったら本人だろコイツ
1の乗根じゃなくて整数環でFFTした方が誤差の意味でも速度の意味でも劇的に改善するって何度も指摘してるんだが
> 内容に関係のないクソみたいな指摘しかできない
ハァ?
文盲じゃなかったら本人だろコイツ
1の乗根じゃなくて整数環でFFTした方が誤差の意味でも速度の意味でも劇的に改善するって何度も指摘してるんだが
280デフォルトの名無しさん
2022/06/22(水) 03:38:43.09ID:y9JQQK81281デフォルトの名無しさん
2022/06/23(木) 16:48:56.08ID:gevVgEYw どうでもいい言葉尻に突っかかるやつ
若さを自慢したつもりになってるの?
尻の青さをバカにされてるだけだよ
若さを自慢したつもりになってるの?
尻の青さをバカにされてるだけだよ
282デフォルトの名無しさん
2022/06/23(木) 18:18:04.50ID:5dy8Tjxk プログラマの発言じゃないな
プログラムは1文字のタイプミスで全く違う挙動になるのだから
プログラムは1文字のタイプミスで全く違う挙動になるのだから
283デフォルトの名無しさん
2022/06/23(木) 18:26:17.60ID:rC+mT8P4 偶によくC++読み書き出来ない奴がレスしてるんだけどどっから湧いてきてんの
いよいよ Java のクラスライブラリを C++ に移植しようと思っていますが、需要はありますか?
そろそろ共通のクラスライブラリが確立されてもいいと思っているのですが、あまりそんな話がないのが不思議です
そろそろ共通のクラスライブラリが確立されてもいいと思っているのですが、あまりそんな話がないのが不思議です
285デフォルトの名無しさん
2022/06/23(木) 22:23:51.49ID:R7SBWA0E 需要あるのでよろしくお願いします
286デフォルトの名無しさん
2022/06/23(木) 22:27:04.30ID:YY1MWhdq がんばれ!
287デフォルトの名無しさん
2022/06/23(木) 22:59:01.86ID:lRxLFmXq stdやboostじゃ不足か?
288デフォルトの名無しさん
2022/06/23(木) 23:46:22.08ID:Q9NpIN8Z289デフォルトの名無しさん
2022/06/24(金) 00:00:51.28ID:KtheM8QT290デフォルトの名無しさん
2022/06/24(金) 00:02:46.32ID:KtheM8QT >>288
性能よりも、各言語で名前と機能の紐づけが共通することを優先します
性能よりも、各言語で名前と機能の紐づけが共通することを優先します
291デフォルトの名無しさん
2022/06/24(金) 00:17:55.81ID:0z9KCe6G Javaクラスどうこうよりもfinallyステートメントをどうするかなんでは
292デフォルトの名無しさん
2022/06/24(金) 10:21:14.00ID:ZX81zd9Z >>291
ああ、それ、ありましたね finally か、結構重たい課題ですね
ああ、それ、ありましたね finally か、結構重たい課題ですね
293デフォルトの名無しさん
2022/06/24(金) 10:44:21.40ID:K2we1Lar お願いですから名前は短くしてくださいね
294デフォルトの名無しさん
2022/06/24(金) 13:31:54.09ID:dbAYBMOA >>282
template <typename T> を template <class T> と書いただけでジジイ呼ばわりするようなもんだぞ
誰もtypoの話なんかしてない
あ、1人だけいるのかw
template <typename T> を template <class T> と書いただけでジジイ呼ばわりするようなもんだぞ
誰もtypoの話なんかしてない
あ、1人だけいるのかw
295デフォルトの名無しさん
2022/06/24(金) 14:41:08.15ID:frIgvkyi ?
typename と書く方が文法的に新しいの?
typename と書く方が文法的に新しいの?
296はちみつ餃子 ◆8X2XSCHEME
2022/06/24(金) 15:47:15.76ID:STd+R5JH297デフォルトの名無しさん
2022/06/24(金) 18:40:02.03ID:dbAYBMOA >>295
CでC89以前にK&R Cがあったように
C++でもC++98以前にARM C++があった
ISO限定で言うと餃子の言うようになるが
もっと遡るとtypenameは後からできたもので
ARM C++では<class T>という書き方しかできなかった
CでC89以前にK&R Cがあったように
C++でもC++98以前にARM C++があった
ISO限定で言うと餃子の言うようになるが
もっと遡るとtypenameは後からできたもので
ARM C++では<class T>という書き方しかできなかった
298デフォルトの名無しさん
2022/06/24(金) 21:00:22.61ID:VuV41aeC 三十年くらい前にC++primerだったかな?
「typenameとclassならclassのほうで書いとけ、
なぜならタイプ数が少ないから」
みたいに書いてるところがあって(半分ジョークなんだろうな)
最初にそれで刷り込まれてるからclassでしか書いたことない
「typenameとclassならclassのほうで書いとけ、
なぜならタイプ数が少ないから」
みたいに書いてるところがあって(半分ジョークなんだろうな)
最初にそれで刷り込まれてるからclassでしか書いたことない
299デフォルトの名無しさん
2022/06/24(金) 21:15:01.67ID:uqZOpMdD structと書くことも
300デフォルトの名無しさん
2022/06/24(金) 22:03:13.47ID:JvzMg+3d C++ってstaticメソッド継承されますっけ?
Parent.Hoge()ってChild.Hoge()としても呼べます?
あるスクリプト言語を使ってた時にどうやら継承されてなかったようで、言語ごとに違うのか気になりました
Parent.Hoge()ってChild.Hoge()としても呼べます?
あるスクリプト言語を使ってた時にどうやら継承されてなかったようで、言語ごとに違うのか気になりました
301デフォルトの名無しさん
2022/06/24(金) 22:13:15.23ID:zVbF8VlC はい。
302はちみつ餃子 ◆8X2XSCHEME
2022/06/24(金) 22:31:13.16ID:STd+R5JH 型引数は class と書いてあってもクラスに分類されない型 (スカラ型など) を受け取れるのでなんか変な気分ではあるな……。
それでも私は class キーワード派だけど。
それでも私は class キーワード派だけど。
303デフォルトの名無しさん
2022/06/24(金) 22:46:12.30ID:TGTBUWMm modern C++ designの著者は、ユーザー定義型のみを想定してる場合はclass,
組み込み型も想定してる場合はtypenameにしてると書いてたな
組み込み型も想定してる場合はtypenameにしてると書いてたな
304デフォルトの名無しさん
2022/06/24(金) 23:16:18.24ID:jv7PClvp 今はそういうのはコンセプトの仕事だからなあ
305デフォルトの名無しさん
2022/06/25(土) 10:55:48.71ID:23CjKpU2 >>300
private とか protected とか知ってるか
private とか protected とか知ってるか
306デフォルトの名無しさん
2022/06/25(土) 11:54:25.28ID:xaZtK0Rm private踏んだりしたらエラーメッセージ見れば済む話だと思うが
class継承のときのpublicつけ忘れでprivate扱いになるのはやらかしてそう
class C{
public: static void f(){}
};
class D : public C{};
int main(){D::f();}
class継承のときのpublicつけ忘れでprivate扱いになるのはやらかしてそう
class C{
public: static void f(){}
};
class D : public C{};
int main(){D::f();}
307デフォルトの名無しさん
2022/06/25(土) 12:22:32.29ID:UASxpJXI >>306
エラーにならんが、何が言いたい?
エラーにならんが、何が言いたい?
308デフォルトの名無しさん
2022/06/25(土) 13:43:07.60ID:xaZtK0Rm309デフォルトの名無しさん
2022/06/25(土) 13:45:13.45ID:KYOYlq4y static関係なくね?
310デフォルトの名無しさん
2022/06/25(土) 13:48:22.71ID:23CjKpU2 publicつけ忘れで
311デフォルトの名無しさん
2022/06/25(土) 13:49:20.71ID:23CjKpU2312デフォルトの名無しさん
2022/06/25(土) 17:46:22.26ID:x+PfXs9r >>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で激速化することを極めんとしているわけや;;;
数論変換はしばし待たれよ卿、
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で激速化することを極めんとしているわけや;;;
313デフォルトの名無しさん
2022/06/25(土) 17:47:57.25ID:x+PfXs9r それと>>279の口ぶりでは数論変換にしたら桁違いに早くなるみたいに読めるが
double同士の掛け算2^15回分が
int64同士の掛け算2^15回分に高速化される程度であって現行のレコード145 秒が100 秒切れるようになるか
っていうとビミョー
はい論破、
double同士の掛け算2^15回分が
int64同士の掛け算2^15回分に高速化される程度であって現行のレコード145 秒が100 秒切れるようになるか
っていうとビミョー
はい論破、
314デフォルトの名無しさん
2022/06/25(土) 18:01:39.85ID:x+PfXs9r >>302の行間に書いてある通り、型引数意外の状況でだがtypenameキーワードが必要なケースが存在する
ていうかこれ↓
https://faithandbrave.hateblo.jp/entry/20080129/1201597743
逆に言うと
それ以外ならclassでええやん、、、
ていうかこれ↓
https://faithandbrave.hateblo.jp/entry/20080129/1201597743
逆に言うと
それ以外ならclassでええやん、、、
315デフォルトの名無しさん
2022/06/25(土) 18:04:28.52ID:x+PfXs9r316デフォルトの名無しさん
2022/06/25(土) 18:25:49.29ID:XIyeaAEp またくっさいチラ裏ジジイが湧いたのか
317デフォルトの名無しさん
2022/06/25(土) 18:35:28.83ID:x+PfXs9r ハイハイここは高尚なインターネッツでつね;;;
318デフォルトの名無しさん
2022/06/25(土) 19:23:01.22ID:/zwkJ/mi319デフォルトの名無しさん
2022/06/25(土) 20:46:58.51ID:JEWFr+UF >>317
相変わらず誤字を直せねーのな
相変わらず誤字を直せねーのな
320デフォルトの名無しさん
2022/06/25(土) 21:53:15.48ID:cTvyoIxe 次のセールってハロウィンなっちゃう?
321デフォルトの名無しさん
2022/06/25(土) 23:44:17.32ID:BChKe9nl 何の?
322デフォルトの名無しさん
2022/06/27(月) 01:22:11.44ID:lmKSzJyY steamかな
323デフォルトの名無しさん
2022/06/29(水) 12:39:09.60ID:CyBPFABm >>300
>C++ってstaticメソッド継承されますっけ?
継承と言うか「可視」ではある。
>Parent.Hoge()ってChild.Hoge()としても呼べます?
staticメンバを参照したい場合は、インスタンス・メンバとは書き方が違って、
Parent::Hoge() や Child::Hoge()
と書く。
でも微妙だな、Child::Hoge()で呼び出せるかどうか、実験の必要はある。
>C++ってstaticメソッド継承されますっけ?
継承と言うか「可視」ではある。
>Parent.Hoge()ってChild.Hoge()としても呼べます?
staticメンバを参照したい場合は、インスタンス・メンバとは書き方が違って、
Parent::Hoge() や Child::Hoge()
と書く。
でも微妙だな、Child::Hoge()で呼び出せるかどうか、実験の必要はある。
324デフォルトの名無しさん
2022/07/01(金) 12:57:20.10ID:Niu9C9y8 インスタンスからも static メソッドは呼び出せるよ
https://ideone.com/tpA9jy
https://ideone.com/tpA9jy
325デフォルトの名無しさん
2022/07/01(金) 14:54:49.17ID:oLSBM8mZ >>323
なぜ継承を可視と言い直すんだ?
なぜ継承を可視と言い直すんだ?
326デフォルトの名無しさん
2022/07/01(金) 14:57:39.83ID:to5rXuQ/ ヴァーチャンが使えないからだろ
327デフォルトの名無しさん
2022/07/03(日) 05:57:55.66ID:S0pZ0Csa C++コンパイラっていつからconst char*型引数がbool型引数に暗黙変換されるようになったんだ?
以下のような内容が警告なしでコンパイルできてしまうんだが
int foo(bool bar);
const char* ptr = "test";
foo(ptr);
以下のような内容が警告なしでコンパイルできてしまうんだが
int foo(bool bar);
const char* ptr = "test";
foo(ptr);
328デフォルトの名無しさん
2022/07/03(日) 07:53:18.35ID:K2/9xttr スカラ型がboolに暗黙変換できるのは太古から変わってない
int (*p)(bool) = foo;
std::cout << foo; //出力は「1」だがfooが1番地から開始ということではない
int (*p)(bool) = foo;
std::cout << foo; //出力は「1」だがfooが1番地から開始ということではない
329デフォルトの名無しさん
2022/07/03(日) 07:54:43.51ID:K2/9xttr pいらんかったな、わりいわりいw
330デフォルトの名無しさん
2022/07/04(月) 13:56:35.75ID:QZHaDXek みなさまこんにちわ!
暑い日が続きますが質問させてください。
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ポインタ関連の記述をコメントアウトさせると普通に動作するので、大まかなコード自体は問題ないと思うのですが……
リインタプリットキャストも出来ず困り果てておりますが、名前空間内部のメンバにポインタは持たせない方がいいのでしょうか?
それとも名前空間での不完全クラスでの定義がまずいんでしょうか?
ほとほと困り果てております。
わかる方がいらっしゃいましたらお教えいただけれう゛ぁ……
先感謝!
暑い日が続きますが質問させてください。
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ポインタ関連の記述をコメントアウトさせると普通に動作するので、大まかなコード自体は問題ないと思うのですが……
リインタプリットキャストも出来ず困り果てておりますが、名前空間内部のメンバにポインタは持たせない方がいいのでしょうか?
それとも名前空間での不完全クラスでの定義がまずいんでしょうか?
ほとほと困り果てております。
わかる方がいらっしゃいましたらお教えいただけれう゛ぁ……
先感謝!
332デフォルトの名無しさん
2022/07/04(月) 14:31:47.29ID:SMoN2Nle へたくそ
333デフォルトの名無しさん
2022/07/04(月) 17:28:39.11ID:nt0V70V1 どっかで
namespace hoge{
class member_ptr;
}
class member_ptr;
みたいなことやってるような気がする
前方宣言(か実体定義)が別の名前空間にあって、同じclassを見てるつもりで別のclassを見ているだけじゃない?
namespace hoge{
class member_ptr;
}
class member_ptr;
みたいなことやってるような気がする
前方宣言(か実体定義)が別の名前空間にあって、同じclassを見てるつもりで別のclassを見ているだけじゃない?
334デフォルトの名無しさん
2022/07/04(月) 17:47:01.88ID:KuJlBNV3 >>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;
}
//↑この定義部分で「宣言に互換性がありません」というエラーが出てしまいます
長文になってしまいますがお許しください。
───────────────
//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;
}
//↑この定義部分で「宣言に互換性がありません」というエラーが出てしまいます
335はちみつ餃子 ◆8X2XSCHEME
2022/07/04(月) 18:04:55.71ID:3k8jHKP2 >>334
class キーワードを付けた場合にはクラスの宣言を同時にしたものとみなされる。
つまり class ptr* get_mPtr(); と class ptr* mPtr; は「このスコープで」 ptr を宣言したかのように扱われる。
もちろん実際には innerTest の中では ptr の定義はないので不完全型のままだが、
この ptr は Test::innerTest::ptr のつもりで解釈されてる。
グローバル空間で定義している ptr とは別物なので別物というエラーになるわけ。
class キーワードを付けた場合にはクラスの宣言を同時にしたものとみなされる。
つまり class ptr* get_mPtr(); と class ptr* mPtr; は「このスコープで」 ptr を宣言したかのように扱われる。
もちろん実際には innerTest の中では ptr の定義はないので不完全型のままだが、
この ptr は Test::innerTest::ptr のつもりで解釈されてる。
グローバル空間で定義している ptr とは別物なので別物というエラーになるわけ。
336デフォルトの名無しさん
2022/07/04(月) 18:34:14.66ID:PrdXwxk2 class ptr;
namespace Test {
...
namespace Test {
...
337デフォルトの名無しさん
2022/07/04(月) 18:53:01.66ID:tfDB1jS/ Cのstructと同じ感覚でclassって書いちゃってるのかこれ
338デフォルトの名無しさん
2022/07/04(月) 18:59:50.67ID:XQTVc721 >>335
> この ptr は Test::innerTest::ptr のつもりで解釈されてる。
Test::ptr だね。
https://timsong-cpp.github.io/cppwp/n4861/basic.scope.pdecl#7.2
> この ptr は Test::innerTest::ptr のつもりで解釈されてる。
Test::ptr だね。
https://timsong-cpp.github.io/cppwp/n4861/basic.scope.pdecl#7.2
339デフォルトの名無しさん
2022/07/04(月) 19:27:20.38ID:KuJlBNV3 >>335!336,338
ありがとうございます!
おっしゃる通りに名前空間の外で前方宣言し、ソース部分で定義したらうまくいきました!
特に理由がない限り、名前空間内部で定義してはいけない(戒め)
ありがとうございました!
ありがとうございます!
おっしゃる通りに名前空間の外で前方宣言し、ソース部分で定義したらうまくいきました!
特に理由がない限り、名前空間内部で定義してはいけない(戒め)
ありがとうございました!
340デフォルトの名無しさん
2022/07/05(火) 15:17:54.21ID:CUrAgxNd 有害だな
341蟻人間 ◆T6xkBnTXz7B0
2022/07/05(火) 20:29:56.62ID:ol9myr0e You guy
342デフォルトの名無しさん
2022/07/05(火) 23:44:59.73ID:tIUWM2dq VB.NETからバイナリをC++(JNI)に渡して受け取ったバイナリをJavaに渡したいんですけど、C++で受け取ったBYTEをjobjectに変換する方法が分かりません。
どなたかご存知でしょうか。
どなたかご存知でしょうか。
343デフォルトの名無しさん
2022/07/06(水) 23:58:31.79ID:Hb7nTur+ C++勉強中です。ムーブコンストラクタについて教えてください。
ムーブコンストラクタは、要はムーブ元の指すポインタをムーブ先に変更しているだけだと思います。
これはconstなしコンストラクタでも実現できると思いますが、意図を明示するためにコンストラクタが分かれていると思っていいですか?
また、ムーブコンストラクタの仮引数が右辺値参照になっている(std::moveした右辺値を渡す)理由がよく分からないのですが、これは決まり文句として覚えるしかないでしょうか?
ムーブコンストラクタは、要はムーブ元の指すポインタをムーブ先に変更しているだけだと思います。
これはconstなしコンストラクタでも実現できると思いますが、意図を明示するためにコンストラクタが分かれていると思っていいですか?
また、ムーブコンストラクタの仮引数が右辺値参照になっている(std::moveした右辺値を渡す)理由がよく分からないのですが、これは決まり文句として覚えるしかないでしょうか?
344デフォルトの名無しさん
2022/07/07(木) 00:12:38.45ID:wEF1aVE0345デフォルトの名無しさん
2022/07/07(木) 00:13:26.51ID:owvrtcUU ムーブって、所有者が移転してると考えた方が
場所なんてどうでもいいでしょう
場所なんてどうでもいいでしょう
346はちみつ餃子 ◆8X2XSCHEME
2022/07/07(木) 00:38:46.12ID:6JbvD3+y >>343
右辺値は大抵の場合に一時オブジェクトだからどうせすぐに破棄される。
後で別の場所で使うということがないと期待できるから内容を移動してしまっても問題にならないんだ。
だから右辺値を入力とするときは原則としてムーブ扱いにする。
右辺値は大抵の場合に一時オブジェクトだからどうせすぐに破棄される。
後で別の場所で使うということがないと期待できるから内容を移動してしまっても問題にならないんだ。
だから右辺値を入力とするときは原則としてムーブ扱いにする。
347デフォルトの名無しさん
2022/07/07(木) 08:00:15.88ID:dqsYDet1 多分、右辺値参照イコールmoveと覚えてしまってるのでは?
C++11より前は一時オブジェクトとそうでないものを文法上区別することが出来なかったのよ
moveはあくまでキャストに過ぎない、一時オブジェクトでないものを一時オブジェクト扱いにしてるだけ
C++11より前は一時オブジェクトとそうでないものを文法上区別することが出来なかったのよ
moveはあくまでキャストに過ぎない、一時オブジェクトでないものを一時オブジェクト扱いにしてるだけ
348343
2022/07/07(木) 23:27:53.10ID:jxXWRXC4 一時オブジェクトにキャストしてすぐ破棄されるようにしたと言っても、
右辺値参照に代入しているのでヌルポインタにするまでは使い続けられますよね
そもそもstd::moveで一時オブジェクトにキャスト、これを右辺値参照で束縛して有効期間を延ばす…って
初めから普通の変数を使えばいいのでは?と思ってしまいました
ムーブを表すための仕組みとして&&とstd::moveの組み合わせが追加されたということなんでしょうかね
右辺値参照に代入しているのでヌルポインタにするまでは使い続けられますよね
そもそもstd::moveで一時オブジェクトにキャスト、これを右辺値参照で束縛して有効期間を延ばす…って
初めから普通の変数を使えばいいのでは?と思ってしまいました
ムーブを表すための仕組みとして&&とstd::moveの組み合わせが追加されたということなんでしょうかね
349デフォルトの名無しさん
2022/07/07(木) 23:44:43.71ID:a8KVNXrY >>348
結局そのあたりも含めてC++で複雑化した様々な点を全てシンプルに綺麗に整理し直して分かりやすくした言語が望まれてRustが登場したんだろうね
結局そのあたりも含めてC++で複雑化した様々な点を全てシンプルに綺麗に整理し直して分かりやすくした言語が望まれてRustが登場したんだろうね
351はちみつ餃子 ◆8X2XSCHEME
2022/07/08(金) 00:21:33.36ID:5BE4kGYi352デフォルトの名無しさん
2022/07/08(金) 06:38:25.68ID:MdbO63iw 教科書の言葉適当に並べて分かったふりしてる感がすごい
353デフォルトの名無しさん
2022/07/08(金) 08:04:48.18ID:0Bd0SGWI ムーブは「所有権」をムーブさせるものなので、所有権という概念がないと理解できん
354デフォルトの名無しさん
2022/07/08(金) 08:29:23.83ID:ZqNcNR35355デフォルトの名無しさん
2022/07/08(金) 09:59:25.74ID:XQyLgyG5356デフォルトの名無しさん
2022/07/08(金) 10:12:31.24ID:yJZoYI93 rustのご本が高くてのう
357デフォルトの名無しさん
2022/07/08(金) 10:20:08.07ID:u/BCh/UE 右辺値参照って概念的に難しいよね
そもそも右辺値とはなんぞやというところから、一時オブジェクトの生成とそれが破棄されるまでのコンパイラ側の仕組みを的確に理解する必要がある
こんなのよく思いついたなと感心はするけどw
そもそも右辺値とはなんぞやというところから、一時オブジェクトの生成とそれが破棄されるまでのコンパイラ側の仕組みを的確に理解する必要がある
こんなのよく思いついたなと感心はするけどw
358デフォルトの名無しさん
2022/07/08(金) 10:47:23.92ID:lp4DRBe8 テンプレート関数で頻繁に出現する=演算子コピーによるオーバーヘッドを減らす必要に迫られただけの話ジャマイカ?
359デフォルトの名無しさん
2022/07/08(金) 10:52:14.97ID:u4+He/YT >>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/
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/
360デフォルトの名無しさん
2022/07/08(金) 12:00:52.61ID:u/BCh/UE >>353
「所有権」って言っちゃうと誤解を生むような気がする
実体としてはデストラクタを呼ぶ権利だよね
インスタンス自体は(通常)スタック上に確保されているので、その所有権の移動まではできない
だからこそ「参照」なんだけども
「所有権」って言っちゃうと誤解を生むような気がする
実体としてはデストラクタを呼ぶ権利だよね
インスタンス自体は(通常)スタック上に確保されているので、その所有権の移動まではできない
だからこそ「参照」なんだけども
361デフォルトの名無しさん
2022/07/08(金) 13:38:22.19ID:GovhUdR1 デストラクタを呼ぶ権利だなんてお前も理解してないだろ
362デフォルトの名無しさん
2022/07/08(金) 15:16:55.64ID:bBPWEvXX363デフォルトの名無しさん
2022/07/08(金) 16:27:06.32ID:VZayErSn >>362
移譲という概念はない
C/C++もRustも同じで&を付けて&varnameの形で渡せば参照渡しとなる
同じ形なので全く違和感はない
所有権を手放さないで渡すには参照渡ししかないのだからその場合は&を付ければよい
もちろんプログラミング言語によって異なる部分もあるのは当然
そんな些細なことを違和感と言うのは極少数の類似言語しか知らないと言ってるようなもの
移譲という概念はない
C/C++もRustも同じで&を付けて&varnameの形で渡せば参照渡しとなる
同じ形なので全く違和感はない
所有権を手放さないで渡すには参照渡ししかないのだからその場合は&を付ければよい
もちろんプログラミング言語によって異なる部分もあるのは当然
そんな些細なことを違和感と言うのは極少数の類似言語しか知らないと言ってるようなもの
364デフォルトの名無しさん
2022/07/08(金) 16:46:29.18ID:MdbO63iw まあ所有権というよりは「後始末をする義務」だよな
日常的にポイ捨てしてるモラルの低い人間にはピンとこないかもしれない
日常的にポイ捨てしてるモラルの低い人間にはピンとこないかもしれない
365デフォルトの名無しさん
2022/07/08(金) 17:07:32.78ID:d0X5Obt/ 誰が持ってるかわからんよりは、絶対渡すと決めたほうが安全な気はする
366デフォルトの名無しさん
2022/07/08(金) 23:52:34.56ID:J0vSCVey >>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での引数などの渡し方の表記方法は上述のようになっている
それは非常にシンプルで突き詰めれば値渡しと参照渡しの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での引数などの渡し方の表記方法は上述のようになっている
367343
2022/07/09(土) 00:02:30.53ID:h3YKvoyj 理解してから質問させてもらったつもりなんですが、まだ全然だったようです
確かに所有権という概念を理解していません
勉強してから出直します
ありがとうございました
確かに所有権という概念を理解していません
勉強してから出直します
ありがとうございました
368デフォルトの名無しさん
2022/07/09(土) 00:12:24.76ID:GNVCknQf void君復帰したん?
369デフォルトの名無しさん
2022/07/09(土) 09:11:51.90ID:6ug5/LDh はつみみです。
370デフォルトの名無しさん
2022/07/09(土) 10:56:35.87ID:xh0VR/GV371デフォルトの名無しさん
2022/07/09(土) 11:11:15.93ID:tUS5A0PY move の挙動を「C言語レベルの基本の」サンプルコードで理解できたら画期的だなあ笑
372デフォルトの名無しさん
2022/07/09(土) 11:26:32.90ID:v7oB8mPb Cにはそもそもオーバーロードがないからなあ
373デフォルトの名無しさん
2022/07/09(土) 12:51:52.12ID:l8dyP7Xp374デフォルトの名無しさん
2022/07/09(土) 12:55:08.37ID:GKrnmeJx 所有権ってデストラクタで破棄する義務を負う、権利とは名ばかりな概念でしょ
375デフォルトの名無しさん
2022/07/09(土) 13:07:46.27ID:nKY2xH6j 昔はリファレンスカウンタでやってたな
376デフォルトの名無しさん
2022/07/09(土) 13:45:41.58ID:CWVMe8St 自分から破棄しない限りはアクセスできることが保証されるから権利ではあるな
377デフォルトの名無しさん
2022/07/09(土) 14:00:45.40ID:GKrnmeJx オプーナを買う権利をやろう
378デフォルトの名無しさん
2022/07/09(土) 14:07:45.84ID:p9oybaSY エナジーボンボンはCodeVeinに出てくる赤い玉だったんだよ
379デフォルトの名無しさん
2022/07/09(土) 16:17:17.24ID:vntA8Dp0380デフォルトの名無しさん
2022/07/11(月) 10:49:23.74ID:1W23UOpt >>358
ほんそれ
ほんそれ
381デフォルトの名無しさん
2022/07/11(月) 10:51:27.98ID:1W23UOpt >>364
ほんそれ++
ほんそれ++
382デフォルトの名無しさん
2022/07/11(月) 21:11:34.35ID:dGJ2mZ34 =std::numeric_limits<decltype(ほんそれ)>::max()
383デフォルトの名無しさん
2022/07/16(土) 16:37:55.35ID:scS6hSP+ condition_variableってなんでわざわざmutexと一緒に定義しないといけないの面倒でしかたないんだけど。
しかもへんてこな目覚めがあるなんてバグを平然と放置してるし。
win32のSetEvent()のほうが俄然使いやすいんだけど。
しかもへんてこな目覚めがあるなんてバグを平然と放置してるし。
win32のSetEvent()のほうが俄然使いやすいんだけど。
384はちみつ餃子 ◆8X2XSCHEME
2022/07/16(土) 17:49:19.54ID:cnHD4OK4 mutex は排他の仕組みであって同期の仕組みと分離する思想なんじゃないかなぁ……。
あんまりイケてないとは思うけど。
あんまりイケてないとは思うけど。
385デフォルトの名無しさん
2022/07/16(土) 19:38:19.38ID:UNJL4ykU それはOSの問題なうえ、充分合理的な動作と認められている。
386デフォルトの名無しさん
2022/07/16(土) 21:13:53.10ID:cotnetTK へんてこな目覚めはなんで生じるのかは知らんなんか深い理由でもあるんじゃないのJK
それはおくとして、両者にはキューイングの思想の違いがまずありき、
[1] WindowsのSetEvent()はイベント発生をキューイングし、待機中スレッドをキューイングしない
[2] 条件変数はイベント発生をキューイングせず、待機中スレッドをキューイングする
これでかなりイベント発生と待機の組み合わせの性格の違いが出る。
[1]は待機中スレッドが無くともイベントをセットでき、その後最初に待ちに入ったスレッド1個が待ち解除される
[2]は待機中スレッドが無いとイベントが無視されるが、通知方法をnotify_one()だけでなくnotify_all()も選べる
[1]はWaitForMultipleObject()により1箇所の待機で複数種類のイベントを待ち受けられる(μITRONのイベントフラグ的な使い方ができる
が、[2]でそれをやろうとするとあるイベントでスレッドを起こしたら、そのスレッドの待機中スレッドとしてのキューイングを
他のイベントついてもクリアせねばならない、みたいな余計な処理が必要で効率的に実装できない
ということは、条件変数でWaitForMultipleObject()的なことをやろうとしたら、イベント要因を別途変数にセットして
待機中スレッドに伝える必要があり、この変数の操作→イベント待ち解除→解除されたスレッドが変数を参照、
というのをatomicにやらざるおえないから、ミューテックスのブロック内でイベントの待機とセットを行わねばならない仕様に、
なったと思う
それはおくとして、両者にはキューイングの思想の違いがまずありき、
[1] WindowsのSetEvent()はイベント発生をキューイングし、待機中スレッドをキューイングしない
[2] 条件変数はイベント発生をキューイングせず、待機中スレッドをキューイングする
これでかなりイベント発生と待機の組み合わせの性格の違いが出る。
[1]は待機中スレッドが無くともイベントをセットでき、その後最初に待ちに入ったスレッド1個が待ち解除される
[2]は待機中スレッドが無いとイベントが無視されるが、通知方法をnotify_one()だけでなくnotify_all()も選べる
[1]はWaitForMultipleObject()により1箇所の待機で複数種類のイベントを待ち受けられる(μITRONのイベントフラグ的な使い方ができる
が、[2]でそれをやろうとするとあるイベントでスレッドを起こしたら、そのスレッドの待機中スレッドとしてのキューイングを
他のイベントついてもクリアせねばならない、みたいな余計な処理が必要で効率的に実装できない
ということは、条件変数でWaitForMultipleObject()的なことをやろうとしたら、イベント要因を別途変数にセットして
待機中スレッドに伝える必要があり、この変数の操作→イベント待ち解除→解除されたスレッドが変数を参照、
というのをatomicにやらざるおえないから、ミューテックスのブロック内でイベントの待機とセットを行わねばならない仕様に、
なったと思う
387デフォルトの名無しさん
2022/07/16(土) 21:20:57.63ID:ucdNPaM6 それ隠蔽できるだろうけど、条件変数の基本要素がそれなんだからそういうもんです。
388デフォルトの名無しさん
2022/07/16(土) 21:25:01.45ID:cotnetTK しかしまあ普通にスレッドの中にイベント待ちを作ったら、
イベント要因は
(1) 本来のイベントの意味(複数かもしれん
(2) スレッド終了
の2種類は必ず生じるけどこのために2種類以上のイベントオブジェクトを設けてWaitForMultipleObject()で待機するのは
アフォらしいので結局条件変数的に、イベントオブジェクトは1個、イベント要因を表す変数が1個、みたいな形になって
条件変数と同じようなしくみに落ち着く
、希ガス
(ただしイベントオブジェクトとイベントを待つスレッドの実体が完全に1対1ならミューテックスによるガードは不要
イベント要因は
(1) 本来のイベントの意味(複数かもしれん
(2) スレッド終了
の2種類は必ず生じるけどこのために2種類以上のイベントオブジェクトを設けてWaitForMultipleObject()で待機するのは
アフォらしいので結局条件変数的に、イベントオブジェクトは1個、イベント要因を表す変数が1個、みたいな形になって
条件変数と同じようなしくみに落ち着く
、希ガス
(ただしイベントオブジェクトとイベントを待つスレッドの実体が完全に1対1ならミューテックスによるガードは不要
389デフォルトの名無しさん
2022/07/16(土) 21:52:02.32ID:ucdNPaM6 mutexないとあっちのスレッドが条件変えちゃうのでは
390デフォルトの名無しさん
2022/07/16(土) 22:02:42.26ID:cotnetTK イベント要因が3種類以上とかイベント発生と待機解除が必ず1対1でなければならない、みたいなケースを含むちょう一般論で言うとそうかorz
391デフォルトの名無しさん
2022/07/16(土) 22:31:27.60ID:ogh00ppx392デフォルトの名無しさん
2022/07/17(日) 03:07:07.04ID:1DOilu1h >>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)ならそういう問題が無い
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)ならそういう問題が無い
393デフォルトの名無しさん
2022/07/17(日) 03:32:35.77ID:RIt+yucv バトン持ってるやつが偉いというのはいいとして、バトンを途切れなく渡すための仕組みが要るんじゃ
394デフォルトの名無しさん
2022/07/17(日) 11:47:51.28ID:sgfC4LCK395デフォルトの名無しさん
2022/07/21(木) 12:23:18.60ID:eB2QSMyp396デフォルトの名無しさん
2022/07/26(火) 01:16:01.56ID:DHatjrG/ 基底クラスのprivateメンバと、private継承された基底クラスのpublicメンバって派生クラスから見たら同じじゃないんでしょうか?
前者は派生クラスからアクセス不可で、後者は派生クラスからアクセス可能なようです
というとこは意味が違うんでしょうが調べでもよく分かりませんでした
どなたか教えてください
前者は派生クラスからアクセス不可で、後者は派生クラスからアクセス可能なようです
というとこは意味が違うんでしょうが調べでもよく分かりませんでした
どなたか教えてください
397デフォルトの名無しさん
2022/07/26(火) 04:47:14.80ID:F8qnHJbo 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のアクセスに制限はない。
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のアクセスに制限はない。
398デフォルトの名無しさん
2022/07/27(水) 00:07:28.21ID:f9fWEf7v Carbon の話はスレチ?
399デフォルトの名無しさん
2022/07/27(水) 00:43:24.02ID:YyifIEEo401デフォルトの名無しさん
2022/07/29(金) 01:50:30.95ID:0LOpWdsN 通常のキャストと参照へのキャストの違いを教えてください。
#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だとコンパイルエラーになります。
どのような違いがあるのでしょうか?
#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だとコンパイルエラーになります。
どのような違いがあるのでしょうか?
402デフォルトの名無しさん
2022/07/29(金) 02:07:00.18ID:drZ02Ew4403デフォルトの名無しさん
2022/07/29(金) 08:15:31.60ID:FIiQg0BH404はちみつ餃子 ◆8X2XSCHEME
2022/07/29(金) 10:28:08.30ID:nU9Bb2FG 具体例で言うとこれ↓はアリってこと。
#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);
}
注意点として、
本来なら一時オブジェクトは式の終わりに解体されるので参照が無効になりそうなもんだが
参照で受けている場合はその参照の寿命と同じ分だけ延命される特例がある。
#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);
}
注意点として、
本来なら一時オブジェクトは式の終わりに解体されるので参照が無効になりそうなもんだが
参照で受けている場合はその参照の寿命と同じ分だけ延命される特例がある。
405デフォルトの名無しさん
2022/07/29(金) 10:44:28.57ID:nIcw6oQb >>396
違うに決まってるだろ
違うに決まってるだろ
406デフォルトの名無しさん
2022/07/29(金) 11:30:48.51ID:FIiQg0BH 俺が言ったのはこれのこと
struct base
{
base(int);
};
int main()
{
static_cast<base const&>(1);
static_cast<base&&>(1);
}
struct base
{
base(int);
};
int main()
{
static_cast<base const&>(1);
static_cast<base&&>(1);
}
407デフォルトの名無しさん
2022/07/30(土) 21:44:57.83ID:Ejgi0TIU コンストラクタの最適化(によるコンストラクタ呼び出し自体を削除)は
コピコンだけが適用?
コピコンだけが適用?
408デフォルトの名無しさん
2022/07/30(土) 21:52:49.25ID:hbp6z9LQ moveもrvoとかで無くなる
409デフォルトの名無しさん
2022/07/31(日) 13:35:39.44ID:VcJyNGFX410デフォルトの名無しさん
2022/07/31(日) 14:03:07.60ID:oR2ATHk7 そもそも406のコードにコピーもムーブも一つも出てきてないけど
411デフォルトの名無しさん
2022/07/31(日) 16:05:21.48ID:7/NlTuud ・フリーランスに立ちはだかる「常駐」の壁。慣例を打ち壊し、
“テレワーク”案件3割→8割へと成長を遂げた「クラウドテック」の軌跡
・リモートワーク求人専門サイト「プロリモート」がリニューアルオープン、
業務委託契約の求職者と企業をマッチング
・1/3以上が採用につながる高マッチング率、リモートワーク×エンジニア・デザイナー専門の
人材紹介サービス「ReworkerAgent」正式リリース場所からも時間からも自由な働き方を実現!
・『ReWorks(リワークス)』リモートワーク特化型転職サイトとして 3月5日 リニューアル
・副業・兼業マッチングサービス「クラウドリンクス」登録者数2万人突破
中小企業で進む副業人材の採用、96%が継続採用を希望
・フリーランスが活用できる「最大1,000〜3,000万円・補助率50%〜75%」の
『ものづくり・商業・サービス補助金』とは?概要や条件を解説
・茨城県日立市、県外からの「テレワーク移住者」に最大151万円の助成金
・長野市、市内に移転・事業所設置し、移住することで最大550万円の支援金を支給
“テレワーク”案件3割→8割へと成長を遂げた「クラウドテック」の軌跡
・リモートワーク求人専門サイト「プロリモート」がリニューアルオープン、
業務委託契約の求職者と企業をマッチング
・1/3以上が採用につながる高マッチング率、リモートワーク×エンジニア・デザイナー専門の
人材紹介サービス「ReworkerAgent」正式リリース場所からも時間からも自由な働き方を実現!
・『ReWorks(リワークス)』リモートワーク特化型転職サイトとして 3月5日 リニューアル
・副業・兼業マッチングサービス「クラウドリンクス」登録者数2万人突破
中小企業で進む副業人材の採用、96%が継続採用を希望
・フリーランスが活用できる「最大1,000〜3,000万円・補助率50%〜75%」の
『ものづくり・商業・サービス補助金』とは?概要や条件を解説
・茨城県日立市、県外からの「テレワーク移住者」に最大151万円の助成金
・長野市、市内に移転・事業所設置し、移住することで最大550万円の支援金を支給
412デフォルトの名無しさん
2022/08/03(水) 14:12:19.69ID:Y5L3Fd0k 練習でオブジェクトデータベースもどき を書いたらGITHUBに送ったのになんか反映されない。
がーん!!
がーん!!
413デフォルトの名無しさん
2022/08/03(水) 14:27:47.83ID:7AThd70z 見てるブランチが違うんだろ
414デフォルトの名無しさん
2022/08/04(木) 00:40:10.66ID:s3oOei4P コンストラクタって本当に戻り値無いんですか?
例えば
MyClass c = MyClass();
としたとき、cにはMyClassのコンストラクタで生成されたインスタンスが格納されます
戻り値が無いのになぜそうなるのでしょうか?
例えば
MyClass c = MyClass();
としたとき、cにはMyClassのコンストラクタで生成されたインスタンスが格納されます
戻り値が無いのになぜそうなるのでしょうか?
415はちみつ餃子 ◆8X2XSCHEME
2022/08/04(木) 01:26:43.48ID:hPtMGH66 >>414
それは明示的な型変換 (関数記法) という規則で示されている。
https://timsong-cpp.github.io/cppwp/n3337/expr.type.conv
見かけ上は普通の関数呼出しと区別がつかない記法を使うけれど関数呼出しではない。
クラス名を関数風に使ったらコンストラクタで構築したオブジェクトを (あたかも関数の返却値のように) 返すことになっているというだけなんで、
まあそういう仕様なのだと覚えてもらうしかしょうがない。
コンストラクタは特別な地位にあって色々と特別な規則があるんよ。
それは明示的な型変換 (関数記法) という規則で示されている。
https://timsong-cpp.github.io/cppwp/n3337/expr.type.conv
見かけ上は普通の関数呼出しと区別がつかない記法を使うけれど関数呼出しではない。
クラス名を関数風に使ったらコンストラクタで構築したオブジェクトを (あたかも関数の返却値のように) 返すことになっているというだけなんで、
まあそういう仕様なのだと覚えてもらうしかしょうがない。
コンストラクタは特別な地位にあって色々と特別な規則があるんよ。
416デフォルトの名無しさん
2022/08/04(木) 01:47:34.25ID:s3oOei4P >>415
ありがとうございます
そういう仕様だと覚えることにします
ついでで申し訳ないんですが、コンストラクタと明示的な型変換って同じものなんですか?
MyClassA a;
MyClassB b = MyClassB(a);
としたとき、コンストラクタはMyClassBの関数ですが、明示的な型変換はa(MyClassA)の関数ですよね?
ありがとうございます
そういう仕様だと覚えることにします
ついでで申し訳ないんですが、コンストラクタと明示的な型変換って同じものなんですか?
MyClassA a;
MyClassB b = MyClassB(a);
としたとき、コンストラクタはMyClassBの関数ですが、明示的な型変換はa(MyClassA)の関数ですよね?
417はちみつ餃子 ◆8X2XSCHEME
2022/08/04(木) 02:30:19.53ID:hPtMGH66 >>416
> コンストラクタと明示的な型変換って同じものなんですか?
違う。 明示的な型変換を試みた結果としてコンストラクタが呼び出されたりもするということ。
> コンストラクタはMyClassBの関数ですが
MyClassB のメンバ関数の意かな?
> 明示的な型変換はa(MyClassA)の関数ですよね?
何がいいたいのかわからない。
MyClassB と書いてあるのに何故か MyClassA のなんらかのメンバ関数が呼ばれると思っているということ?
どうしてそう思ったのかもうちょっと詳しく説明してみて。
> コンストラクタと明示的な型変換って同じものなんですか?
違う。 明示的な型変換を試みた結果としてコンストラクタが呼び出されたりもするということ。
> コンストラクタはMyClassBの関数ですが
MyClassB のメンバ関数の意かな?
> 明示的な型変換はa(MyClassA)の関数ですよね?
何がいいたいのかわからない。
MyClassB と書いてあるのに何故か MyClassA のなんらかのメンバ関数が呼ばれると思っているということ?
どうしてそう思ったのかもうちょっと詳しく説明してみて。
418デフォルトの名無しさん
2022/08/04(木) 10:23:55.38ID:4E08n67o >> 417
class MyClassB {};
class MyClassA
{
public:
operator MyClassB() const {
return MyClassB();
}
};
int main()
{
MyClassA a;
MyClassB b = MyClassB(a);
}
このようなとき、型変換で呼ばれるのはMyClassAのメンバ関数であるoperator MyClassBですよね?
MyClassBのメンバ関数であるコンストラクタを呼び出しているのと見分けがつかないので、疑問に思いました
class MyClassB {};
class MyClassA
{
public:
operator MyClassB() const {
return MyClassB();
}
};
int main()
{
MyClassA a;
MyClassB b = MyClassB(a);
}
このようなとき、型変換で呼ばれるのはMyClassAのメンバ関数であるoperator MyClassBですよね?
MyClassBのメンバ関数であるコンストラクタを呼び出しているのと見分けがつかないので、疑問に思いました
419デフォルトの名無しさん
2022/08/04(木) 10:41:35.28ID:fn9V0Lga explicit指定してなけらば代入はコンストラクタに渡される
420はちみつ餃子 ◆8X2XSCHEME
2022/08/04(木) 11:47:40.74ID:hPtMGH66 >>418
ユーザー定義変換演算子があればそれが使われたりもすることもある。
どの状況で何が呼ばれるのかは複雑な解決規則があって、どちらかが優先になることもあれば曖昧 (エラー) になることもある。
この場合にどうなってるのか仕様を辿ってみたんだが、
MyClassB(a) は C スタイルのキャストと等しいので (MyClassB)a と同等、
そしてこれは static_cast<MyClassB>(a) と同等と解釈される。
このとき MyClassB temp(a) と宣言したときのように初期化された架空の変数 temp の値が返される。
そういうルールだった。
MyClassB temp(a) と宣言したときに MyClassB が MyClassA を受け取るコンストラクタを持っていれば
それが呼ばれる (この場合はそのようなコンストラクタはないので呼ばれない) し、
そうでないなら暗黙の型変換が実施されるので MyClassA::operator MyClassB が呼ばれてから初期化される。
ユーザー定義変換演算子があればそれが使われたりもすることもある。
どの状況で何が呼ばれるのかは複雑な解決規則があって、どちらかが優先になることもあれば曖昧 (エラー) になることもある。
この場合にどうなってるのか仕様を辿ってみたんだが、
MyClassB(a) は C スタイルのキャストと等しいので (MyClassB)a と同等、
そしてこれは static_cast<MyClassB>(a) と同等と解釈される。
このとき MyClassB temp(a) と宣言したときのように初期化された架空の変数 temp の値が返される。
そういうルールだった。
MyClassB temp(a) と宣言したときに MyClassB が MyClassA を受け取るコンストラクタを持っていれば
それが呼ばれる (この場合はそのようなコンストラクタはないので呼ばれない) し、
そうでないなら暗黙の型変換が実施されるので MyClassA::operator MyClassB が呼ばれてから初期化される。
421デフォルトの名無しさん
2022/08/04(木) 12:25:40.96ID:YlkBTNtd 職業としてc++を使用してる人に聞きたいんだけど
設計者がどう動作するか分かってないコードが含まれる製品が出荷されてるのっておかしくない?
しかもその担当は、俺あんまりパソコン得意じゃないって。
そんな人間が書いてるソフトをお金を出して買ってくださってるお客様に言えるかよ、馬鹿なのかな
設計者がどう動作するか分かってないコードが含まれる製品が出荷されてるのっておかしくない?
しかもその担当は、俺あんまりパソコン得意じゃないって。
そんな人間が書いてるソフトをお金を出して買ってくださってるお客様に言えるかよ、馬鹿なのかな
422デフォルトの名無しさん
2022/08/04(木) 12:42:29.07ID:foJKY5q3 まあ売る方も買う方も承知でやってる互助会みたいな世界もあるから
423デフォルトの名無しさん
2022/08/04(木) 12:49:09.16ID:iuI8tOa1 自社製品のすべてをわかっている事業者なんてないよ
もしものためにお客様相談窓口あるわけだし
もしものためにお客様相談窓口あるわけだし
424デフォルトの名無しさん
2022/08/04(木) 12:58:24.87ID:YlkBTNtd >>423
そう言うことではない。
では、あなたに聞きたい
車を買いに行って、ディーラーの人に「このボタンなんですか?」と質問して「押してみないと分からない」なんて答えたらどう思いますか?
ディーラーが設計してるわけではないことくらい誰でも知ってるけど、ここで買っていいのか?って思いませんか?
そう言うことではない。
では、あなたに聞きたい
車を買いに行って、ディーラーの人に「このボタンなんですか?」と質問して「押してみないと分からない」なんて答えたらどう思いますか?
ディーラーが設計してるわけではないことくらい誰でも知ってるけど、ここで買っていいのか?って思いませんか?
425デフォルトの名無しさん
2022/08/04(木) 13:09:55.40ID:4HLZV6kX >>421
C++使いはPCのパワーユーザーとは限らんよ
それにPCだって無数の技術が詰め込まれていて
たとえるなら1つの大学のようなもので
迂闊に「俺はものすごくPCに詳しいんだ!」なんて言うと
ほぼ100%恥かくしな
C++使いはPCのパワーユーザーとは限らんよ
それにPCだって無数の技術が詰め込まれていて
たとえるなら1つの大学のようなもので
迂闊に「俺はものすごくPCに詳しいんだ!」なんて言うと
ほぼ100%恥かくしな
426デフォルトの名無しさん
2022/08/04(木) 13:28:40.86ID:YMWE04jW >>424
外部仕様と内部仕様の区別もつかないボンクラ乙w
外部仕様と内部仕様の区別もつかないボンクラ乙w
427デフォルトの名無しさん
2022/08/04(木) 17:01:53.54ID:bxsqlndn つかC++関係無くね
どの工程にでも言える話をここでされても困るんだけど
どの工程にでも言える話をここでされても困るんだけど
428デフォルトの名無しさん
2022/08/04(木) 18:34:39.03ID:Te3vhihz >>426
お前は文章も読めないのか
お前は文章も読めないのか
429デフォルトの名無しさん
2022/08/04(木) 18:53:04.81ID:iPtxbdCe まず>>421がC++との関連を示すべき。それ以外のところで話を広げても不毛。
430デフォルトの名無しさん
2022/08/04(木) 19:04:48.18ID:4E08n67o431デフォルトの名無しさん
2022/08/04(木) 19:32:37.46ID:YMWE04jW432デフォルトの名無しさん
2022/08/04(木) 20:58:43.21ID:msSueNHM windows作ってる開発者や営業にメモ帳のショートカット全部言えるか聞いてみればいいんじゃね?
外部仕様すら知らんの?馬鹿なのかなって
外部仕様すら知らんの?馬鹿なのかなって
433デフォルトの名無しさん
2022/08/04(木) 21:17:24.76ID:isEYuHXY 「メモ帳のショートカットを言え」がなんのことやらわからない。
434はちみつ餃子 ◆8X2XSCHEME
2022/08/04(木) 21:27:41.19ID:hPtMGH66 最大限にエスパー能力を発揮してアクロバティックに解釈するとテキスト形式のファイルのことではないかと思う。
デフォルトだとメモ帳に関連付けられているからテキスト=メモ帳という認識が出来上がる可能性はある。
デフォルトだとメモ帳に関連付けられているからテキスト=メモ帳という認識が出来上がる可能性はある。
435デフォルトの名無しさん
2022/08/04(木) 21:36:35.22ID:isEYuHXY 関連付けされた拡張子の話をしてるのかな?
それでもあとからインストールされたものでコロコロ変わるから、意味不明だな。
それでもあとからインストールされたものでコロコロ変わるから、意味不明だな。
436デフォルトの名無しさん
2022/08/04(木) 21:58:15.71ID:msSueNHM メモ帳はnotepad.exe、ショートカットはキーボードショートカットの意味だがそれすら想像つかないなんてずいぶん頭が悪いな
パソコン得意じゃないのはお前のことじゃん
パソコン得意じゃないのはお前のことじゃん
437デフォルトの名無しさん
2022/08/04(木) 21:59:21.33ID:isEYuHXY >>436
Windowsのショートカットはそういう意味じゃない。
Windowsのショートカットはそういう意味じゃない。
438デフォルトの名無しさん
2022/08/04(木) 21:59:22.67ID:Xd358RP3 ショートカットキーのことでは?
439デフォルトの名無しさん
2022/08/04(木) 22:00:54.91ID:isEYuHXY >>438
そんなのわかっているが、彼の略語が自分にしかわからないから問題にしている。
そんなのわかっているが、彼の略語が自分にしかわからないから問題にしている。
440デフォルトの名無しさん
2022/08/04(木) 22:04:19.71ID:isEYuHXY441デフォルトの名無しさん
2022/08/04(木) 22:05:15.46ID:isEYuHXY 自分のPCの設定をデフォルト設定だと思っているジジイだろうな
442デフォルトの名無しさん
2022/08/04(木) 22:05:56.15ID:isEYuHXY 変なのいくらでもいるんだなと思った
443デフォルトの名無しさん
2022/08/04(木) 22:06:10.34ID:Xd358RP3 争いが起きるのは霊的な問題もあると思うんですよね。
先日亡くなられた安倍元総理も生前大切にされていた霊験あらたかな壺があるそうなんですよ。
ただ、とても値が張るそうで、安いものでも3000万を下らないそうなんです。
そこで、5ch有志でお金を出し合って共同で購入しませんか?
そうすればスレも安定すると思うんです。
先日亡くなられた安倍元総理も生前大切にされていた霊験あらたかな壺があるそうなんですよ。
ただ、とても値が張るそうで、安いものでも3000万を下らないそうなんです。
そこで、5ch有志でお金を出し合って共同で購入しませんか?
そうすればスレも安定すると思うんです。
444デフォルトの名無しさん
2022/08/04(木) 22:17:42.40ID:isEYuHXY Windowsのファイルの種類のひとつが「ショートカット」というのがわからなくなって、Windowsそのもののことがわからないのに知ったかぶりで物を言う認知症のじいさんなんだろ。
445デフォルトの名無しさん
2022/08/04(木) 22:18:06.28ID:bxsqlndn おまえら全員Windows板行って二度と帰ってくんな
446デフォルトの名無しさん
2022/08/04(木) 22:21:02.93ID:ICFzqGoM winならアクセラレータキーだろ
447デフォルトの名無しさん
2022/08/04(木) 22:24:31.32ID:YMWE04jW448デフォルトの名無しさん
2022/08/04(木) 22:27:08.73ID:isEYuHXY メモ帳にショートカットキーがあるという架空の設定で話していてもよくわからない。
449デフォルトの名無しさん
2022/08/04(木) 22:42:58.32ID:142AVZpN F5で現在時刻入力とかCtrl+Gで行番号指定ジャンプとかCtrl+-/+/0で縮小・拡大・元に戻すとかの
メモ帳のキーバインドのことなんじゃないのどうでもいいけど
メモ帳のキーバインドのことなんじゃないのどうでもいいけど
450デフォルトの名無しさん
2022/08/04(木) 23:10:21.02ID:isEYuHXY >>449
メモ帳そのもののことを言っていたわけか。メモ帳を使っている人間がどれだけいるのか疑問だけど。
メモ帳そのもののことを言っていたわけか。メモ帳を使っている人間がどれだけいるのか疑問だけど。
451デフォルトの名無しさん
2022/08/04(木) 23:16:20.71ID:KJ7UAuj1 >>443
いい歳こいてオカルトは恥ずかしいぞ
いい歳こいてオカルトは恥ずかしいぞ
452デフォルトの名無しさん
2022/08/04(木) 23:42:02.70ID:CV93jyTL というか、あれってエディットコントロールの機能ですよね
エディットコントロールのソースってどっかでみることが出来ますかね?
エディットコントロールのソースってどっかでみることが出来ますかね?
453はちみつ餃子 ◆8X2XSCHEME
2022/08/04(木) 23:54:18.07ID:hPtMGH66 Windows のソースコードは一部の政府機関や学術機関と契約を結んで提供している事例はあるが、
個人で見せてもらえるようなもんじゃないよ。
あえて言うなら ReactOS (Windows 互換の OS を目指すオープンソースプロジェクト) が参考になるかもね。
個人で見せてもらえるようなもんじゃないよ。
あえて言うなら ReactOS (Windows 互換の OS を目指すオープンソースプロジェクト) が参考になるかもね。
454デフォルトの名無しさん
2022/08/06(土) 14:19:53.03ID:eSBCWCwI >>415
MyClass a();
MyClass & b = MyClass();
const MyClass & c = MyClass();
MyClass d = MyClass(); ← コピーコンストラクタ発動?
それともムーブ?
MyClass a();
MyClass & b = MyClass();
const MyClass & c = MyClass();
MyClass d = MyClass(); ← コピーコンストラクタ発動?
それともムーブ?
455デフォルトの名無しさん
2022/08/06(土) 14:34:58.43ID:mmg0BHVy explicit指定してないならムーブだ
456デフォルトの名無しさん
2022/08/06(土) 15:11:57.86ID:eSBCWCwI >>421
javascriptやelectronやphpやvb/vbaの方が判ってない人が描いてる確率は高い
javascriptやelectronやphpやvb/vbaの方が判ってない人が描いてる確率は高い
457デフォルトの名無しさん
2022/08/06(土) 15:16:10.01ID:eSBCWCwI >>449
最近覚えたのは Win+G ですね判ります
最近覚えたのは Win+G ですね判ります
458デフォルトの名無しさん
2022/08/06(土) 15:17:59.77ID:eSBCWCwI459デフォルトの名無しさん
2022/08/06(土) 15:44:10.54ID:xsmVc9Uv GUIでキー操作というのは矛盾も含んでいるんだけどな
460はちみつ餃子 ◆8X2XSCHEME
2022/08/06(土) 17:10:45.24ID:Md6Uzv/o >>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();
}
基本的にはムーブコンストラクタが呼ばれる場面なんだけど……。
一定の条件でコピーやムーブを省略 (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();
}
461デフォルトの名無しさん
2022/08/06(土) 18:15:44.12ID:Cf/I657k >>459
初代macか
初代macか
462デフォルトの名無しさん
2022/08/07(日) 09:01:37.78ID:5PDs1Uf6 むかしまだMacOSが漢字TalkだったころにMacキチガイの知りあいが
「Windowsなんて駄目だよ、だいたいマウスにボタンが2つあるみたいなシンプルさを欠く設計な上に
なにかとキーボードを併用しないといけない、GUIとして未完成といわざるをえない(キリッ」とかいいながら
Macでマウスボタンとコマンドキーやらシフトキーのコンビネーションをものすごい熟練の手付きで操作していたのが印象的だった
「Windowsなんて駄目だよ、だいたいマウスにボタンが2つあるみたいなシンプルさを欠く設計な上に
なにかとキーボードを併用しないといけない、GUIとして未完成といわざるをえない(キリッ」とかいいながら
Macでマウスボタンとコマンドキーやらシフトキーのコンビネーションをものすごい熟練の手付きで操作していたのが印象的だった
463デフォルトの名無しさん
2022/08/10(水) 19:17:19.29ID:0w2i6tTa windows10でスタートメニューを非表示にしたいのですが良い方法ないですかね?
スタートメニューのHandleを取れれば良いのですが、、。
ネットでいろいろ調べましたが見つけたサンプルコードは、windows10では動きませんでした。
スタートメニューのHandleを取れれば良いのですが、、。
ネットでいろいろ調べましたが見つけたサンプルコードは、windows10では動きませんでした。
464デフォルトの名無しさん
2022/08/10(水) 19:51:18.63ID:kx7L/9BB 何をしたいのかいまいちわからんけどシェル差し替えればいいんじゃね?
https://docs.microsoft.com/ja-jp/windows/configuration/kiosk-shelllauncher
https://docs.microsoft.com/ja-jp/windows/configuration/kiosk-shelllauncher
465デフォルトの名無しさん
2022/08/11(木) 00:32:53.82ID:8ZZGyUVA 以下のプログラムを実行したとき、変数xとyが初期化されるのはどういう理屈ですか?
class myClass
{
public:
int x;
int y;
};
int main()
{
myClass c{ 100, 200 };
}
暗黙のコンストラクタで代入されているのかと思いましたが、
xとyをprivateにするとコンパイルエラーになるので違うようです。
インスタンス生成の{}を()に変えるとコンパイルできなくなるのでそれもどうしてか知りたいです。
class myClass
{
public:
int x;
int y;
};
int main()
{
myClass c{ 100, 200 };
}
暗黙のコンストラクタで代入されているのかと思いましたが、
xとyをprivateにするとコンパイルエラーになるので違うようです。
インスタンス生成の{}を()に変えるとコンパイルできなくなるのでそれもどうしてか知りたいです。
466デフォルトの名無しさん
2022/08/11(木) 00:36:21.03ID:sYNKGRSM struct myClass
{
int x;
int y;
};
int main()
{
struct myClass c = { 100, 200 };
}
と同じ理屈じゃね?
{
int x;
int y;
};
int main()
{
struct myClass c = { 100, 200 };
}
と同じ理屈じゃね?
467デフォルトの名無しさん
2022/08/11(木) 00:47:31.68ID:sRpXvn0F publicだけならcの構造体と同じだからね
468デフォルトの名無しさん
2022/08/11(木) 07:19:27.31ID:MV37ziRv C言語からやってないと構造体の初期化は理解出来んだろうな
469デフォルトの名無しさん
2022/08/11(木) 08:18:14.02ID:l648IjCs trivial ctorじゃ説明つかないからなaggregateは
470デフォルトの名無しさん
2022/08/11(木) 09:13:13.76ID:7cUH/Z7I 建増しでやってきた言語だからしょうがないけど初期化の方法がやたらいっぱいあって混乱する
471はちみつ餃子 ◆8X2XSCHEME
2022/08/11(木) 10:28:32.68ID:5k4DsUHs >>465
集成体初期化 (Aggregate Initilization) に該当する。
クラスが一定の条件を満たしたときに集成体の扱いになる。
文法表記を似せているだけの別物と思った方がいいかも。
ちなみに C++20 からは丸括弧でも集成体初期化が出来るようになってるよ。
集成体初期化 (Aggregate Initilization) に該当する。
クラスが一定の条件を満たしたときに集成体の扱いになる。
文法表記を似せているだけの別物と思った方がいいかも。
ちなみに C++20 からは丸括弧でも集成体初期化が出来るようになってるよ。
472デフォルトの名無しさん
2022/08/11(木) 16:39:22.98ID:8ZZGyUVA473デフォルトの名無しさん
2022/08/15(月) 03:58:18.08ID:NUjkjU1P 皆さんにお聞きしたいんですけど
inline展開しまくることによる弊害って主になんでしょうか?
inline展開しまくることによる弊害って主になんでしょうか?
474デフォルトの名無しさん
2022/08/15(月) 04:01:03.39ID:93bmEmXu コードがでかくなる
475デフォルトの名無しさん
2022/08/15(月) 04:48:08.80ID:nv9KtGy3 コンパイルが遅くなる
476デフォルトの名無しさん
2022/08/15(月) 06:06:45.25ID:y6q1hWI/ もうデメリットはなくなって来たな
実際のコンパイラもデフォでinlineぽい動きするし
ただの開いたサブルーチンというだけでなく定義の統合がありがたい
実際のコンパイラもデフォでinlineぽい動きするし
ただの開いたサブルーチンというだけでなく定義の統合がありがたい
477デフォルトの名無しさん
2022/08/16(火) 10:58:28.11ID:2x3mrzZQ デバッグが面倒臭くならない?
そうだあれか
リバエンし難くする効果があるとか
そうだあれか
リバエンし難くする効果があるとか
478デフォルトの名無しさん
2022/08/16(火) 11:14:28.05ID:NN3FHXHG インライン展開するとスタックトレースで関数名が出なくなりますか?
479デフォルトの名無しさん
2022/08/16(火) 14:07:30.89ID:GaLydNkX480デフォルトの名無しさん
2022/08/16(火) 14:11:45.62ID:GaLydNkX >>474-475-476-477
なるほど…
なるほど…
481デフォルトの名無しさん
2022/08/16(火) 14:16:34.26ID:GaLydNkX c++ってまだまだ需要あると思いますか?
私はあるかなと思うんですけど...意見ください。
私はあるかなと思うんですけど...意見ください。
482はちみつ餃子 ◆8X2XSCHEME
2022/08/16(火) 14:22:21.76ID:+o+ePBjP 何年も前だがインライン展開の基準を指定する GCC のオプションで
めちゃクソに緩めの数値を指定 (つまりインライン展開されまくる) して
ベンチマークをとった記事が話題になったような覚えがある。
結論を覚えてないし、どこで見たのかも覚えていないので役に立たん話ですまぬ。
めちゃクソに緩めの数値を指定 (つまりインライン展開されまくる) して
ベンチマークをとった記事が話題になったような覚えがある。
結論を覚えてないし、どこで見たのかも覚えていないので役に立たん話ですまぬ。
483デフォルトの名無しさん
2022/08/16(火) 14:48:39.55ID:oZyv9MO8 >>481
C++は需要が減り衰退していく
昔はともかく現代の視点からは、設計が悪くそこへ建て増しを繰り返しているため、言語として劣っていて使いにくい
そのため次第に既存システムの保守がメインの言語となっていっているが、それさえGoogleの発表したCarbonのような言語の方がプログラマーにとってもありがたい
もちろんそのCarbonでさえそのFAQにこれはあくまでも既存の保守用の言語でと書かれている
C++は需要が減り衰退していく
昔はともかく現代の視点からは、設計が悪くそこへ建て増しを繰り返しているため、言語として劣っていて使いにくい
そのため次第に既存システムの保守がメインの言語となっていっているが、それさえGoogleの発表したCarbonのような言語の方がプログラマーにとってもありがたい
もちろんそのCarbonでさえそのFAQにこれはあくまでも既存の保守用の言語でと書かれている
484デフォルトの名無しさん
2022/08/16(火) 14:52:39.64ID:16oeTihW 設計思想のないバカがさわるとえらいことになる言語だからな
485デフォルトの名無しさん
2022/08/16(火) 15:07:03.88ID:2x3mrzZQ >設計が悪くそこへ建て増しを繰り返している
言語仕様がそうなっていることは認めるが
設計が悪い部分は無理して使わず良い部分だけ使えば良い話でもある
言語仕様がそうなっていることは認めるが
設計が悪い部分は無理して使わず良い部分だけ使えば良い話でもある
486デフォルトの名無しさん
2022/08/16(火) 15:17:41.42ID:yx28uGuU 皆が皆そうしてくれないから自然に淘汰されていく訳だが
487デフォルトの名無しさん
2022/08/16(火) 15:24:11.24ID:n8xVLVvG >>481
需要で言えばCOBOLでさえ無くなっていないからなぁ。
c++の完全置き替えはRustがようやっとスタート地点に立てたくらい。でもRustは初心者お断りだから無理なんじゃない?
個人的にはRustを参考にした初心者向けのサブセットC++か、Rustの複雑さをマイルドにしたスタックフレーム指向の新言語が出てくると思う。
需要で言えばCOBOLでさえ無くなっていないからなぁ。
c++の完全置き替えはRustがようやっとスタート地点に立てたくらい。でもRustは初心者お断りだから無理なんじゃない?
個人的にはRustを参考にした初心者向けのサブセットC++か、Rustの複雑さをマイルドにしたスタックフレーム指向の新言語が出てくると思う。
488デフォルトの名無しさん
2022/08/16(火) 15:54:40.98ID:BglBygNH msvcはインライン展開あんましてくれないな
489デフォルトの名無しさん
2022/08/16(火) 15:57:43.55ID:bqAknUU+490はちみつ餃子 ◆8X2XSCHEME
2022/08/16(火) 16:21:45.34ID:+o+ePBjP どうだろうなぁ。
C を学んでいる人が多かったというところから実務に使いながら少しづつ C++ に習熟していくという動線があったわけで、
C という前提が崩れたら Rust のほうが合理的に設計されていて楽かもしれないとは思う。
ただ、その一方で C++ が消えてなくなるほど劣勢になる気はしないんだよな。
C を学んでいる人が多かったというところから実務に使いながら少しづつ C++ に習熟していくという動線があったわけで、
C という前提が崩れたら Rust のほうが合理的に設計されていて楽かもしれないとは思う。
ただ、その一方で C++ が消えてなくなるほど劣勢になる気はしないんだよな。
491デフォルトの名無しさん
2022/08/16(火) 16:38:57.39ID:GaLydNkX c++とかcやってからじゃないと到底無理
ってよく聞くんですけど
どういうことですかね?
ってよく聞くんですけど
どういうことですかね?
492デフォルトの名無しさん
2022/08/16(火) 16:39:15.94ID:uEezmwqj class b:a{};
class a{};
このコードはコンパイルできませんが、aを前方宣言せずにコンパイルを通す方法ってありますかね?
class a{};
このコードはコンパイルできませんが、aを前方宣言せずにコンパイルを通す方法ってありますかね?
493デフォルトの名無しさん
2022/08/16(火) 17:52:12.39ID:2x3mrzZQ 1.
class a;
class b:a{};
class a{};
2.
class a{};
class b:a{};
class a;
class b:a{};
class a{};
2.
class a{};
class b:a{};
494はちみつ餃子 ◆8X2XSCHEME
2022/08/16(火) 17:53:02.94ID:+o+ePBjP >>491
個々のルールを頭に詰め込むだけってのはしんどい。
思想に沿うように個々のルールが制定されているので思想が分かればある程度はルールの想像がつく。
低レイヤで何が起こるかある程度は認識していると思想が把握しやすい。
C++ の駄目な部分を見た後に Rust を見ると「こういうのが真っ当な仕組みだよな!」という納得もしやすいし。
ただ、 C++ の「汚くていいんだ」というのもそれはそれで優しい世界なので私は好きだよ。
個々のルールを頭に詰め込むだけってのはしんどい。
思想に沿うように個々のルールが制定されているので思想が分かればある程度はルールの想像がつく。
低レイヤで何が起こるかある程度は認識していると思想が把握しやすい。
C++ の駄目な部分を見た後に Rust を見ると「こういうのが真っ当な仕組みだよな!」という納得もしやすいし。
ただ、 C++ の「汚くていいんだ」というのもそれはそれで優しい世界なので私は好きだよ。
495デフォルトの名無しさん
2022/08/16(火) 19:22:32.37ID:wpAgGEI5 >>489
初心者からすればC++とRustの差なんて無いに等しい。コード1行書くのにいくつのルールを守る必要があるんだよ。
シンプルで洗練されている言語が初心者に良いというなら、RustよりFORTH(とその末裔)の方が初心者にふさわしいと思うわ。
初心者からすればC++とRustの差なんて無いに等しい。コード1行書くのにいくつのルールを守る必要があるんだよ。
シンプルで洗練されている言語が初心者に良いというなら、RustよりFORTH(とその末裔)の方が初心者にふさわしいと思うわ。
496デフォルトの名無しさん
2022/08/16(火) 21:48:30.73ID:yMlIVT9V 母国語みたいなもんなんでCの覇権は変わらない
497デフォルトの名無しさん
2022/08/16(火) 22:17:19.28ID:bk3ffD66 >>495
FORTHはCと同等の速さを出せないし問題のすり替えはみっともない
RustはCと同等の速さを出しつつ現代的なプログラミングしやすい様々なパラダイムを洗練してシンプルにまとめている
FORTHを入れてC/C++/Rustの四者で比較してもRustがプログラミング効率も良いと同意できるだろ
FORTHはCと同等の速さを出せないし問題のすり替えはみっともない
RustはCと同等の速さを出しつつ現代的なプログラミングしやすい様々なパラダイムを洗練してシンプルにまとめている
FORTHを入れてC/C++/Rustの四者で比較してもRustがプログラミング効率も良いと同意できるだろ
498デフォルトの名無しさん
2022/08/17(水) 02:44:27.88ID:C+o8slGL 夏厨って夏に湧いて出る厨房の事を指す言葉だったはずだけど
その厨房も今じゃ中年おじさんなんだよな
その厨房も今じゃ中年おじさんなんだよな
499デフォルトの名無しさん
2022/08/17(水) 04:51:00.22ID:bVkA6pax >>497
Rustは初心者が学習しやすい言語ではないし問題のすり替えはみっともない
Rustは初心者が学習しやすい言語ではないし問題のすり替えはみっともない
500デフォルトの名無しさん
2022/08/17(水) 05:49:59.92ID:jVY1lffe501デフォルトの名無しさん
2022/08/17(水) 07:00:37.46ID:8QCiHT08 皆さんのオブジェクト指向に対する考え方
おください!
おください!
502デフォルトの名無しさん
2022/08/17(水) 08:26:24.61ID:/AaT26gR >>500
C++との比較なんてしていない。よく読め。
C++が駄目なのと同じくらいRustも初心者の学習コストはダメ。
C++はまだ部分的に汚く使う柔軟性を持つから、better c くらいのところから段階的に使う余地はある。しかしRustはいきなり複数の概念(所有権とか参照とかmoveとか)を使わないとプログラムが書けない絶壁の学習コストをしているから、「とりあえず使う」という選択肢が無い。初心者の選ぶ言語にはならんよ。
C++との比較なんてしていない。よく読め。
C++が駄目なのと同じくらいRustも初心者の学習コストはダメ。
C++はまだ部分的に汚く使う柔軟性を持つから、better c くらいのところから段階的に使う余地はある。しかしRustはいきなり複数の概念(所有権とか参照とかmoveとか)を使わないとプログラムが書けない絶壁の学習コストをしているから、「とりあえず使う」という選択肢が無い。初心者の選ぶ言語にはならんよ。
503デフォルトの名無しさん
2022/08/17(水) 08:34:18.80ID:/AaT26gR504デフォルトの名無しさん
2022/08/17(水) 08:40:13.74ID:p6RiGGmW >>502
C++のスレで「C++と比較していない!」と言い出すそなたの頭のネジが飛んでるとしか
C++のスレで「C++と比較していない!」と言い出すそなたの頭のネジが飛んでるとしか
505デフォルトの名無しさん
2022/08/17(水) 08:43:38.31ID:T2QftTg0 C++のスレでRustの話をする人の頭のネジは緩んではいないのか
506デフォルトの名無しさん
2022/08/17(水) 08:50:31.11ID:svOZgDad 他の言語との類似や相違など色んな話題が出てもええんちゃう
特にRustはC++後継言語の一つでもあるし
特にRustはC++後継言語の一つでもあるし
507デフォルトの名無しさん
2022/08/17(水) 08:54:01.88ID:tNGd1WjN 勝手に決めんな
508デフォルトの名無しさん
2022/08/17(水) 09:18:05.65ID:3A+P/0wQ GAFAMがRustをC++の後継言語の1つとして位置付けてRust Foundationを共同で設立したりしてますもんね
ただしGoogleは既存コードのメンテ用としてはCarbonもC++の後継言語の1つとして実験していますね
Rustはシステム更新時や分離できる新たな部分に対してC++の後継言語となるのでしょう
ただしGoogleは既存コードのメンテ用としてはCarbonもC++の後継言語の1つとして実験していますね
Rustはシステム更新時や分離できる新たな部分に対してC++の後継言語となるのでしょう
509デフォルトの名無しさん
2022/08/17(水) 09:43:49.92ID:G5jxF3Mu510デフォルトの名無しさん
2022/08/17(水) 10:06:28.08ID:JpVQLN3v スマポすなわち所有権を使ってるC++プログラマーならRustは簡単で楽勝
まともな案件ならばスマポ使っているし、急にではないけど、より安全なRustへ徐々に少しずつ移っていくんだと思うよ
まともな案件ならばスマポ使っているし、急にではないけど、より安全なRustへ徐々に少しずつ移っていくんだと思うよ
511デフォルトの名無しさん
2022/08/17(水) 10:18:24.59ID:T2QftTg0512デフォルトの名無しさん
2022/08/17(水) 10:27:35.49ID:tNGd1WjN 学習障壁でユーザー規模が縮小って
なんかCOBOL臭えな
アホフィルタを外すより待遇を改善すべきだろ
マ板でやるべき内容だな
なんかCOBOL臭えな
アホフィルタを外すより待遇を改善すべきだろ
マ板でやるべき内容だな
513デフォルトの名無しさん
2022/08/17(水) 10:30:15.50ID:VIybtmpa rustはアホでも書ける言語ではないよな
良いか悪いかはさておき
良いか悪いかはさておき
514デフォルトの名無しさん
2022/08/17(水) 10:41:14.61ID:tNGd1WjN は? 「C++が使える」アホは俺でも知ってるが
それがこの話と何か関係あるのか?
それがこの話と何か関係あるのか?
515デフォルトの名無しさん
2022/08/17(水) 10:45:01.06ID:ysQxp/zr お前が知ってるかどうかなんか知るかよ
荒らしたいだけなら少し黙ってろ
荒らしたいだけなら少し黙ってろ
516デフォルトの名無しさん
2022/08/17(水) 11:20:40.84ID:ijLXutEl きみらはなぜ些細なことですぐ喧嘩するのか・・・
517デフォルトの名無しさん
2022/08/17(水) 12:01:52.68ID:75soL8XV >>509
Rust++ですね判ります
Rust++ですね判ります
518デフォルトの名無しさん
2022/08/17(水) 12:03:04.79ID:tNGd1WjN 都合が悪くなると荒らしたいだけとか全く
C++相談室でRustを連呼するやつに言われたかねえな
C++相談室でRustを連呼するやつに言われたかねえな
519デフォルトの名無しさん
2022/08/17(水) 12:06:02.53ID:tNGd1WjN 相談者はチームで突然、Rustに変えようと言い出せば
解決につながるとでも言うのか
そんな力のあるやつが相談に来るとでも?
解決につながるとでも言うのか
そんな力のあるやつが相談に来るとでも?
520デフォルトの名無しさん
2022/08/17(水) 12:31:04.58ID:GcPebzMx シンプルで現代的なZig言語、RustやC++が複雑すぎると嘆く人の福音となるか
https://news.mynavi.jp/techplus/article/programinglanguageoftheworld-44/
https://news.mynavi.jp/techplus/article/programinglanguageoftheworld-44/
521デフォルトの名無しさん
2022/08/17(水) 12:50:49.80ID:hpgzuSC5 手動メモリ管理のZigでは無理だよ
手動メモリ管理で複雑化したときにどうしても発生している穴を防ぐことがどのIT企業でも課題となっている
手動メモリ管理で複雑化したときにどうしても発生している穴を防ぐことがどのIT企業でも課題となっている
522デフォルトの名無しさん
2022/08/17(水) 13:33:15.30ID:GcPebzMx 自動にしてもjavaみたいにメモリバカ食いしてるのも大概だけどな
523デフォルトの名無しさん
2022/08/17(水) 13:46:04.27ID:0xu2lUBy shared_ptrやunique_ptrで特に問題ないと思うが?
手動メモリ管理ってパフォーマンスでも気にしてるの?
手動メモリ管理ってパフォーマンスでも気にしてるの?
524デフォルトの名無しさん
2022/08/17(水) 14:31:54.15ID:VIybtmpa shared_ptrはほんとに良いものなのかちょっと疑問だわ
525デフォルトの名無しさん
2022/08/17(水) 15:14:20.93ID:ka8BV2dl526デフォルトの名無しさん
2022/08/17(水) 15:36:27.49ID:0xu2lUBy shared_ptrやunique_ptrで何か問題があるかな?
527デフォルトの名無しさん
2022/08/17(水) 15:37:16.76ID:DQ38VMyq いらんわ
まさかそんなくだらん話だったとは
買い被らせやがって
まさかそんなくだらん話だったとは
買い被らせやがって
528デフォルトの名無しさん
2022/08/17(水) 15:53:30.62ID:RcTU5KfW >>523
正確にはスタックフレームに積む or スマートポインタを使ってヒープに置く、だな。
shared ptrは関数呼び出し時の値渡しのインクリメントデクリメントコストが気になるところ。
スタックフレームに存在するかどうかで参照渡しか値渡しかを自動で切り替えると便利そうだけど、最適化で上手く処理してくれたっけ?
正確にはスタックフレームに積む or スマートポインタを使ってヒープに置く、だな。
shared ptrは関数呼び出し時の値渡しのインクリメントデクリメントコストが気になるところ。
スタックフレームに存在するかどうかで参照渡しか値渡しかを自動で切り替えると便利そうだけど、最適化で上手く処理してくれたっけ?
529デフォルトの名無しさん
2022/08/17(水) 15:54:04.11ID:aLEYi9j0 >>526
使い忘れと使い方ミスを常に完全にゼロにできるならばunique_ptrとshared_ptrでOK
しかし複雑化した時にミスを常にゼロにすることは不可能だと判明している
一方でC++からRustにすると以下のようなメリットが山のようにある
・Rustでは使い忘れや使い方ミスをするとコンパイラが必ず指摘してエラーとしてくれる
・Rustでは何も指定しない標準状態でC++のunique_ptrより高機能であるため記述がスッキリそして分かりやすい
・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるがRustではそのコストを必要としない
などなど
使い忘れと使い方ミスを常に完全にゼロにできるならばunique_ptrとshared_ptrでOK
しかし複雑化した時にミスを常にゼロにすることは不可能だと判明している
一方でC++からRustにすると以下のようなメリットが山のようにある
・Rustでは使い忘れや使い方ミスをするとコンパイラが必ず指摘してエラーとしてくれる
・Rustでは何も指定しない標準状態でC++のunique_ptrより高機能であるため記述がスッキリそして分かりやすい
・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるがRustではそのコストを必要としない
などなど
530デフォルトの名無しさん
2022/08/17(水) 16:16:02.25ID:DQ38VMyq 殺虫剤のパラドックスてやつ
531デフォルトの名無しさん
2022/08/17(水) 16:31:22.99ID:1pPRcFoT こんなとこで Rustの宣伝されてもな・・・
532デフォルトの名無しさん
2022/08/17(水) 17:56:04.99ID:IlAVLAST この手の議論って「全てのプログラマがポインタを直に操作する必要に迫られている」という詭弁に基いていて辟易するんだよな
533デフォルトの名無しさん
2022/08/17(水) 18:05:51.06ID:T2QftTg0 RustなんかやめてDelphiにしようぜ
534デフォルトの名無しさん
2022/08/17(水) 18:34:02.81ID:vS4IR+zA 最近ポインタ使わんよね
535デフォルトの名無しさん
2022/08/17(水) 18:40:18.95ID:JVW7ncQZ >>532
ある程度の大きなデータは抽象的な意味でcall by reference (pointer) により受け渡しすることになり実装的にはポインタを使わざるをえない気もする
ある程度の大きなデータは抽象的な意味でcall by reference (pointer) により受け渡しすることになり実装的にはポインタを使わざるをえない気もする
536デフォルトの名無しさん
2022/08/17(水) 19:39:41.85ID:/AaT26gR >>529
Rustの変数をunique ptrと比較している時点でRustの利点を理解出来ていない。
Rustの変数に対応するのはあくまで自動変数で、unique ptr に対応するのはBox<T>。
Rustは「高速化と自動化のためにできるだけスタックフレームを活用する」という基本的な考え方があって、そのためにあの窮屈なルールで自動変数を高機能化している。
Rustの変数がデフォルトムーブだからといって、Rustの変数はunique ptr みたいなものとするのは理解の足りない粗忽者のやることだわ。
Rustの変数をunique ptrと比較している時点でRustの利点を理解出来ていない。
Rustの変数に対応するのはあくまで自動変数で、unique ptr に対応するのはBox<T>。
Rustは「高速化と自動化のためにできるだけスタックフレームを活用する」という基本的な考え方があって、そのためにあの窮屈なルールで自動変数を高機能化している。
Rustの変数がデフォルトムーブだからといって、Rustの変数はunique ptr みたいなものとするのは理解の足りない粗忽者のやることだわ。
537デフォルトの名無しさん
2022/08/17(水) 19:59:51.79ID:07u67rxx >>536
ある意味それも正しいが現実問題じゃないな
例えばi32を10個返す関数を作るとして
その型を[i32; 10]、Box<[i32; 10]>、Vec<i32>のそれぞれにした場合に生成コードはどうなりどれを選ぶべきか考えるとBoxの意義がなああ
結局Rustではもっと最適なものを選ぶからunique_ptr相当すら使うことがレアだよな
ある意味それも正しいが現実問題じゃないな
例えばi32を10個返す関数を作るとして
その型を[i32; 10]、Box<[i32; 10]>、Vec<i32>のそれぞれにした場合に生成コードはどうなりどれを選ぶべきか考えるとBoxの意義がなああ
結局Rustではもっと最適なものを選ぶからunique_ptr相当すら使うことがレアだよな
538デフォルトの名無しさん
2022/08/17(水) 20:32:26.88ID:k/cupzFM539デフォルトの名無しさん
2022/08/17(水) 21:07:14.75ID:0xu2lUBy >>529
>・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるが
>Rustではそのコストを必要としない
本当にコストは必要ないのかな?
本当に参照カウントしないのかな?
>・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるが
>Rustではそのコストを必要としない
本当にコストは必要ないのかな?
本当に参照カウントしないのかな?
540デフォルトの名無しさん
2022/08/17(水) 21:11:48.18ID:0xu2lUBy >>536
unique_ptrはmemory allocationとは全く関係ありません
unique_ptrはmemory allocationとは全く関係ありません
541デフォルトの名無しさん
2022/08/17(水) 21:31:24.12ID:3OxXdiqc unique_ptrなんて自動変数と変わらんじゃろ
542デフォルトの名無しさん
2022/08/17(水) 21:37:14.43ID:IDhwUS5q >>539
Rustは借用(とライフタイム)があるから、
複数の参照が同時に必要となっても、
所有者は一人のまま何も変わらず、
複数の借用を普通に使うだけで済んでしまい、
付加コストの発生は無し。
一方でC++は、
複数の参照が同時に必要となる場合、
unique_ptrではもちろんダメなので、
shared_ptrを使わざるを得ず、
参照カウンタ増減という付加コストが発生。
Rustは借用(とライフタイム)があるから、
複数の参照が同時に必要となっても、
所有者は一人のまま何も変わらず、
複数の借用を普通に使うだけで済んでしまい、
付加コストの発生は無し。
一方でC++は、
複数の参照が同時に必要となる場合、
unique_ptrではもちろんダメなので、
shared_ptrを使わざるを得ず、
参照カウンタ増減という付加コストが発生。
543デフォルトの名無しさん
2022/08/17(水) 21:39:05.15ID:bVkA6pax544デフォルトの名無しさん
2022/08/17(水) 21:40:11.05ID:GcPebzMx そんなん設計でどうにでもなる
ありきたりの道具使ってばっかいるからアタマが退化してんだろ
ありきたりの道具使ってばっかいるからアタマが退化してんだろ
545デフォルトの名無しさん
2022/08/17(水) 21:41:54.05ID:GcPebzMx >shared_ptrを使わざるを得ず
おまえがそう決め付けているだけで、ここら辺は設計でどうにでもなる
おまえがそう決め付けているだけで、ここら辺は設計でどうにでもなる
546デフォルトの名無しさん
2022/08/17(水) 21:46:20.33ID:IDhwUS5q547デフォルトの名無しさん
2022/08/17(水) 21:51:11.86ID:eXFNTowk 同じクラスが重複して定義されたとき、
そのクラスに変数が定義されていてもコンパイルエラーにならないのはなぜですか?
関数が定義されている場合、インライン展開されないとコンパイルエラーになると思います
変数にはそのような指定が無いと思いますが、なぜエラーにならないのでしょうか?
そのクラスに変数が定義されていてもコンパイルエラーにならないのはなぜですか?
関数が定義されている場合、インライン展開されないとコンパイルエラーになると思います
変数にはそのような指定が無いと思いますが、なぜエラーにならないのでしょうか?
548デフォルトの名無しさん
2022/08/17(水) 22:07:13.27ID:vZEBwtyc 言っている意味がちょっとわからないので最小のコードを提示してもらえるとありがたい
549デフォルトの名無しさん
2022/08/17(水) 22:09:46.76ID:wEP2ktHW 単純に、同じクラスを(同じ定義で)二回定義してもエラーにならんの
便利なようで不思議だよな
便利なようで不思議だよな
550デフォルトの名無しさん
2022/08/17(水) 22:10:56.50ID:6ShnCCAk >>542 「複数の参照」が借用で済むようなものなら C++ でも T& でコスト要らなくね?
551デフォルトの名無しさん
2022/08/17(水) 22:12:24.01ID:vZEBwtyc 大抵インクルードガードで1回しか通らないようにしてたけど
(クラス定義だけなら)インクルードガードなしで二重に読んでも通るってことなのか… それはしらんかった
(クラス定義だけなら)インクルードガードなしで二重に読んでも通るってことなのか… それはしらんかった
552デフォルトの名無しさん
2022/08/17(水) 22:14:06.17ID:MGAgUcBD スレタイ読めや
だからRust信者は嫌なんだよ
だからRust信者は嫌なんだよ
553デフォルトの名無しさん
2022/08/17(水) 22:17:02.42ID:IDhwUS5q554デフォルトの名無しさん
2022/08/17(水) 22:35:58.47ID:eXFNTowk 以下のコードをヘッダに記述して複数のソースでインクルードすると、
関数fooは重複定義でコンパイルエラーになります
inline指定にすると、コンパイルは通るようになります
class myClass {
public:
void foo();
int i;
};
void myClass::foo() {
std::cout << "OK";
}
このとき変数iは何故重複定義にならないのでしょうか?
fooと同様に複数のソースで重複定義になる気がするのですが
関数fooは重複定義でコンパイルエラーになります
inline指定にすると、コンパイルは通るようになります
class myClass {
public:
void foo();
int i;
};
void myClass::foo() {
std::cout << "OK";
}
このとき変数iは何故重複定義にならないのでしょうか?
fooと同様に複数のソースで重複定義になる気がするのですが
555デフォルトの名無しさん
2022/08/17(水) 23:24:22.15ID:0xu2lUBy556はちみつ餃子 ◆8X2XSCHEME
2022/08/17(水) 23:28:24.67ID:ito9w61P >>554
int i; はメンバ宣言に該当するがそれ自体は定義ではない。
クラス定義の中にメンバ宣言があるってのがようわからん理屈だがその時点では実体が作られない、
逆に言えばその型のオブジェクトを生成するときになって初めて実体が作られるので
この段階では重複として排除する必要がない。
int i; はメンバ宣言に該当するがそれ自体は定義ではない。
クラス定義の中にメンバ宣言があるってのがようわからん理屈だがその時点では実体が作られない、
逆に言えばその型のオブジェクトを生成するときになって初めて実体が作られるので
この段階では重複として排除する必要がない。
557デフォルトの名無しさん
2022/08/17(水) 23:31:25.13ID:6ShnCCAk558デフォルトの名無しさん
2022/08/17(水) 23:51:08.75ID:eXFNTowk >>556
ありがとうございます
グローバルスコープに定義するときは、
int i;
この記述で定義になるので、複数のソースでインクルードすると当然重複定義になります
クラス内では宣言のみになるとは思いませんでした
そういうものと覚えるしかなさそうですね
ありがとうございます
グローバルスコープに定義するときは、
int i;
この記述で定義になるので、複数のソースでインクルードすると当然重複定義になります
クラス内では宣言のみになるとは思いませんでした
そういうものと覚えるしかなさそうですね
559はちみつ餃子 ◆8X2XSCHEME
2022/08/18(木) 00:07:40.00ID:KKIhvA0h560デフォルトの名無しさん
2022/08/18(木) 02:53:41.59ID:TJJ2kcCc561デフォルトの名無しさん
2022/08/18(木) 04:29:06.72ID:HNqVdbFt >>559
決定的な違い
Rustではダングリング参照するプログラムを絶対に作れない(コンパイラがエラーとする)
C++ではダングリング参照するプログラムがうっかり容易く生じてしまう(そしてコンパイラが通してしまう)
決定的な違い
Rustではダングリング参照するプログラムを絶対に作れない(コンパイラがエラーとする)
C++ではダングリング参照するプログラムがうっかり容易く生じてしまう(そしてコンパイラが通してしまう)
562デフォルトの名無しさん
2022/08/18(木) 04:53:19.13ID:X/mZUHYK >>561
話変わってるだろ
検査してくれるかどうかじゃなくて
> ・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるがRustではそのコストを必要としない
の話だったと思うが?
話変わってるだろ
検査してくれるかどうかじゃなくて
> ・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるがRustではそのコストを必要としない
の話だったと思うが?
563デフォルトの名無しさん
2022/08/18(木) 05:23:06.33ID:l0miaXwd >>562
それはC++で安全を保証しようとすると
複数の参照を用いるならば常にshared_ptrの使用を必須とするしか安全を保証できないのに対して
Rustは複数の参照だけなら借用のみで安全を保証できるという話ではないか
ちなみにRustでは複数の参照ではなくもっとレアケースである複数の所有が生じた時に初めてコンパイラがRcを要求する
つまりRustでは参照と所有が明白に分離されているところが大きな違いとなる
それはC++で安全を保証しようとすると
複数の参照を用いるならば常にshared_ptrの使用を必須とするしか安全を保証できないのに対して
Rustは複数の参照だけなら借用のみで安全を保証できるという話ではないか
ちなみにRustでは複数の参照ではなくもっとレアケースである複数の所有が生じた時に初めてコンパイラがRcを要求する
つまりRustでは参照と所有が明白に分離されているところが大きな違いとなる
564デフォルトの名無しさん
2022/08/18(木) 05:36:06.77ID:X/mZUHYK >>563
安全の保証をコンパイラがやるのかプログラマーがやるのかの違いなんて議論してないよ
安全の保証をコンパイラがやるのかプログラマーがやるのかの違いなんて議論してないよ
565デフォルトの名無しさん
2022/08/18(木) 07:06:14.45ID:DhI3ZTcW C++11以降のマナーでは、ダングリングは発生しない。
設計を見直すべきでは?
旧い規格、例えばDOMを実装する場合、設計を見直すことはできない。
ところで、DOMについて、C++によるGoogle Chromeの実装は素晴らしい洞察で問題を回避している。
後学のために読んでみるとよい。
設計を見直すべきでは?
旧い規格、例えばDOMを実装する場合、設計を見直すことはできない。
ところで、DOMについて、C++によるGoogle Chromeの実装は素晴らしい洞察で問題を回避している。
後学のために読んでみるとよい。
566デフォルトの名無しさん
2022/08/18(木) 07:10:02.07ID:DhI3ZTcW 如何にして安全なスパゲッティ・コードを書くかというのがRustのアプローチなら。
C++の方法論は、「安全なスパゲッティなど存在しない、素麺にしましょう」ということ。
旧式のスパゲッティ・コードを書きたい人にとってC++は役に立たない。
C++の方法論は、「安全なスパゲッティなど存在しない、素麺にしましょう」ということ。
旧式のスパゲッティ・コードを書きたい人にとってC++は役に立たない。
567デフォルトの名無しさん
2022/08/18(木) 08:09:28.79ID:ywzuYu7m まぁ、c++でももっと積極的にスタックフレームに限定するアプローチは欲しいよね。
以前にインスタンスがスタックフレームに存在することを保証するスマート変数を作ろうとしたけど、インスタンス変数をどうしても制限できなくて挫折したことがある。
スマートポインタが必ずスタックにあるのなら、スマートポインタの参照渡しとかもっと活用できるのにね。
以前にインスタンスがスタックフレームに存在することを保証するスマート変数を作ろうとしたけど、インスタンス変数をどうしても制限できなくて挫折したことがある。
スマートポインタが必ずスタックにあるのなら、スマートポインタの参照渡しとかもっと活用できるのにね。
568デフォルトの名無しさん
2022/08/18(木) 09:11:59.95ID:msbrE3Yp スタックかどうかなんてどうでもよくねえ?
機能の問題でしょ?
機能の問題でしょ?
569デフォルトの名無しさん
2022/08/18(木) 09:19:43.25ID:X/mZUHYK570デフォルトの名無しさん
2022/08/18(木) 09:41:11.96ID:zre7odKU 自動変数が嫌いな人一定数いるよね
571はちみつ餃子 ◆8X2XSCHEME
2022/08/18(木) 10:26:05.65ID:KKIhvA0h 大抵の環境でデフォルトのスタックサイズはそれほど大きくない。
数メガバイトというのは現代的な感覚では極端に小さいようにも見える。
でもまあだいたいこれで足りるし、足りるように書くのが普通なんじゃないの。
数メガバイトというのは現代的な感覚では極端に小さいようにも見える。
でもまあだいたいこれで足りるし、足りるように書くのが普通なんじゃないの。
572デフォルトの名無しさん
2022/08/18(木) 11:28:19.94ID:p/limWqp C > Nim > C++ > Rust
573デフォルトの名無しさん
2022/08/18(木) 11:29:37.71ID:p/limWqp >>569
GC要らなくなる
GC要らなくなる
574デフォルトの名無しさん
2022/08/18(木) 11:47:13.53ID:u9P7LJR3575デフォルトの名無しさん
2022/08/18(木) 11:47:44.39ID:u9P7LJR3 >>573
そりゃ全部スタック上で済むならね...
そりゃ全部スタック上で済むならね...
576はちみつ餃子 ◆8X2XSCHEME
2022/08/18(木) 12:03:37.12ID:KKIhvA0h >>574
割り当てが足りなくなれば拡張するが、その上限の設定がデフォルトでは 8MB になっている。
割り当てが足りなくなれば拡張するが、その上限の設定がデフォルトでは 8MB になっている。
577デフォルトの名無しさん
2022/08/18(木) 12:29:58.75ID:ywzuYu7m >>569
単にスタックフレームの入れ子のライフタイムを活用したいだけだな。
単にスタックフレームの入れ子のライフタイムを活用したいだけだな。
578デフォルトの名無しさん
2022/08/18(木) 12:35:06.23ID:R9m+Nq0X ポインタたくさん使う人っておじさんですよね?
実年齢か精神年齢かはともかく
実年齢か精神年齢かはともかく
579デフォルトの名無しさん
2022/08/18(木) 12:37:54.86ID:ywzuYu7m >>577
ちょっと補足。
スマートポインタがスタックにあるのなら、shared ptr の参照とかポインタみたいなヤバイのもそこそこ安全に扱える。余計なインクリメントデクリメントも発生しなくて良くなるし。
ちょっと補足。
スマートポインタがスタックにあるのなら、shared ptr の参照とかポインタみたいなヤバイのもそこそこ安全に扱える。余計なインクリメントデクリメントも発生しなくて良くなるし。
580デフォルトの名無しさん
2022/08/18(木) 12:41:39.14ID:cnxBrL/o なんでスタックである必要があるのかまったくわからん
581デフォルトの名無しさん
2022/08/18(木) 13:27:16.43ID:C4YsUD/k582デフォルトの名無しさん
2022/08/18(木) 13:29:45.98ID:KxsikMs2583デフォルトの名無しさん
2022/08/18(木) 13:34:11.90ID:AgenDKWc >>579
一見その通りだけど
関数で参照を返したい時に、その実体が呼び出し元(かそれ以前)のスタックフレーム上なのか、
それとも消え去る現在のスタック上なのか、安全を保証するために区別する情報が必要となる
そのためにはライフタイムをもっと明確化すればよく、参照が指す実体がスタック上でより深く(か同じ)ことを保証できればよい
すると更に大きな利点が生じる
実体がスタック上に無くてヒープ上に有っても、それを管理するスマポ相当がスタック上にあればライフタイムは同じとなるからだ
結局、スタック上かヒープ上かよりも、ライフタイムを明確化することが重要であると分かる
以上を言語仕様に組み込んだのがRust
一見その通りだけど
関数で参照を返したい時に、その実体が呼び出し元(かそれ以前)のスタックフレーム上なのか、
それとも消え去る現在のスタック上なのか、安全を保証するために区別する情報が必要となる
そのためにはライフタイムをもっと明確化すればよく、参照が指す実体がスタック上でより深く(か同じ)ことを保証できればよい
すると更に大きな利点が生じる
実体がスタック上に無くてヒープ上に有っても、それを管理するスマポ相当がスタック上にあればライフタイムは同じとなるからだ
結局、スタック上かヒープ上かよりも、ライフタイムを明確化することが重要であると分かる
以上を言語仕様に組み込んだのがRust
584デフォルトの名無しさん
2022/08/18(木) 13:54:28.67ID:cnxBrL/o585はちみつ餃子 ◆8X2XSCHEME
2022/08/18(木) 14:09:16.33ID:KKIhvA0h 私もそう思う。 C++ でも明確で、解釈の余地はほぼない。
その上で知ってても人は間違うというところは問題で、チェックを自動化できるように整理したという Rust の功績は大きくはある。
ルール自体の差は C++ と Rust でそれほど大きくはない。
その上で知ってても人は間違うというところは問題で、チェックを自動化できるように整理したという Rust の功績は大きくはある。
ルール自体の差は C++ と Rust でそれほど大きくはない。
586デフォルトの名無しさん
2022/08/18(木) 14:18:54.74ID:PTM9RcdX C++のライフタイムはプログラマーにとっては明確でもコンパイラにとっては明確でない
そのためC++では参照の安全性をコンパイラが保証することができない
そして複雑化した時に人間(プログラマー)はミスを無くすことが出来ない
そのためC++で書かれた多くのソフトウェアで常に穴が発生し続けている
そのためC++では参照の安全性をコンパイラが保証することができない
そして複雑化した時に人間(プログラマー)はミスを無くすことが出来ない
そのためC++で書かれた多くのソフトウェアで常に穴が発生し続けている
587デフォルトの名無しさん
2022/08/18(木) 15:34:56.12ID:KxsikMs2 unique_ptrやshared_ptrを使えば良いだけではないかな?
588はちみつ餃子 ◆8X2XSCHEME
2022/08/18(木) 16:15:40.31ID:KKIhvA0h >>587
C++ のスマートポインタはやっぱり後付け感はある。
Teratail とかの質問サイトを見てたら (コンパイル時にエラーに出来ない形で) 使い方を間違ってセグフォしてたりするのはちょくちょく有る。
コンパイラがガッツリと検査してくれる Rust はありがたいよ。
C++ のスマートポインタはやっぱり後付け感はある。
Teratail とかの質問サイトを見てたら (コンパイル時にエラーに出来ない形で) 使い方を間違ってセグフォしてたりするのはちょくちょく有る。
コンパイラがガッツリと検査してくれる Rust はありがたいよ。
589デフォルトの名無しさん
2022/08/18(木) 16:20:56.69ID:885GVGvO 無能な働き者の軌道修正には良いかもな
590デフォルトの名無しさん
2022/08/18(木) 16:27:29.27ID:9oKj6z2J 桐蔭トリプルプレーだよ
591デフォルトの名無しさん
2022/08/18(木) 16:37:31.46ID:AkD9iM7C たまにはweak_ptrのことも思い出して下さい
592デフォルトの名無しさん
2022/08/18(木) 16:59:01.63ID:4Dlj1ckV >>587
unique_ptrやshared_ptrの使い忘れや使い方ミスなどをしてもコンパイラはエラーとすることができないためC++は安全性を保証できない
他にもget()して得たポインタを関数などに渡した後にそのライフタイムを逸脱しないかなどの保証もできない
全ては人間頼みとなるため多数の穴が生じてきた
unique_ptrやshared_ptrの使い忘れや使い方ミスなどをしてもコンパイラはエラーとすることができないためC++は安全性を保証できない
他にもget()して得たポインタを関数などに渡した後にそのライフタイムを逸脱しないかなどの保証もできない
全ては人間頼みとなるため多数の穴が生じてきた
593デフォルトの名無しさん
2022/08/18(木) 19:33:28.16ID:74ku3J2B 性能厨としては何でもスタックフレームに置いて集積度を高くしたいところ。レジスタの効率とかキャッシュヒット率とか変わるだろうし。
Rustのスタックへのこだわりはいいんだけど、無駄に抽象化しているから余計に複雑になっている感じを受ける。
Rustのスタックへのこだわりはいいんだけど、無駄に抽象化しているから余計に複雑になっている感じを受ける。
594デフォルトの名無しさん
2022/08/18(木) 21:49:54.60ID:SUTQRi3H C++のスマポは言語機能じゃないから書き方長くてだるいし
外部ライブラリは当然ナマポ使ってるから結局その辺でセグフォの危険を排除できないし
オウムみたいにスマポでいいじゃん連呼してるやつは本当に使ったことあんのか?
外部ライブラリは当然ナマポ使ってるから結局その辺でセグフォの危険を排除できないし
オウムみたいにスマポでいいじゃん連呼してるやつは本当に使ったことあんのか?
595デフォルトの名無しさん
2022/08/18(木) 21:58:35.30ID:KxsikMs2 >>592
使えば?と私は提案してるので「使い忘れ」は論外として
「使い方ミス」はどんなミスでしょうか?
ミスのしようがないほど単純だと思います
Rustのコンパイル時にチェックしようという設計は
もちろん良いと思いますよ
使えば?と私は提案してるので「使い忘れ」は論外として
「使い方ミス」はどんなミスでしょうか?
ミスのしようがないほど単純だと思います
Rustのコンパイル時にチェックしようという設計は
もちろん良いと思いますよ
596デフォルトの名無しさん
2022/08/18(木) 22:02:08.08ID:KxsikMs2597デフォルトの名無しさん
2022/08/18(木) 22:07:53.92ID:0oaFEclW スマポにハンドルを突っ込む方法はないですかねえ‥‥
598デフォルトの名無しさん
2022/08/18(木) 22:12:02.34ID:3gZlWdNz >>596
君のような勘違い自信過剰な人がうっかりミスを起こして問題を引き起こしてきた
チェックを人間に依存している限りミスは必ず発生する
ソース記事
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/
グーグルによればAndroidに存在した深刻なセキュリティー脆弱性の70%近くがメモリー安全に関するバグに起因するという。
同様にマイクロソフトも、同社製品に存在したセキュリティー脆弱性の70%がメモリー安全に関するバグに起因すると述べている。
C/C++を使う限りセキュリティー脆弱性を根絶するのは不可能と
君のような勘違い自信過剰な人がうっかりミスを起こして問題を引き起こしてきた
チェックを人間に依存している限りミスは必ず発生する
ソース記事
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/
グーグルによればAndroidに存在した深刻なセキュリティー脆弱性の70%近くがメモリー安全に関するバグに起因するという。
同様にマイクロソフトも、同社製品に存在したセキュリティー脆弱性の70%がメモリー安全に関するバグに起因すると述べている。
C/C++を使う限りセキュリティー脆弱性を根絶するのは不可能と
599デフォルトの名無しさん
2022/08/18(木) 22:16:42.90ID:SUTQRi3H 使われないシステムってバグ出ないんだよね
600デフォルトの名無しさん
2022/08/18(木) 22:17:29.31ID:KxsikMs2601デフォルトの名無しさん
2022/08/18(木) 22:21:49.94ID:KxsikMs2 >>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じゃない?
$ 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じゃない?
602デフォルトの名無しさん
2022/08/18(木) 22:29:53.88ID:6c/4Q98o >>600
それは貴方がアホだからミスに気付いていない可能性、使われないからバグが未発見なだけの可能性、単純なことしかしていないだけの可能性、…
複雑化すると、どんなにベテランでも、多数の人々がコードをチェックしていても、メモリ管理ミスが現実に起きている現実を受け入れましょ
それは貴方がアホだからミスに気付いていない可能性、使われないからバグが未発見なだけの可能性、単純なことしかしていないだけの可能性、…
複雑化すると、どんなにベテランでも、多数の人々がコードをチェックしていても、メモリ管理ミスが現実に起きている現実を受け入れましょ
603デフォルトの名無しさん
2022/08/18(木) 22:43:58.49ID:KxsikMs2604デフォルトの名無しさん
2022/08/18(木) 22:54:56.26ID:MfNSDyn2 誰もお前なんかに興味無い訳だが
605デフォルトの名無しさん
2022/08/18(木) 23:09:02.07ID:KxsikMs2606デフォルトの名無しさん
2022/08/18(木) 23:31:07.48ID:RTRtwr2z どんな複雑なケースでも一度もミスをしたことがない!今後も絶対にミスをしない!
と言ってる人を信頼できるわけがない
と言ってる人を信頼できるわけがない
607デフォルトの名無しさん
2022/08/18(木) 23:38:25.32ID:KxsikMs2608デフォルトの名無しさん
2022/08/18(木) 23:42:25.87ID:KxsikMs2 本当にunique_ptrやshared_ptrでミスするかい?
信じられないほど単純なクラスだと思うけど
>>592の「使い方ミス」って何なの?
getで中身取り出して云々は割とあり得るんだろーけど
それはunique_ptrやshared_ptrの外の出来事だし
信じられないほど単純なクラスだと思うけど
>>592の「使い方ミス」って何なの?
getで中身取り出して云々は割とあり得るんだろーけど
それはunique_ptrやshared_ptrの外の出来事だし
609デフォルトの名無しさん
2022/08/18(木) 23:58:49.20ID:B1ZNmtqG もちろんgetを使った時点でスマポ管轄外となり保証が全く無くなるが
スマポ自体における使い忘れや使い間違いなども色々とあるぜ
例えば
C++11スマートポインタで避けるべき過ち Top10
https://postd.cc/top-10-dumb-mistakes-avoid-c-11-smart-pointers/
スマポ自体における使い忘れや使い間違いなども色々とあるぜ
例えば
C++11スマートポインタで避けるべき過ち Top10
https://postd.cc/top-10-dumb-mistakes-avoid-c-11-smart-pointers/
610デフォルトの名無しさん
2022/08/19(金) 00:27:49.36ID:SM6rQCcv >>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に入って全部リプレースした
あとは過去にも犯さず使用しできてるよ
みんなはどうだい?
有難う!読んでみたよ!過ちを列挙すると以下の通り
>過ちその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に入って全部リプレースした
あとは過去にも犯さず使用しできてるよ
みんなはどうだい?
611デフォルトの名無しさん
2022/08/19(金) 00:34:39.73ID:aSCRajpd getを使ってしまったらthe endなわけだけど
getの使用を皆無で頑張ってるん?
getの使用を皆無で頑張ってるん?
612デフォルトの名無しさん
2022/08/19(金) 00:47:36.81ID:SM6rQCcv613デフォルトの名無しさん
2022/08/19(金) 01:36:44.63ID:Iq0pX04r614デフォルトの名無しさん
2022/08/19(金) 01:38:01.85ID:M+KL048w なんでポインタ使うんですか?
615デフォルトの名無しさん
2022/08/19(金) 02:09:43.59ID:SM6rQCcv >>613
その書いている「参照」ってのはC++の参照ではないですよね?
関数にT型のオブジェクトを引数として渡すとき
関数がシーケンシャルに実行されるなら原則としてT &で渡す
中身が無効値である可能性があるならunique_ptr <T> &で渡す
関数が並行に実行されるならshared_ptr <T>を渡す
その書いている「参照」ってのはC++の参照ではないですよね?
関数にT型のオブジェクトを引数として渡すとき
関数がシーケンシャルに実行されるなら原則としてT &で渡す
中身が無効値である可能性があるならunique_ptr <T> &で渡す
関数が並行に実行されるならshared_ptr <T>を渡す
616デフォルトの名無しさん
2022/08/19(金) 03:25:13.02ID:oQfRblXd T&渡した時にそれが他へ転用され保持されて生き残り続ける可能性を考慮しないの?
617デフォルトの名無しさん
2022/08/19(金) 05:39:15.80ID:HCuI/gXC 静的試験を絶対視するなーんにも分かっとらんやつが推すほどイメージが悪くなるな
618デフォルトの名無しさん
2022/08/19(金) 07:27:50.77ID:QMISJLeV619デフォルトの名無しさん
2022/08/19(金) 08:01:50.73ID:slQGFe9J620デフォルトの名無しさん
2022/08/19(金) 08:25:03.05ID:SM6rQCcv >>616
は? 詳しく
は? 詳しく
621デフォルトの名無しさん
2022/08/19(金) 08:45:24.08ID:xzucV8hS >>597
constructor destructor関数オブジェクトを用意すれば良かったんじゃなかったっけ?smart ptrの典型的な応用例だから、調べりゃすぐ出てくるよ。
constructor destructor関数オブジェクトを用意すれば良かったんじゃなかったっけ?smart ptrの典型的な応用例だから、調べりゃすぐ出てくるよ。
622デフォルトの名無しさん
2022/08/19(金) 08:56:07.71ID:HCuI/gXC >>619
ふーんチェックなのかpgr
ふーんチェックなのかpgr
623デフォルトの名無しさん
2022/08/19(金) 10:22:48.97ID:51hioa9S >>617
俺も以前はそう思っていたんだけど
わずかな補助情報を人間が与えるだけで
Rustコンパイラが静的試験してくれて
人間にとって面倒かつ慎重さを必要とする作業から解放してくれるのを知って考えが変わった
例えて言うなら
動的型付け言語を使っていたところを
わずかな型情報を人間が与えるだけで
静的型付け言語のコンパイラが静的試験をしてくれるようになったのと似てる
俺も以前はそう思っていたんだけど
わずかな補助情報を人間が与えるだけで
Rustコンパイラが静的試験してくれて
人間にとって面倒かつ慎重さを必要とする作業から解放してくれるのを知って考えが変わった
例えて言うなら
動的型付け言語を使っていたところを
わずかな型情報を人間が与えるだけで
静的型付け言語のコンパイラが静的試験をしてくれるようになったのと似てる
624はちみつ餃子 ◆8X2XSCHEME
2022/08/19(金) 11:08:02.29ID:FT/EuRcZ 昔とはソフトウェアの規模感が違う。
そしてプログラミングするのがプログラミングの専門化とは限らない領域が増えた。
(いわゆるエンドユーザー・コンピューティング)
職業的なプログラマにしてもプログラミングの専門化というよりは
別分野のそれぞれの専門化が道具としてのプログラムを作るというような場合も多い。
プログラミングのルールや作法を行きわたらせることは出来ないよ。
検査を強くするのは時代的な背景としても自然に思える。
動的な検査でも静的な検査でもいいが、
C/C++ は検査せずに未定義に突入するのがあまりにも簡単すぎる。
そしてプログラミングするのがプログラミングの専門化とは限らない領域が増えた。
(いわゆるエンドユーザー・コンピューティング)
職業的なプログラマにしてもプログラミングの専門化というよりは
別分野のそれぞれの専門化が道具としてのプログラムを作るというような場合も多い。
プログラミングのルールや作法を行きわたらせることは出来ないよ。
検査を強くするのは時代的な背景としても自然に思える。
動的な検査でも静的な検査でもいいが、
C/C++ は検査せずに未定義に突入するのがあまりにも簡単すぎる。
625デフォルトの名無しさん
2022/08/19(金) 11:09:58.15ID:HCuI/gXC >>623
ナマポひとつロクに扱いきれないスキルと
動的チェックなんて恥ずかしげもなく言っちゃう
バカ用言語があんたにとって有難いのは分かったよ
ここはC++相談室
C++という土俵に立っている者の場だ
落ちこぼれて逃げ出したやつの遠吠えは
誰も聞きたがってない
どっか行け、邪魔なんだよ
ナマポひとつロクに扱いきれないスキルと
動的チェックなんて恥ずかしげもなく言っちゃう
バカ用言語があんたにとって有難いのは分かったよ
ここはC++相談室
C++という土俵に立っている者の場だ
落ちこぼれて逃げ出したやつの遠吠えは
誰も聞きたがってない
どっか行け、邪魔なんだよ
626デフォルトの名無しさん
2022/08/19(金) 11:17:41.46ID:HCuI/gXC 自分のミスを道具のせいにするやつ
そういえば法案のミスをワープロのせいにするバカ役人がいたな
こういう手合いは一事が万事
そういえば法案のミスをワープロのせいにするバカ役人がいたな
こういう手合いは一事が万事
627デフォルトの名無しさん
2022/08/19(金) 11:44:22.83ID:SM6rQCcv >>616が何を言いたいのか今もって分からない
悩む
悩む
628デフォルトの名無しさん
2022/08/19(金) 11:53:43.76ID:SM6rQCcv 一般用語の参照を使ってると思われるあたり
この人(>>613)はC++の参照を知らないレベルだと思うんだよね
C++に関してはほぼ知識がないまま
受け売りでRustが生ポインタを廃止?した利点を主張している
(私もRustのコードは書いたことがないんだけども)
この人は何がしたいんだろうか?
この人(>>613)はC++の参照を知らないレベルだと思うんだよね
C++に関してはほぼ知識がないまま
受け売りでRustが生ポインタを廃止?した利点を主張している
(私もRustのコードは書いたことがないんだけども)
この人は何がしたいんだろうか?
629デフォルトの名無しさん
2022/08/19(金) 11:59:22.84ID:6kbXcgP9 OSのAPIなりその他雑多なライブラリなりでポインタ要るからなあ・・・
630デフォルトの名無しさん
2022/08/19(金) 12:19:36.97ID:HCuI/gXC 動的型付け・・・あー、もしかして動的型宣言のことかな?
だとすると具体的に何言語のことを言ってるんだろう?
Bにはそんなもんないし・・・
だとすると具体的に何言語のことを言ってるんだろう?
Bにはそんなもんないし・・・
631デフォルトの名無しさん
2022/08/19(金) 12:44:26.95ID:BT0K6AVq 昔構造体を値で渡したらポインタにしろっておっさんに怒られたっけ
速度を気にしないんだったらコピーでええのに糞めんどくさかったわ
速度を気にしないんだったらコピーでええのに糞めんどくさかったわ
632デフォルトの名無しさん
2022/08/19(金) 12:47:51.92ID:zzLlPl0v 馬鹿が二人ほど恥を晒しております
633デフォルトの名無しさん
2022/08/19(金) 12:51:04.37ID:FysKbdqv634デフォルトの名無しさん
2022/08/19(金) 13:06:02.28ID:HCuI/gXC635デフォルトの名無しさん
2022/08/19(金) 13:47:12.04ID:FysKbdqv >>634
あまりにも無知すぎて話にならないな
wikipediaでも何でもいいから勉強して出直して来い
動的な型と動的型付けの区別は最低限つけろ
静的型付け言語の中には動的な型と呼ぶものもあるが
静的型付けと動的型付けは基本的に排反の関係だ
あまりにも無知すぎて話にならないな
wikipediaでも何でもいいから勉強して出直して来い
動的な型と動的型付けの区別は最低限つけろ
静的型付け言語の中には動的な型と呼ぶものもあるが
静的型付けと動的型付けは基本的に排反の関係だ
636デフォルトの名無しさん
2022/08/19(金) 13:54:09.00ID:SM6rQCcv >>616が何を言いたいのか今もって分からない
悩む
悩む
637デフォルトの名無しさん
2022/08/19(金) 14:06:18.12ID:zzLlPl0v その一文がわからないようなレベルの奴がメモリ管理で全く失敗ないとか言ってんだもん
みんな呆れてんだよ
みんな呆れてんだよ
638デフォルトの名無しさん
2022/08/19(金) 14:08:38.12ID:SM6rQCcv639デフォルトの名無しさん
2022/08/19(金) 14:09:02.63ID:HCuI/gXC640デフォルトの名無しさん
2022/08/19(金) 14:28:41.00ID:SM6rQCcv641デフォルトの名無しさん
2022/08/19(金) 14:40:23.82ID:FysKbdqv642デフォルトの名無しさん
2022/08/19(金) 16:45:49.60ID:SM6rQCcv643デフォルトの名無しさん
2022/08/19(金) 17:07:32.80ID:rkGmDNWr 栄光在天
聖恩心から感謝申し上げます。
日ごろは激しい摂理の中、プログラム業ごくろうさまです。
さて、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の部門で行うべき変な質問かなとも思いますが……何かやり方やティップがありましたら教えていただければ……
相対的に有田退治にもなります!
聖恩心から感謝申し上げます。
日ごろは激しい摂理の中、プログラム業ごくろうさまです。
さて、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の部門で行うべき変な質問かなとも思いますが……何かやり方やティップがありましたら教えていただければ……
相対的に有田退治にもなります!
644はちみつ餃子 ◆8X2XSCHEME
2022/08/19(金) 17:19:48.26ID:FT/EuRcZ >>643
メンバを
Hoge& Operator=(const Hoge&r)=default;
というように宣言すればデフォルトの定義が実装される。
全てのメンバに対して代入演算子を適用したのと同じことになる。
(もちろん全てのメンバを代入するという挙動で駄目な場合は自分で書くしかしょうがない。)
メンバを
Hoge& Operator=(const Hoge&r)=default;
というように宣言すればデフォルトの定義が実装される。
全てのメンバに対して代入演算子を適用したのと同じことになる。
(もちろん全てのメンバを代入するという挙動で駄目な場合は自分で書くしかしょうがない。)
645デフォルトの名無しさん
2022/08/19(金) 17:31:34.37ID:HCuI/gXC >>641
そのレスには動的な型についての言及がないな
誤魔化したいわけね、返事ありがとう
動的型宣言という言葉は存在しないと言いながら
動的型付けとは【意味が違う】とはどういうことだ?
存在しないものは比較できないはずだぞ
operator<=>でSFINAEだなpgr
そのレスには動的な型についての言及がないな
誤魔化したいわけね、返事ありがとう
動的型宣言という言葉は存在しないと言いながら
動的型付けとは【意味が違う】とはどういうことだ?
存在しないものは比較できないはずだぞ
operator<=>でSFINAEだなpgr
646デフォルトの名無しさん
2022/08/19(金) 17:35:12.15ID:HCuI/gXC >>624-629には沈黙か
大草原
大草原
647はちみつ餃子 ◆8X2XSCHEME
2022/08/19(金) 17:39:10.42ID:FT/EuRcZ >>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; // 代入できる
}
そもそも代入演算子は特に指定しなくても定義されるはずだな。
(ただし基底とメンバの全てが代入可能であるとき。)
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; // 代入できる
}
648デフォルトの名無しさん
2022/08/19(金) 19:46:49.43ID:FysKbdqv649デフォルトの名無しさん
2022/08/19(金) 19:50:44.27ID:HCuI/gXC >>648
勝ったーwww
勝ったーwww
650デフォルトの名無しさん
2022/08/19(金) 19:52:29.50ID:kYAWbXnu >>648
負けちゃったね・・・(´・ω・`)
負けちゃったね・・・(´・ω・`)
651デフォルトの名無しさん
2022/08/19(金) 20:42:25.54ID:rkGmDNWr >>644
>>647
規制されてしまいましたが643でございます。
メンバにユニークポインタがある場合は代入演算子とコピコンは削除された関数とされてしまい、コピーが実行できません(涙
ユニークポインタは明示的に複製されないとだめなのはわかるので、仕様には文句があるべくもないのですが……
例えばの話、データ型にint char等のメンバが100個あったとして、ユニークポインタのユーザー定義型が1個紛れ込むだけで、すべてのメンバを書き出しをしなければいけないのでしょうか?
みなさんはちゃんと書きだしているのですか?と疑問に思ったので・・・
まあユニークポインターを含むデータ型をコピーしない運用をなさっているのだと思うのですが、わたしは使ってしまいます(怒)
そこで、なにか裏技のような方法がないのかなとお聞きしてみた次第であります(`・ω・´)ゞ
>>647
規制されてしまいましたが643でございます。
メンバにユニークポインタがある場合は代入演算子とコピコンは削除された関数とされてしまい、コピーが実行できません(涙
ユニークポインタは明示的に複製されないとだめなのはわかるので、仕様には文句があるべくもないのですが……
例えばの話、データ型にint char等のメンバが100個あったとして、ユニークポインタのユーザー定義型が1個紛れ込むだけで、すべてのメンバを書き出しをしなければいけないのでしょうか?
みなさんはちゃんと書きだしているのですか?と疑問に思ったので・・・
まあユニークポインターを含むデータ型をコピーしない運用をなさっているのだと思うのですが、わたしは使ってしまいます(怒)
そこで、なにか裏技のような方法がないのかなとお聞きしてみた次第であります(`・ω・´)ゞ
652デフォルトの名無しさん
2022/08/19(金) 20:46:36.71ID:xBNdlDtB653デフォルトの名無しさん
2022/08/19(金) 21:01:24.21ID:rkGmDNWr >>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)
{
//メンバ全部かかなきゃいけない( ;∀;)
}
という感じになってしまうのが困るというか……もっと楽できないかなと思いまして(´;ω;`)
メンバ変数 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)
{
//メンバ全部かかなきゃいけない( ;∀;)
}
という感じになってしまうのが困るというか……もっと楽できないかなと思いまして(´;ω;`)
654デフォルトの名無しさん
2022/08/19(金) 21:08:44.41ID:xBNdlDtB655デフォルトの名無しさん
2022/08/19(金) 21:14:52.11ID:rkGmDNWr656デフォルトの名無しさん
2022/08/19(金) 21:36:17.81ID:rkGmDNWr 643です
解決しました
皆様ご親切にありがとうござい甘いた
ラップしてオペレーター実装すればいいだけだったとは……
こんなので悩んでるの私だけではないだろうか
解決しました
皆様ご親切にありがとうござい甘いた
ラップしてオペレーター実装すればいいだけだったとは……
こんなので悩んでるの私だけではないだろうか
657652
2022/08/19(金) 23:10:05.19ID:SM6rQCcv >>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 *;
};
携帯だったので書けなかったけどこんな感じで
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 *;
};
658デフォルトの名無しさん
2022/08/20(土) 17:45:23.06ID:K3rnpbr9659デフォルトの名無しさん
2022/08/20(土) 17:53:55.99ID:zyxn7VyM ハンドルごとに異なるデストラクタを指定すればよいのでは?
何が難しいのかソースで示してくれませんか?
何が難しいのかソースで示してくれませんか?
660デフォルトの名無しさん
2022/08/20(土) 17:54:26.62ID:ThG9yriU661はちみつ餃子 ◆8X2XSCHEME
2022/08/20(土) 18:23:11.87ID:ktmIW8Jj >>658
ポインタ以外のリソース一般を扱うための unique_resource クラスの提案は出ている。
一部の処理系では使えるようになっているし、ポータブルな実装があるので導入してみてもいいかもね。
このような提案が出ているのは逆に言えばスマートポインタではハンドルを上手く扱えないということでもある。
ポインタ以外のリソース一般を扱うための unique_resource クラスの提案は出ている。
一部の処理系では使えるようになっているし、ポータブルな実装があるので導入してみてもいいかもね。
このような提案が出ているのは逆に言えばスマートポインタではハンドルを上手く扱えないということでもある。
662デフォルトの名無しさん
2022/08/20(土) 20:02:38.48ID:vLOPx7Du663デフォルトの名無しさん
2022/08/20(土) 21:48:51.04ID:XA6yEFAc >>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;
}
そのハンドルって何? ハンドルを具体的に指定せずにソースで示せとな?
#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;
}
664デフォルトの名無しさん
2022/08/20(土) 21:51:59.51ID:xbv+n9gR unique_ptr縛りですか?
shared_ptrならコンストラクタの第二引数にDeleter関数を渡せるけど
shared_ptrならコンストラクタの第二引数にDeleter関数を渡せるけど
665デフォルトの名無しさん
2022/08/20(土) 21:53:07.34ID:xbv+n9gR 私が言いたいことを >>663が言ってくれたみたい
666デフォルトの名無しさん
2022/08/21(日) 01:35:54.66ID:hxqq7KJv こんな昔ながらの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;}
};
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;}
};
667デフォルトの名無しさん
2022/08/21(日) 13:06:57.68ID:j3ukytx2 >shared_ptrならコンストラクタの第二引数にDeleter
ほんそれ
ほんそれ
668デフォルトの名無しさん
2022/08/21(日) 18:27:12.08ID:llGchqj4 lzw書いたら、色々プリプロセス突っ込んでやったのにメルセンヌツイスタの前に敗北した。
2色ビットマップは1/5になったけど、ブロックソートがアホみたいに遅い・・・。Orz
2色ビットマップは1/5になったけど、ブロックソートがアホみたいに遅い・・・。Orz
669デフォルトの名無しさん
2022/08/25(木) 01:06:46.68ID:iYSr5CJi ロシアで収監されているナワリヌイ氏が以下URLツイートで「無限ループ」という表現を使ったんだが、どう思う?
https://twitter.com/navalny/status/1562448816267149315
https://twitter.com/5chan_nel (5ch newer account)
https://twitter.com/navalny/status/1562448816267149315
https://twitter.com/5chan_nel (5ch newer account)
670デフォルトの名無しさん
2022/08/25(木) 09:24:32.64ID:q+czqL8k スレチ
671デフォルトの名無しさん
2022/08/25(木) 10:04:27.81ID:1QA/N1Qa サブルーチンsub、
subを呼ぶA、
subを呼ぶB、
があって、subをAとBからしか見えないスコープに置きたくなったんですが、そういうときはnamespaceを切るしかないですか?
subを呼ぶA、
subを呼ぶB、
があって、subをAとBからしか見えないスコープに置きたくなったんですが、そういうときはnamespaceを切るしかないですか?
672デフォルトの名無しさん
2022/08/25(木) 10:09:20.76ID:s36cDPHI >>671
sub, A, Bをひとつのファイルに入れてファイルスコープで区切るとかクラスにまとめてクラススコープで区切るとか
sub, A, Bをひとつのファイルに入れてファイルスコープで区切るとかクラスにまとめてクラススコープで区切るとか
673デフォルトの名無しさん
2022/08/25(木) 12:00:46.82ID:1QA/N1Qa674デフォルトの名無しさん
2022/08/25(木) 18:28:04.89ID:tuQ48GQq Javaとかではstatic関数まとめクラスはよく見るけどC++ではあんまり見ない
それこそnamespaceを使う
それこそnamespaceを使う
675はちみつ餃子 ◆8X2XSCHEME
2022/08/25(木) 18:44:56.88ID:ktMJLYyQ それはどうだろう。
namespace は内部を隠蔽しない。
キッチリと隠したいなら翻訳単位を分けるか、
翻訳単位内でも隠蔽したいならクラスに入れるかしかやりようがない。
やろうと思えば namespace で区切ってここにはアクセスしないことにするという
規約で運用するとかも出来るが、その程度で足りるなら
そんなに分けなくてもよくない? って思うし。
namespace は内部を隠蔽しない。
キッチリと隠したいなら翻訳単位を分けるか、
翻訳単位内でも隠蔽したいならクラスに入れるかしかやりようがない。
やろうと思えば namespace で区切ってここにはアクセスしないことにするという
規約で運用するとかも出来るが、その程度で足りるなら
そんなに分けなくてもよくない? って思うし。
676デフォルトの名無しさん
2022/08/25(木) 20:19:01.82ID:TTLAkLfZ subを公開ヘッダに書かずに非公開ヘッダに書くだけでよくね?もしくはヘッダを用意せずに各ソースコードからexternするとか。どっちも完全に隠蔽されるわけじゃないけど。
あとは全部同じソースコードに格納できるなら無名名前空間の中にsubを入れとくとか?
あとは全部同じソースコードに格納できるなら無名名前空間の中にsubを入れとくとか?
677デフォルトの名無しさん
2022/08/25(木) 21:41:52.10ID:nLwrVbOJ friend
678デフォルトの名無しさん
2022/08/25(木) 22:33:54.95ID:JbTCA7nE プライベートにズケズケ踏み込んで来るのは
友達としてちょっと...
友達としてちょっと...
679デフォルトの名無しさん
2022/08/25(木) 22:54:54.82ID:9RZfx+i1 キミも今日から新しいフレンズだね
680剛田武
2022/08/25(木) 23:01:36.69ID:JbTCA7nE おお!心の友よ!
お前のものは俺のもの
俺のものは俺のもの
お前のものは俺のもの
俺のものは俺のもの
681デフォルトの名無しさん
2022/08/26(金) 06:21:10.20ID:DLmHAhGr682デフォルトの名無しさん
2022/08/27(土) 07:11:01.12ID:I8td9Ncm ジャイアンはジャイ子の兄だから付いたアダ名
683デフォルトの名無しさん
2022/08/27(土) 14:49:53.46ID:K1QPdrfW >>671
AとBがクラスなら共通のMix-inクラスをAとBでprivate(protected)継承するとか?
AとBがクラスなら共通のMix-inクラスをAとBでprivate(protected)継承するとか?
684デフォルトの名無しさん
2022/08/31(水) 19:31:25.12ID:LmkW4fMO MessageBox()みたいな機能でボタンのテキスト変更できるファンクションありませんか
メッセージが"ぬるぽ"なら[ガッ]のボタンを押したいじゃないですか!
[ はい ]、[ いいえ ]だと"ぬるぽです。ガッする場合は[はい]を押してください"みたいに長々と説明しないといけないので(´・ω・`)
メッセージが"ぬるぽ"なら[ガッ]のボタンを押したいじゃないですか!
[ はい ]、[ いいえ ]だと"ぬるぽです。ガッする場合は[はい]を押してください"みたいに長々と説明しないといけないので(´・ω・`)
685デフォルトの名無しさん
2022/08/31(水) 20:06:27.16ID:HFPaJDap >>684
C++の標準ライブラリにGUIは用意されてないのよ
C++の標準ライブラリにGUIは用意されてないのよ
687デフォルトの名無しさん
2022/08/31(水) 20:40:57.36ID:LmkW4fMO ありがとう調べてみます
688デフォルトの名無しさん
2022/09/01(木) 10:24:37.74ID:0re8NfSH windowsのアプリの話
C++で作成するとランタイムが必要なんですか?
Cならランタイムは不要ですか?
windowsのアプリを作成するとしたらC++とCでどちらの方が良いでしょうか?
C++で作成するとランタイムが必要なんですか?
Cならランタイムは不要ですか?
windowsのアプリを作成するとしたらC++とCでどちらの方が良いでしょうか?
689デフォルトの名無しさん
2022/09/01(木) 10:35:00.87ID:J4auvpO0 ランタイムライブラリはCでも必要
アプリ制作が目的ならC/C++はそもそも向いてないかもしれない
出来なくはないが、そのレベルの質問をするようだと今後苦労するかも
アプリ制作が目的ならC/C++はそもそも向いてないかもしれない
出来なくはないが、そのレベルの質問をするようだと今後苦労するかも
690デフォルトの名無しさん
2022/09/01(木) 10:38:04.37ID:0re8NfSH >>689
ありがと
ありがと
691はちみつ餃子 ◆8X2XSCHEME
2022/09/01(木) 10:47:53.40ID:LhGLll4T >>688
C/C++ のランタイムライブラリの一部は Windows の一部として入っているからその範囲内でならどちらでもあまり関係がない。
ランタイムライブラリの一部はVisual C++ 再頒布可能パッケージとして配布されているものもあるが Windows のバージョンによっては
最初から入ってるとかもあるのでそのあたりの事情は複雑。
バージョンの混乱を避けるならスタティックリンク版を使ったほうが楽だと思う。
Windows のアプリケーションを C で書くのはだいぶんしんどいと思う。
C++ なら楽というわけでもないけど各種フレームワークが C++ を前提にしていたりするので全体としては楽をしやすい可能性が高い。
ただ、言語仕様としては C++ のほうがだいぶん複雑ではあるので言語に対する習熟がどの程度かにもよる。
C/C++ のランタイムライブラリの一部は Windows の一部として入っているからその範囲内でならどちらでもあまり関係がない。
ランタイムライブラリの一部はVisual C++ 再頒布可能パッケージとして配布されているものもあるが Windows のバージョンによっては
最初から入ってるとかもあるのでそのあたりの事情は複雑。
バージョンの混乱を避けるならスタティックリンク版を使ったほうが楽だと思う。
Windows のアプリケーションを C で書くのはだいぶんしんどいと思う。
C++ なら楽というわけでもないけど各種フレームワークが C++ を前提にしていたりするので全体としては楽をしやすい可能性が高い。
ただ、言語仕様としては C++ のほうがだいぶん複雑ではあるので言語に対する習熟がどの程度かにもよる。
692デフォルトの名無しさん
2022/09/01(木) 10:58:27.89ID:0gPlf6MI GDI+ なんかはC++ベースだしな
693デフォルトの名無しさん
2022/09/01(木) 11:08:01.39ID:wgtUDrt5 Runtime と API って結局何が違うん?
694デフォルトの名無しさん
2022/09/01(木) 11:10:18.56ID:wgtUDrt5 GDI+はCからでも使えるよな
695はちみつ餃子 ◆8X2XSCHEME
2022/09/01(木) 11:17:08.19ID:LhGLll4T ランタイムは実行時に使われるライブラリ (およびその他の実行時サポート) で、
API はそれらを呼出すインターフェイスのこと。
ただ、そんなにしっかりした定義があるわけではなくて
スタティックリンクするライブラリのインターフェイスを API と呼ぶかどうかなどは人によるかも?
API の P はプロトコルの P なので独立性の高いモジュールの外部仕様なら
形態にかかわらず API と呼んでいいんじゃないかと個人的には思っているが。
API はそれらを呼出すインターフェイスのこと。
ただ、そんなにしっかりした定義があるわけではなくて
スタティックリンクするライブラリのインターフェイスを API と呼ぶかどうかなどは人によるかも?
API の P はプロトコルの P なので独立性の高いモジュールの外部仕様なら
形態にかかわらず API と呼んでいいんじゃないかと個人的には思っているが。
696デフォルトの名無しさん
2022/09/01(木) 11:27:49.27ID:wgtUDrt5 ntdll.dll とか kernel32.dll は API って感じするけど
それ以外は全部 Runtime で良いんじゃないかとも思う
msvcrt を API かって言われたら絶対違う気がする
それ以外は全部 Runtime で良いんじゃないかとも思う
msvcrt を API かって言われたら絶対違う気がする
697デフォルトの名無しさん
2022/09/01(木) 12:14:02.42ID:NUg6437m Application Programming Interface
698デフォルトの名無しさん
2022/09/01(木) 12:36:35.99ID:GpP6p1Yr APIは「境界面・接点」だから、インターフェイスの向こう側は対象外。
ライブラリは「書庫」なので、中身を含めてライブラリ。
ライブラリは「書庫」なので、中身を含めてライブラリ。
699デフォルトの名無しさん
2022/09/01(木) 12:48:19.96ID:0gPlf6MI ランタイムは、特定の開発手段(GCC, VSなど)に関係する実行環境に持ち込むもの
APIは、特定の操作対象(OS、アプリなど)に関係する関数など
APIは、特定の操作対象(OS、アプリなど)に関係する関数など
700デフォルトの名無しさん
2022/09/01(木) 13:18:41.91ID:epb6+NRn 「ランタイム」って不思議な名前だね
何語かな?
何語かな?
701デフォルトの名無しさん
2022/09/01(木) 13:31:42.39ID:NUg6437m Runtime library
https://en.wikipedia.org/wiki/Runtime_library
https://en.wikipedia.org/wiki/Runtime_library
702デフォルトの名無しさん
2022/09/01(木) 13:39:01.39ID:wgtUDrt5 携帯電話をケータイと略してしまって何のことか判らなくなるのが日本人の本質
703デフォルトの名無しさん
2022/09/01(木) 13:49:12.02ID:epb6+NRn >>701
単なるライブラリじゃん
単なるライブラリじゃん
704デフォルトの名無しさん
2022/09/01(木) 14:00:22.77ID:epb6+NRn >>702
英語だと「mobile」だしそこは日本人に限らない
英語だと「mobile」だしそこは日本人に限らない
705デフォルトの名無しさん
2022/09/01(木) 14:04:08.43ID:oIm36FRE 静的じゃなくて、かつ統合的な機能を提供しとるライブラリという感じ
706デフォルトの名無しさん
2022/09/01(木) 14:06:48.53ID:P/wcDX1Q707はちみつ餃子 ◆8X2XSCHEME
2022/09/01(木) 14:15:18.72ID:LhGLll4T >>702
いや、プログラムから呼び出されるライブラリだけでなく実行時サポートのための機構全般を含めてランタイムという場合もある。
たとえば WebAssembly の仮想機械の実装である wasmtime も "A fast and secure runtime for WebAssembly" と説明されている。
https://wasmtime.dev/
明確な用例を見つけられないんだけど .NET とかでも同じようなニュアンスだったはず……。
いや、プログラムから呼び出されるライブラリだけでなく実行時サポートのための機構全般を含めてランタイムという場合もある。
たとえば WebAssembly の仮想機械の実装である wasmtime も "A fast and secure runtime for WebAssembly" と説明されている。
https://wasmtime.dev/
明確な用例を見つけられないんだけど .NET とかでも同じようなニュアンスだったはず……。
708デフォルトの名無しさん
2022/09/01(木) 14:40:23.38ID:veDjuKDC おまえらは用語の定義とかの話になると生き生きしはじめるな
709デフォルトの名無しさん
2022/09/01(木) 14:46:45.68ID:PGNFrqcy それがプログラマに大事な資質の一つだからまあ
710デフォルトの名無しさん
2022/09/01(木) 15:06:04.82ID:X5eV6Z9e WebAPI はどうでもいいとして
Win32API 以前は API ってあんまり聴かんかった気がする
もし時代が時代なら C Runtime は Console API とか
System Call API とか名付けられていたんじゃまいか
Win32API 以前は API ってあんまり聴かんかった気がする
もし時代が時代なら C Runtime は Console API とか
System Call API とか名付けられていたんじゃまいか
711デフォルトの名無しさん
2022/09/01(木) 15:13:38.12ID:epb6+NRn Linux界隈でもランタイムって用語は
あんまり馴染みない気がする
あんまり馴染みない気がする
712はちみつ餃子 ◆8X2XSCHEME
2022/09/01(木) 15:45:49.43ID:LhGLll4T ランタイム (実行時) という語をあてはめる以上は静的ではないというニュアンスが感じられるし、
ダイナミックリンクされるもの全般をふんわりとそう呼び始めたとかではないかなぁ。
あくまでも想像の域を出ないけど。
>710
それはどうだろう。
C ランタイムはコンソールの操作だけを司るわけではないし、ほとんどの関数はシステムコールしない。
あくまでも C という言語の事情に強く結びついているのでランタイムとは呼ばれなかったとしても
C ナントカという名前にはなったんじゃないかな。
ダイナミックリンクされるもの全般をふんわりとそう呼び始めたとかではないかなぁ。
あくまでも想像の域を出ないけど。
>710
それはどうだろう。
C ランタイムはコンソールの操作だけを司るわけではないし、ほとんどの関数はシステムコールしない。
あくまでも C という言語の事情に強く結びついているのでランタイムとは呼ばれなかったとしても
C ナントカという名前にはなったんじゃないかな。
713デフォルトの名無しさん
2022/09/01(木) 16:33:34.64ID:X5eV6Z9e stdc
714デフォルトの名無しさん
2022/09/01(木) 17:32:56.24ID:pvebLOMF libc
715デフォルトの名無しさん
2022/09/01(木) 17:56:44.20ID:6yN4NXnZ libgcc
716デフォルトの名無しさん
2022/09/01(木) 20:14:05.79ID:IftgsB+t DOSの頃はINT21hのシステムコールだしな。
描画はVRAM直だし。
APIと言うより割り込みだな。
描画はVRAM直だし。
APIと言うより割り込みだな。
717デフォルトの名無しさん
2022/09/01(木) 21:31:42.28ID:2+rvldGI APIという言葉からは、実装を絶対に見せたくないという強い意志のようなものを感じる
718デフォルトの名無しさん
2022/09/01(木) 23:17:08.92ID:X5eV6Z9e oppapi
719デフォルトの名無しさん
2022/09/01(木) 23:26:48.72ID:JiwZvitn A(あんまり) P(ぱっとしな) I(い)
720はちみつ餃子 ◆8X2XSCHEME
2022/09/02(金) 00:07:28.67ID:4QwPhwTb >>716
DOS の用語ではファンクションコールじゃなかったっけ……
と思って資料を読み返したらなんだかあまり統一されてない感じだった。
ファンクションリクエストという用語を使っている場合もある。
当時の用語の混乱は置いといて、現代的にには
機械語レベルでの値の受け渡しやメモリの配置は ABI で決めるべきことで
API はその上に構築される高レイヤな概念と解される場合が多いと思う。
ソフトウェア割込みを使うという規約は ABI に属して、
どのような値を渡してどんな効果があるかは API に属すと考えるべきじゃないかな。
DOS の用語ではファンクションコールじゃなかったっけ……
と思って資料を読み返したらなんだかあまり統一されてない感じだった。
ファンクションリクエストという用語を使っている場合もある。
当時の用語の混乱は置いといて、現代的にには
機械語レベルでの値の受け渡しやメモリの配置は ABI で決めるべきことで
API はその上に構築される高レイヤな概念と解される場合が多いと思う。
ソフトウェア割込みを使うという規約は ABI に属して、
どのような値を渡してどんな効果があるかは API に属すと考えるべきじゃないかな。
721デフォルトの名無しさん
2022/09/02(金) 07:20:17.05ID:gHt2MaJh メインフレームではSVC
DIAGNOSEを使う馬合もあるけど
DIAGNOSEを使う馬合もあるけど
722デフォルトの名無しさん
2022/09/02(金) 09:12:32.54ID:K5Jq4B80 こんなのがあったんだけど
https://qiita.com/purigen/items/d68b146f341c41d260fc
c = c = testString.find_first_of(" ")
これってなんで2回も代入してりゅの???わからにゃいよ
https://qiita.com/purigen/items/d68b146f341c41d260fc
c = c = testString.find_first_of(" ")
これってなんで2回も代入してりゅの???わからにゃいよ
723デフォルトの名無しさん
2022/09/02(金) 09:43:01.10ID:tSjdGUVq 誤植でしょ
724デフォルトの名無しさん
2022/09/02(金) 10:15:17.31ID:K5Jq4B80 そっか誤植か〜
わかったニャン☆
わかったニャン☆
725デフォルトの名無しさん
2022/09/02(金) 10:29:24.82ID:J900FDad Win32の頃はint2ehのだしな
描画はシステムメモリに書いてbitbltだし
APIと言うより割り込み棚
描画はシステムメモリに書いてbitbltだし
APIと言うより割り込み棚
726デフォルトの名無しさん
2022/09/02(金) 12:14:46.88ID:2iQGHF2d 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)
| ^
これは何を意味しているのでしょうか?
コンパイラは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)
| ^
727デフォルトの名無しさん
2022/09/02(金) 13:54:12.27ID:gHt2MaJh 俺んとこでは -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 にしても何も言ってこない
バージョンは g++ (Rev5, Built by MSYS2 project) 10.3.0
Microsoft(R) C/C++ Optimizing Compiler Version 19.33.31629 for x64 で /W4 にしても何も言ってこない
728デフォルトの名無しさん
2022/09/02(金) 14:42:37.96ID:E472VNc+729はちみつ餃子 ◆8X2XSCHEME
2022/09/02(金) 14:46:58.07ID:4QwPhwTb730デフォルトの名無しさん
2022/09/02(金) 15:04:43.31ID:2iQGHF2d731はちみつ餃子 ◆8X2XSCHEME
2022/09/02(金) 15:06:04.63ID:4QwPhwTb >>730
いや、エラーメッセージでググったら stackoverflow で背景の説明をしてるのが見つかったぞ。
いや、エラーメッセージでググったら stackoverflow で背景の説明をしてるのが見つかったぞ。
732デフォルトの名無しさん
2022/09/02(金) 18:13:40.07ID:/OwM2R8K ω株 PI.3.14
733デフォルトの名無しさん
2022/09/13(火) 14:35:12.50ID:pQsEVmxh OSの板で聞くべきかもしらんが、終了シグナル受け取ったらメモリの中身を書き出して中断し、再びコマンドが叩かれたらメモリの中身を読み込んで途中から再開するみたいな仕組みを一番簡単にやる方法ってどんなですかね?
チェックポイント・リスタートっていうんでしょうか
チェックポイント・リスタートっていうんでしょうか
734はちみつ餃子 ◆8X2XSCHEME
2022/09/13(火) 15:19:18.69ID:w3MhG8uL >>733
Linux とか BSD で昔はメモリをダンプするシステムコールがあったはずだが廃止されたんじゃなかったっけ。
Emacs でそのシステムコールを使ってたから色々とゴタゴタしたような記憶がある。
(そのシステムコールの名前が思い出せない……。 すまぬ。)
再開に必要な情報を適当にシリアライズして書き出すしかしょうがないんじゃないの。
Linux とか BSD で昔はメモリをダンプするシステムコールがあったはずだが廃止されたんじゃなかったっけ。
Emacs でそのシステムコールを使ってたから色々とゴタゴタしたような記憶がある。
(そのシステムコールの名前が思い出せない……。 すまぬ。)
再開に必要な情報を適当にシリアライズして書き出すしかしょうがないんじゃないの。
735デフォルトの名無しさん
2022/09/13(火) 23:44:43.38ID:Vl/J6nKl やったことないけどgdbでできそうな気はする
736デフォルトの名無しさん
2022/09/14(水) 01:15:05.96ID:o/NVybOh ptraceは無敵
737デフォルトの名無しさん
2022/09/22(木) 16:50:54.43ID:MKlA3Ol3 おはこんばんわ
何度もお世話になっておりますが、今回も皆様のお知恵をお借りしたく書き込みをしております。
初歩的な質問かもしれませんが質問させてください!
私の質問は、動的な任意型を戻り値とする関数を作ることは可能でしょうか??という事です。
したい事は、
template <typename T>
T ret(int arg)
{
If(arg==0)return static_cast<hoge>(arg);
else if(arg==1)return static_cast<hage>(arg);
}
でホゲ型とホラン千秋型を引数によって変化させて返却したいのです……が、
私が見ても無理そうな感じなのです。ニパー
そもそもテンプレートってコンパイル時点で推察できないと無理ですよね?
この悩みに何か方法や別解があったりしたら教えていただきたく、スレ汚しを失礼しております。
感謝は先に申し上げておきます。
ありがとうございます!
何度もお世話になっておりますが、今回も皆様のお知恵をお借りしたく書き込みをしております。
初歩的な質問かもしれませんが質問させてください!
私の質問は、動的な任意型を戻り値とする関数を作ることは可能でしょうか??という事です。
したい事は、
template <typename T>
T ret(int arg)
{
If(arg==0)return static_cast<hoge>(arg);
else if(arg==1)return static_cast<hage>(arg);
}
でホゲ型とホラン千秋型を引数によって変化させて返却したいのです……が、
私が見ても無理そうな感じなのです。ニパー
そもそもテンプレートってコンパイル時点で推察できないと無理ですよね?
この悩みに何か方法や別解があったりしたら教えていただきたく、スレ汚しを失礼しております。
感謝は先に申し上げておきます。
ありがとうございます!
738デフォルトの名無しさん
2022/09/22(木) 17:27:40.84ID:vBAk//C3 >>737
一般的には型システムの健全性と安全性のために
そのような用途では代数的データ型(タグ付き共用体)を用いる
C++ではstd::variantであるがパターンマッチングなどの言語サポートがないため若干扱いにくい
一般的には型システムの健全性と安全性のために
そのような用途では代数的データ型(タグ付き共用体)を用いる
C++ではstd::variantであるがパターンマッチングなどの言語サポートがないため若干扱いにくい
739はちみつ餃子 ◆8X2XSCHEME
2022/09/22(木) 19:28:31.52ID:He0eupRY >>737
実行時の多相は抽象クラスを使うのが基本ということになってる。
その場合で言えば hoge と hage が共通のインターフェイスを持つ (抽象クラスを継承する) ようにクラス設計するのが普通。
まずは抽象クラスを学んでみて。
最初からクラス設計に関与することが出来ない場合 (既存のライブラリなので手を加えられないなど)
に動的に切り替える必要があるなら std::variant や std::any が使えるのだけれど……
使う箇所で元の型にキャストしなおしたり、 std::visit を経由したりで煩雑になりがち。
実行時の多相は抽象クラスを使うのが基本ということになってる。
その場合で言えば hoge と hage が共通のインターフェイスを持つ (抽象クラスを継承する) ようにクラス設計するのが普通。
まずは抽象クラスを学んでみて。
最初からクラス設計に関与することが出来ない場合 (既存のライブラリなので手を加えられないなど)
に動的に切り替える必要があるなら std::variant や std::any が使えるのだけれど……
使う箇所で元の型にキャストしなおしたり、 std::visit を経由したりで煩雑になりがち。
740デフォルトの名無しさん
2022/09/22(木) 21:37:36.04ID:PsWl+Otb anyってstdに入ってるんだ!
741デフォルトの名無しさん
2022/09/22(木) 22:12:16.21ID:PsWl+Otb742はちみつ餃子 ◆8X2XSCHEME
2022/09/22(木) 22:27:10.41ID:He0eupRY >>740
入ったのは C++17 だし、あまり積極的には使わない種類のものだから目立たないよな……
入ったのは C++17 だし、あまり積極的には使わない種類のものだから目立たないよな……
743デフォルトの名無しさん
2022/09/23(金) 00:25:25.16ID:LrToOuio 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;
}
#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;
}
744デフォルトの名無しさん
2022/09/23(金) 02:10:00.16ID:gD4It3Ab Python や tcl のコードだな
745デフォルトの名無しさん
2022/09/23(金) 02:31:56.65ID:LrToOuio 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;
}
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;
}
746デフォルトの名無しさん
2022/09/23(金) 17:57:04.27ID:tVlOtcCS747デフォルトの名無しさん
2022/09/23(金) 18:13:00.58ID:MklXD0R7 そういう用途でタグ無しunionは危険で不便な昔の遺物
どの言語でも安全で便利なタグ付きunionを用いる
C++はパターンマッチングが弱いのでそこを改善すればさらに便利になるはずだ
どの言語でも安全で便利なタグ付きunionを用いる
C++はパターンマッチングが弱いのでそこを改善すればさらに便利になるはずだ
748デフォルトの名無しさん
2022/09/23(金) 19:52:56.72ID:Ztvb6Y4W 無名の共用体
anonymous union
anonymous union
749デフォルトの名無しさん
2022/09/23(金) 23:41:53.30ID:icgBEU6J anonymous union というとなにかこう、不穏なひびきがあるな
集団で徒党をくんでハッキングする的な
集団で徒党をくんでハッキングする的な
750デフォルトの名無しさん
2022/09/24(土) 00:05:53.42ID:G+JpnkhJ そもそも文脈なしのunionって労働組合だからもともと不穏な響きの単語
751デフォルトの名無しさん
2022/09/24(土) 00:18:57.85ID:JL9pTOdW ネトウヨ現る
752デフォルトの名無しさん
2022/09/24(土) 00:38:49.83ID:Pnjq2Ki8 Union Jack
753デフォルトの名無しさん
2022/09/24(土) 00:38:55.02ID:NrutJXN/ 「集団」で「徒党」を組むって
754デフォルトの名無しさん
2022/09/24(土) 20:29:13.36ID:7pBAspe1 Visual Studio Community おそろしあ
755デフォルトの名無しさん
2022/09/24(土) 22:05:06.81ID:51wpUqA8 チューリンからメール北?
756デフォルトの名無しさん
2022/09/26(月) 08:57:53.30ID:Fzzl8jy0 >>751
何が見えてるの…
何が見えてるの…
757デフォルトの名無しさん
2022/09/26(月) 21:36:36.83ID:T6INyDl8 ちょっとわからなくなってきたため良ければ教えてください。
他言語を使用していて強く感じることですが、.hと.cppを行ったり来たりする開発スタイルがかなり面倒に感じます。
ヘッダに実装を書いても普通にビルド出来てしまうため個人的な開発はヘッダオンリで済ませています。
何番煎じの話かもしれませんが、分割するしないでのメリット・デメリットを教えてください。
他言語を使用していて強く感じることですが、.hと.cppを行ったり来たりする開発スタイルがかなり面倒に感じます。
ヘッダに実装を書いても普通にビルド出来てしまうため個人的な開発はヘッダオンリで済ませています。
何番煎じの話かもしれませんが、分割するしないでのメリット・デメリットを教えてください。
758デフォルトの名無しさん
2022/09/26(月) 21:41:04.85ID:yuD7kgln 再コンパイルコストとインターフェイスと実装の分離
hに全部書いてしまうと、それの変更があった場合にincludeするすべてのファイルで再コンパイルが走り、時間がかかるようになる
hに全部書くため、変更の機会も当然多くなり、頻繁にビルド待ちの状態になるのは避けたい
インターフェイスと実装を分離しておくことは、保守や共有の最、理解を早くするという点で有用
どっちの話も大規模になると効いてくる話なので、小規模開発なら全部.hに書くスタイルでも構わないとは思う
hに全部書いてしまうと、それの変更があった場合にincludeするすべてのファイルで再コンパイルが走り、時間がかかるようになる
hに全部書くため、変更の機会も当然多くなり、頻繁にビルド待ちの状態になるのは避けたい
インターフェイスと実装を分離しておくことは、保守や共有の最、理解を早くするという点で有用
どっちの話も大規模になると効いてくる話なので、小規模開発なら全部.hに書くスタイルでも構わないとは思う
759はちみつ餃子 ◆8X2XSCHEME
2022/09/27(火) 09:30:59.47ID:ozjafOA0 >>757
C の延長線上でなんとかしてきた C++ の言語仕様があんまり良くないんだよ……。
実装とインターフェイスを分けるのはカプセル化の観点からも好ましいのだけれど
C++ ではテンプレートを処理する都合上でこの分離が破綻しているので
そこらへんはまあ運用の工夫で……みたいな微妙な機微がある。
どうにもならんのがわかってるから新しい C++ ではようやくモジュールが導入された。
C の延長線上でなんとかしてきた C++ の言語仕様があんまり良くないんだよ……。
実装とインターフェイスを分けるのはカプセル化の観点からも好ましいのだけれど
C++ ではテンプレートを処理する都合上でこの分離が破綻しているので
そこらへんはまあ運用の工夫で……みたいな微妙な機微がある。
どうにもならんのがわかってるから新しい C++ ではようやくモジュールが導入された。
760デフォルトの名無しさん
2022/09/27(火) 09:41:59.52ID:ZJUDc1gE FILE * は使っても
struct FILE の中身なんて知らなくて良いからな
使うだけなら void * で充分
struct FILE の中身なんて知らなくて良いからな
使うだけなら void * で充分
761デフォルトの名無しさん
2022/09/27(火) 11:09:05.55ID:HLZr1vWv c#みたいにヘッダ無いのが良いことだとは思えんのだよなあ
762デフォルトの名無しさん
2022/09/27(火) 11:20:16.93ID:XJRFtCjW C#だけでなく今世紀のプログラミング言語は全てヘッダファイルなんて無いんじゃない?
不要なものなんだと思うよ
不要なものなんだと思うよ
763デフォルトの名無しさん
2022/09/27(火) 11:28:04.52ID:dmYM9sG7 .hppって拡張子でヘッダに処理を書いてるのを見たことある
764はちみつ餃子 ◆8X2XSCHEME
2022/09/27(火) 14:13:36.82ID:ozjafOA0 >>763
.hpp は C++ のヘッダとしてはありふれた拡張子。 定義を書くかどうかとは関係なく使われるよ。
昔は .hxx とか .h++ とかもあったし、テンプレートが含まれるヘッダには .tcc と付ける習慣が一部にはあった。
大文字で .H とか付けてるのも有ったけどファイルシステムによっては大文字と小文字が区別されないから早い内に廃れたと思う。
C と共用できるように書かれたヘッダを除いては .h という拡張子は避けたほうが運用しやすいと思うんだが、
そこらへんの考え方も慣例が確立していなくてなんだかグダグダなんだよなぁ。
.hpp は C++ のヘッダとしてはありふれた拡張子。 定義を書くかどうかとは関係なく使われるよ。
昔は .hxx とか .h++ とかもあったし、テンプレートが含まれるヘッダには .tcc と付ける習慣が一部にはあった。
大文字で .H とか付けてるのも有ったけどファイルシステムによっては大文字と小文字が区別されないから早い内に廃れたと思う。
C と共用できるように書かれたヘッダを除いては .h という拡張子は避けたほうが運用しやすいと思うんだが、
そこらへんの考え方も慣例が確立していなくてなんだかグダグダなんだよなぁ。
765デフォルトの名無しさん
2022/09/27(火) 18:54:18.35ID:vGdotfW0 >>763
template主体ならhppにガッツリ書いてたけど、ちな、どこに書くの?
template主体ならhppにガッツリ書いてたけど、ちな、どこに書くの?
766デフォルトの名無しさん
2022/09/27(火) 19:06:22.22ID:c5I+FNto ヘッダはテンプレートでごちゃごちゃしてなければどんな構造してるのかパッと見で分かりやすい
767デフォルトの名無しさん
2022/09/27(火) 19:11:23.36ID:3EQ0ZEAi ヘッダに実装書く必要がある場合は
俺はインターフェース用ヘッダと実装用ヘッダに分けてるな
ヘッダには本来インターフェースのみが簡潔に書かれているのが望ましいと思う
俺はインターフェース用ヘッダと実装用ヘッダに分けてるな
ヘッダには本来インターフェースのみが簡潔に書かれているのが望ましいと思う
768デフォルトの名無しさん
2022/09/27(火) 20:14:12.91ID:eLTt/hKm 他のプログラミング言語はヘッダファイルが無くても困っていないから
ヘッダファイルは大昔当時のCコンパイラがサボるために用意しただけの本来は要らない子なんじゃ?
ヘッダファイルは大昔当時のCコンパイラがサボるために用意しただけの本来は要らない子なんじゃ?
769デフォルトの名無しさん
2022/09/27(火) 20:35:59.29ID:c5I+FNto ソース公開出来ないようなハード実装ライブラリを隠蔽して提供するためにはヘッダは必須項目
770デフォルトの名無しさん
2022/09/27(火) 20:41:17.15ID:WqTtjjk3771デフォルトの名無しさん
2022/09/27(火) 20:49:31.24ID:3EQ0ZEAi772デフォルトの名無しさん
2022/09/27(火) 21:01:15.67ID:uWssz7Bg >>771
時代遅れすぎだろw
今はそんなヘッダファイルを見なくても
ヘッダファイルが存在しなくても
ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
だからC/C++以外はヘッダファイルなんて存在しない
時代遅れすぎだろw
今はそんなヘッダファイルを見なくても
ヘッダファイルが存在しなくても
ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
だからC/C++以外はヘッダファイルなんて存在しない
773デフォルトの名無しさん
2022/09/27(火) 21:05:03.18ID:3EQ0ZEAi >>772
>ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
それはヘッダがないから仕方なくなのではないかな?
C++でも自動抽出ツールされたドキュメントを見ても良いのだよ
>ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
それはヘッダがないから仕方なくなのではないかな?
C++でも自動抽出ツールされたドキュメントを見ても良いのだよ
774デフォルトの名無しさん
2022/09/27(火) 21:08:18.80ID:j15wYqDV >>773
つまりヘッダファイルの必要性はない、との結論になりますな
つまりヘッダファイルの必要性はない、との結論になりますな
775デフォルトの名無しさん
2022/09/27(火) 21:10:16.49ID:3EQ0ZEAi ならない
776はちみつ餃子 ◆8X2XSCHEME
2022/09/27(火) 21:23:27.93ID:ozjafOA0 実装とインターフェイスを分離するという根本思想自体はよかったと思う。
それを実現するためにプリプロセッサで単純にヘッダをはめ込むというのは雑すぎるやり方だとも思う。
それを実現するためにプリプロセッサで単純にヘッダをはめ込むというのは雑すぎるやり方だとも思う。
777デフォルトの名無しさん
2022/09/27(火) 21:36:37.50ID:D5WhN1Dz 他の言語はヘッダ無くても何も困っていないから
本質的にはヘッダは不要物なのだと思われる
本質的にはヘッダは不要物なのだと思われる
778デフォルトの名無しさん
2022/09/27(火) 22:23:04.59ID:vPBo+Ol+ マルチパスコンパイルするオプションがコンパイラにあればいいのにね
779デフォルトの名無しさん
2022/09/27(火) 22:28:17.08ID:TG8VJWwA >>777
古い bcc には、確かヘッダを自動抽出するオプションがあった気がする
古い bcc には、確かヘッダを自動抽出するオプションがあった気がする
780デフォルトの名無しさん
2022/09/27(火) 22:39:41.48ID:EwsxhlHO 仕組みが簡潔でドライなシステムを好む人もいるし
もはや把握しきれないカオスなシステムに帰依する人もいる
俺は前者だし、これからもそうありたい
もはや把握しきれないカオスなシステムに帰依する人もいる
俺は前者だし、これからもそうありたい
781デフォルトの名無しさん
2022/09/27(火) 22:51:33.49ID:c5I+FNto カオスは崩壊へと繋がる
ATiのCatalystのようにな
ATiのCatalystのようにな
782デフォルトの名無しさん
2022/09/27(火) 23:37:44.35ID:3EQ0ZEAi 実装とインターフェイスの分離の点でC++が甘いのは
classのメンバー変数がヘッダに書くところ
俺はデフォルトでpimplにしてるけど
classのメンバー変数がヘッダに書くところ
俺はデフォルトでpimplにしてるけど
783デフォルトの名無しさん
2022/09/27(火) 23:55:22.40ID:TrPk/9km >>780
最近の言語はどれもその簡潔な方式だよ
ヘッダファイルとソースファイルは二重管理だからソースファイルに統一
さらにソース付随コメントとドキュメントファイルも統合してソースファイルにのみ記述
シンプルになってる
最近の言語はどれもその簡潔な方式だよ
ヘッダファイルとソースファイルは二重管理だからソースファイルに統一
さらにソース付随コメントとドキュメントファイルも統合してソースファイルにのみ記述
シンプルになってる
784デフォルトの名無しさん
2022/09/28(水) 00:14:01.17ID:SR5jaMok 自動生成みたいなことしても、特に見通しがよくなっとらんと思うんだよね
ヘッダファイルじゃなくてもいいけど、どこかでユーザにインタフェース提示を強制する必要はある気がする
ヘッダファイルじゃなくてもいいけど、どこかでユーザにインタフェース提示を強制する必要はある気がする
785デフォルトの名無しさん
2022/09/28(水) 00:21:27.19ID:2Lj4foK2786デフォルトの名無しさん
2022/09/28(水) 00:52:38.13ID:qgMCZEH2 いや俺はインターフェースは簡潔にヘッダーにまとまってる方が良い
管理が二重になっている云々は同意せんでもないが
同一性はコンパイラがチェックしてくれるので全く問題なし
ドキュメントの自動生成ってリアルタイムに更新してくれるんかいな?
Doxygenみたいなのを想像してるんだが?
管理が二重になっている云々は同意せんでもないが
同一性はコンパイラがチェックしてくれるので全く問題なし
ドキュメントの自動生成ってリアルタイムに更新してくれるんかいな?
Doxygenみたいなのを想像してるんだが?
787デフォルトの名無しさん
2022/09/28(水) 00:54:10.34ID:qgMCZEH2 C++に慣れすぎて実装とインターフェースが混在してるソース見ると
俺は読みたくなくなるんだが?
俺は読みたくなくなるんだが?
788デフォルトの名無しさん
2022/09/28(水) 00:57:52.51ID:ipyGSCwr789デフォルトの名無しさん
2022/09/28(水) 01:57:05.38ID:wKFGQzb0790はちみつ餃子 ◆8X2XSCHEME
2022/09/28(水) 02:35:16.76ID:koSj9wX0 >>768
ヘッダを分けるのは最初は処理系の実装上の都合だったのは事実だと思う。
素朴なオブジェクトファイルは名前とアドレスの組でしか管理していない。
具体的な型をやりとりする仕組みは必要で、それがヘッダファイル。
リンカなどのツールチェインが充実していないのを
コンパイラとプリプロセッサがカバーする形なのでツールチェイン全体が上手く連携できるなら
ヘッダという仕組みは無くても良い。
それはそれとして処理に必要かどうかと言語の表現はまた別問題だ。
原理的に必要かどうかだけで言うならバイナリエディタだけあればプログラムは作れることになってしまうよ。
言語は機械に処理させる以上に人が読み書きする。
もちろんどんな言語が分かり易いかは人によるだろうけども
C++ に満足している C++ ユーザは実装とインターフェイス分離することを利点だと考えている場合は確実に多いよ。
私もそうだし。
ヘッダを分けるのは最初は処理系の実装上の都合だったのは事実だと思う。
素朴なオブジェクトファイルは名前とアドレスの組でしか管理していない。
具体的な型をやりとりする仕組みは必要で、それがヘッダファイル。
リンカなどのツールチェインが充実していないのを
コンパイラとプリプロセッサがカバーする形なのでツールチェイン全体が上手く連携できるなら
ヘッダという仕組みは無くても良い。
それはそれとして処理に必要かどうかと言語の表現はまた別問題だ。
原理的に必要かどうかだけで言うならバイナリエディタだけあればプログラムは作れることになってしまうよ。
言語は機械に処理させる以上に人が読み書きする。
もちろんどんな言語が分かり易いかは人によるだろうけども
C++ に満足している C++ ユーザは実装とインターフェイス分離することを利点だと考えている場合は確実に多いよ。
私もそうだし。
791デフォルトの名無しさん
2022/09/28(水) 05:55:54.63ID:8U6H9Gn3 単にヘッダファイルに慣れていて愛着があるだけです
冷静に考えれば分かります
他の言語はヘッダファイルがなくても機能しています
つまりヘッダファイルは不要なものです
他の言語はヘッダファイル方式を採用しませんでした
つまりヘッダファイルを採用するに値するアドバンテージはありません
冷静に考えれば分かります
他の言語はヘッダファイルがなくても機能しています
つまりヘッダファイルは不要なものです
他の言語はヘッダファイル方式を採用しませんでした
つまりヘッダファイルを採用するに値するアドバンテージはありません
792デフォルトの名無しさん
2022/09/28(水) 08:10:47.02ID:PNF1OAD8 今は必要に応じてIDLを使うようになっているだけじゃない?Protobufぐらいしか知らないけど。
793デフォルトの名無しさん
2022/09/28(水) 08:51:33.64ID:qgMCZEH2794デフォルトの名無しさん
2022/09/28(水) 09:19:16.30ID:H8fqr1nL c#のプロジェクト、実装してから設計起こした様なグダグダなのばっかになってるよね
pythonだとそうはならん気がするけど
pythonだとそうはならん気がするけど
795デフォルトの名無しさん
2022/09/28(水) 22:49:08.92ID:6+yt9OFm obj や lib だけを提供する場合は、ヘッダは絶対に必要かと
他の言語ではどうしていますか?
他の言語ではどうしていますか?
796デフォルトの名無しさん
2022/09/29(木) 03:41:22.05ID:6tct/z4w ヘッダは無くてもいいがある方が便利なときがある
使い回すマクロの定数とか定義とかヘッダに書くのが一般だし
誰かが書いてたけどヘッダファイルに関数の説明とか書くスタイルなら
そこだけ見れば済むようになるし
無くても困らないけど結局は
include xxx.c なんてソースコードを見ることなると思う
使い回すマクロの定数とか定義とかヘッダに書くのが一般だし
誰かが書いてたけどヘッダファイルに関数の説明とか書くスタイルなら
そこだけ見れば済むようになるし
無くても困らないけど結局は
include xxx.c なんてソースコードを見ることなると思う
797デフォルトの名無しさん
2022/09/29(木) 03:46:51.96ID:6tct/z4w798デフォルトの名無しさん
2022/09/29(木) 04:34:33.18ID:MD5zUQsY ラムダ式でコピーキャプチャした変数ってなんでデフォルトで immutable なの?
あとそれに関連してるかもしれないけど、const int a があったとして、a をコピーキャプチャして mutable をつけたラムダ式の中で a を変更しようとすると許されないんだけど、これもなんで?
あとそれに関連してるかもしれないけど、const int a があったとして、a をコピーキャプチャして mutable をつけたラムダ式の中で a を変更しようとすると許されないんだけど、これもなんで?
799デフォルトの名無しさん
2022/09/29(木) 06:34:14.97ID:Jka8tyPG 最初にラムダ入れた時の設計ミス
800デフォルトの名無しさん
2022/09/29(木) 07:34:10.57ID:u1XdWODd ミスか?
俺はGJと思ったぞ
constの逆は欲しかった
明示的に書き込み許可すんの
俺はGJと思ったぞ
constの逆は欲しかった
明示的に書き込み許可すんの
801デフォルトの名無しさん
2022/09/29(木) 08:13:36.08ID:HMWtGy3T >>795
ドキュメントを配る
ドキュメントを配る
802デフォルトの名無しさん
2022/09/29(木) 09:51:48.04ID:r+IaQb6m ヘッダなんて特別なものはなくて
includeディレクティブがあるだけ
includeディレクティブがあるだけ
803デフォルトの名無しさん
2022/09/29(木) 13:54:32.28ID:o1fQB+Qf C++11以前なのでoverride演算子がないソースコードなのですが、
派生クラスでオーバーライドされている関数を簡単に見つける方法って
ありますか?
virtual関数を1つずつgrepするしかないですかね。
派生クラスでオーバーライドされている関数を簡単に見つける方法って
ありますか?
virtual関数を1つずつgrepするしかないですかね。
804デフォルトの名無しさん
2022/09/29(木) 14:30:55.43ID:o/ss6osA >>803 何の前提も無ければ自分がソース持ってないところでオーバーライドされてる可能性もあるので、
いろいろ前提を絞らないと無理かと。
override (「演算子」じゃなくて「キーワード」)があったとしても、付け忘れてる可能性もあるし。
いろいろ前提を絞らないと無理かと。
override (「演算子」じゃなくて「キーワード」)があったとしても、付け忘れてる可能性もあるし。
805デフォルトの名無しさん
2022/09/29(木) 15:19:58.87ID:o1fQB+Qf806デフォルトの名無しさん
2022/09/29(木) 15:27:09.76ID:OAAH5wr1 ヘッダに実装が書かれててもエディタでショートカット1個押して折りたたむだけでインターフェースすぐわかるくね?
807デフォルトの名無しさん
2022/09/29(木) 17:04:17.17ID:nKyEXpsu まっとうならバイナリなりだけ開発環境でインポートすれば、
綺麗にインターフェイスが見える。
綺麗にインターフェイスが見える。
808はちみつ餃子 ◆8X2XSCHEME
2022/09/29(木) 17:12:42.79ID:xXycU9Ev 共有オブジェクト (ダイナミックリンクライブラリ) の段階にまでなってしまうと型は別のところから与える必要があって、
基本的にはビルドの時に型情報を表すなんらかのファイルも生成できるけど、めんどいのは言語をまたぐときなんよね。
Windows API はいろんな言語から使えるような (バインディングの生成元に出来るような) メタデータを提供するという形で
対処しているのでこのへんは Windows API に限らず使いやすいように規格化や環境整備が進むことを期待している。
基本的にはビルドの時に型情報を表すなんらかのファイルも生成できるけど、めんどいのは言語をまたぐときなんよね。
Windows API はいろんな言語から使えるような (バインディングの生成元に出来るような) メタデータを提供するという形で
対処しているのでこのへんは Windows API に限らず使いやすいように規格化や環境整備が進むことを期待している。
809803
2022/09/29(木) 17:14:04.54ID:o1fQB+Qf 今はLinuxでgcc+vimを使っています。
どういう環境なら見えますか?
どういう環境なら見えますか?
810デフォルトの名無しさん
2022/09/29(木) 18:21:37.90ID:YHMprl0j gtagsとか?
811はちみつ餃子 ◆8X2XSCHEME
2022/09/29(木) 21:13:35.71ID:xXycU9Ev >>809
近頃は vim も LSP に対応してるはずだから clangd と合わせて使えばいいんでないの。
わいは vim についてはよう知らんけど VSCode では出来ているから原理的には出来るはず。
近頃は vim も LSP に対応してるはずだから clangd と合わせて使えばいいんでないの。
わいは vim についてはよう知らんけど VSCode では出来ているから原理的には出来るはず。
812デフォルトの名無しさん
2022/09/29(木) 21:39:32.67ID:o1fQB+Qf813デフォルトの名無しさん
2022/09/29(木) 21:44:06.62ID:YHMprl0j 似てねーw
814デフォルトの名無しさん
2022/09/29(木) 21:59:47.36ID:xIdOGMqx ええ…
815デフォルトの名無しさん
2022/10/03(月) 10:37:30.67ID:BGisZcin816デフォルトの名無しさん
2022/10/03(月) 10:40:19.01ID:BGisZcin >>790
template ですね判ります
template ですね判ります
817デフォルトの名無しさん
2022/10/05(水) 11:46:44.33ID:qhw2L+Ej サイズが可変な自作クラスXのvectorを持ちたいとします。
このとき、Xの実体をいくつかvectorに入れて不用意に各要素のサイズを変更すると、メモリの割り当てがおかしくなりますよね?
実体ではなくポインタを持つ以外のワークアラウンドはありますか。
このとき、Xの実体をいくつかvectorに入れて不用意に各要素のサイズを変更すると、メモリの割り当てがおかしくなりますよね?
実体ではなくポインタを持つ以外のワークアラウンドはありますか。
819デフォルトの名無しさん
2022/10/05(水) 12:31:37.02ID:Ghll8vG9 >>817
「サイズが可変なクラス」の簡単な具体例を教えてくれないかしらん?
「サイズが可変なクラス」の簡単な具体例を教えてくれないかしらん?
820デフォルトの名無しさん
2022/10/05(水) 12:38:22.59ID:zqJzN+DI >>817
出来ます
Xの参照(ポインタ等)のベクターを持ちます
Xのサイズが可変でバラバラでも構いません
もしXのサイズに上限値があるならば
別の方法としてその上限値サイズのベクターを用意する方法もあります
出来ます
Xの参照(ポインタ等)のベクターを持ちます
Xのサイズが可変でバラバラでも構いません
もしXのサイズに上限値があるならば
別の方法としてその上限値サイズのベクターを用意する方法もあります
821デフォルトの名無しさん
2022/10/05(水) 12:52:15.30ID:qhw2L+Ej >>819
boost::multi_array の resize
boost::multi_array の resize
822デフォルトの名無しさん
2022/10/05(水) 12:53:20.63ID:qhw2L+Ej823はちみつ餃子 ◆8X2XSCHEME
2022/10/05(水) 13:05:31.97ID:q7thXXzU sizeof の結果は常に定数なんだよね……。
https://timsong-cpp.github.io/cppwp/n3337/expr.sizeof#6
(C では VLA まわりで定数にならない場合もあってその挙動を拡張として取り入れている C++ 処理系もある。)
そういう意味ではサイズが可変なクラスは存在しない。
>>821
boost::multi_array もそれ自体の大きさは一定。
内部的にはポインタで保持してる。
https://timsong-cpp.github.io/cppwp/n3337/expr.sizeof#6
(C では VLA まわりで定数にならない場合もあってその挙動を拡張として取り入れている C++ 処理系もある。)
そういう意味ではサイズが可変なクラスは存在しない。
>>821
boost::multi_array もそれ自体の大きさは一定。
内部的にはポインタで保持してる。
824デフォルトの名無しさん
2022/10/06(木) 11:24:20.53ID:0pxze5TV やっぱり817が思ってる「おかしくなりますよね?」の最小コード提示してもらわないと
実はそれおかしくならないって結論になりそうなんだが?
実はそれおかしくならないって結論になりそうなんだが?
825デフォルトの名無しさん
2022/10/06(木) 14:37:24.06ID:BJfOFqw4 つまりおかしくなる理由が分からない人が相談に答えようとしているわけだな。
826デフォルトの名無しさん
2022/10/06(木) 15:08:29.15ID:cWE4RcCn827デフォルトの名無しさん
2022/10/06(木) 18:12:29.65ID:nyTo+ttU 「サイズ(sizeof)が可変なクラス」なんて存在しないから817が何かを勘違いしてるのは確かだが
何をどう勘違いしてるのか分からんからお前さんの信念でコード書いてみなって話だろ
別におかしくない
何をどう勘違いしてるのか分からんからお前さんの信念でコード書いてみなって話だろ
別におかしくない
828デフォルトの名無しさん
2022/10/06(木) 21:12:38.87ID:2ZLAwlmb829デフォルトの名無しさん
2022/10/07(金) 02:21:50.23ID:qb/V/k6I >827
単にお前の読解力の話でしかなかったのか。
「サイズが可変な」はvectorに掛かってると考えるだろうふつう。理由は
> 「サイズ(sizeof)が可変なクラス」なんて存在しないから
と自分で指摘してるとおり。
単にお前の読解力の話でしかなかったのか。
「サイズが可変な」はvectorに掛かってると考えるだろうふつう。理由は
> 「サイズ(sizeof)が可変なクラス」なんて存在しないから
と自分で指摘してるとおり。
830デフォルトの名無しさん
2022/10/07(金) 06:51:34.90ID:iCJcr8aJ 「サイズが可変な」はクラスに掛かってると考えるだろうふつう。vectorは当然サイズ可変なんだから
831デフォルトの名無しさん
2022/10/07(金) 07:35:25.67ID:BBv/2c76 sizeof(std::vector<T>)なんて気にせんだろふつー
832デフォルトの名無しさん
2022/10/07(金) 07:47:52.68ID:4lX0Ypwn まあクラスのサイズが変わるようなイメージだったよね
833デフォルトの名無しさん
2022/10/07(金) 08:23:09.11ID:0jEkBwds コード見せろ、この日本語が分からない奴に
このスレは無理
このスレは無理
834デフォルトの名無しさん
2022/10/07(金) 08:23:45.29ID:2UgM0KPC 質問者です
皆さんのおかげで解決しました
ありがとうございます
皆さんのおかげで解決しました
ありがとうございます
835デフォルトの名無しさん
2022/10/07(金) 08:24:03.77ID:2UgM0KPC もうこの話は終了でよろしくお願いします
836デフォルトの名無しさん
2022/10/07(金) 11:13:53.12ID:p6wqSRzL 817の類似
https://ideone.com/81vcNn
e1, e2 と list の要素は別物だけど (2) の操作で list も同じく反映するようにするには
list を vector<X*> として ポインタ渡す他に何か手段あるのかな
https://ideone.com/81vcNn
e1, e2 と list の要素は別物だけど (2) の操作で list も同じく反映するようにするには
list を vector<X*> として ポインタ渡す他に何か手段あるのかな
837デフォルトの名無しさん
2022/10/07(金) 11:34:57.30ID:fogpWmkA std::vectorもboost::multi_arrayも要素数の変更ができるけど、その可変可能個数要素を格納する領域はクラスのインスタンスとは別のヒープ領域に確保されるようになっていて、クラスのインスタンにはそのヒープ領域へのポインタが格納される
したがって要素数を変更してもクラスのインスタンのサイズは変わらない
だよね?
したがって要素数を変更してもクラスのインスタンのサイズは変わらない
だよね?
838デフォルトの名無しさん
2022/10/07(金) 11:35:56.48ID:fogpWmkA インスタンじゃなくてインスタンス…
839デフォルトの名無しさん
2022/10/07(金) 11:42:47.63ID:Y5jy7O5b >>837
なぜ上で書かれてるのと同じことを書きたくなったの?
なぜ上で書かれてるのと同じことを書きたくなったの?
840デフォルトの名無しさん
2022/10/07(金) 12:34:55.78ID:UqkGeV53841デフォルトの名無しさん
2022/10/07(金) 12:43:53.29ID:p6wqSRzL >>840
自分で質問しといてなんだけど、たいした問題点でもなかったりするんだよな…
vector<X*> list; だと要素をアクセスする際に記述が煩雑になるところ
list[i]->size(); ←おけ
list[i]->push_back(hoge); ←おけ
(*list[i])[j]; ←きもい
自分で質問しといてなんだけど、たいした問題点でもなかったりするんだよな…
vector<X*> list; だと要素をアクセスする際に記述が煩雑になるところ
list[i]->size(); ←おけ
list[i]->push_back(hoge); ←おけ
(*list[i])[j]; ←きもい
842デフォルトの名無しさん
2022/10/07(金) 12:54:10.56ID:p6wqSRzL 実体のポインタを list に詰まず new したものを詰んだ場合
お漏らしやタングリングポインタになるかもしれんってのもあるかな
これだと問題点が前提とは別のところになりそうではある
お漏らしやタングリングポインタになるかもしれんってのもあるかな
これだと問題点が前提とは別のところになりそうではある
843デフォルトの名無しさん
2022/10/07(金) 13:55:22.13ID:WQmSj+WJ >>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];
ラッパー書きゃよろしいがな
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];
844デフォルトの名無しさん
2022/10/07(金) 14:39:47.78ID:UqkGeV53845ハノン ◆QZaw55cn4c
2022/10/07(金) 19:06:21.61ID:E6DqXtFD >>827
http://www.kouno.jp/home/c_faq/c2.html#6
のことでしょ?
これはもう C89 の昔から言われ続けており、太古の C99 でも
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
のとおり導入されたわけですし
今更なんですけれどね
http://www.kouno.jp/home/c_faq/c2.html#6
のことでしょ?
これはもう C89 の昔から言われ続けており、太古の C99 でも
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
のとおり導入されたわけですし
今更なんですけれどね
846デフォルトの名無しさん
2022/10/07(金) 19:21:05.99ID:0j3FZIjL847デフォルトの名無しさん
2022/10/07(金) 19:57:27.07ID:T/Xux0J0848デフォルトの名無しさん
2022/10/07(金) 20:10:14.06ID:Znh4X5V+849デフォルトの名無しさん
2022/10/07(金) 21:32:58.03ID:WQmSj+WJ850デフォルトの名無しさん
2022/10/08(土) 01:45:23.92ID:wlHp0G63 >>841
思い出したけど boost::ptr_vector なるものもある
思い出したけど boost::ptr_vector なるものもある
851デフォルトの名無しさん
2022/10/08(土) 03:10:20.17ID:fnM9fLAu クラスメンバBの初期化が終わる前に、メンバAのコンストラクタにBのアドレスを渡すのって合法ですか?
852デフォルトの名無しさん
2022/10/08(土) 08:08:39.60ID:i+QsN2sY マルチアレーで思い出したけど、多次元配列クラスのSTL入ってどうなった?
boostとか自作クラスで対応せよってのは暴論だぜ
前者はパフォーマンス微妙だし管理されてない、後者はそれ言うなら何でもそうじゃん
boostとか自作クラスで対応せよってのは暴論だぜ
前者はパフォーマンス微妙だし管理されてない、後者はそれ言うなら何でもそうじゃん
853デフォルトの名無しさん
2022/10/08(土) 10:25:38.57ID:a+ry7eGB854デフォルトの名無しさん
2022/10/08(土) 13:47:19.43ID:wlHp0G63855デフォルトの名無しさん
2022/10/08(土) 14:59:34.51ID:0p5f7aQJ >>854
センスね~~~
センスね~~~
856デフォルトの名無しさん
2022/10/08(土) 15:04:31.64ID:wlHp0G63 >>855
ではセンスある解を!
ではセンスある解を!
857デフォルトの名無しさん
2022/10/08(土) 15:08:15.47ID:a+ry7eGB >>852
std::mdarrayのことなら揉めに揉めて伸びに伸びて今は一応C++26の予定
でもまだグチグチ揉めまくって収拾がつかなそうだからもう無理じゃないかな
代わりにstd::mdspanっていう配列に被せるガワが入りそう
std::mdarrayのことなら揉めに揉めて伸びに伸びて今は一応C++26の予定
でもまだグチグチ揉めまくって収拾がつかなそうだからもう無理じゃないかな
代わりにstd::mdspanっていう配列に被せるガワが入りそう
858デフォルトの名無しさん
2022/10/08(土) 15:56:11.12ID:Ys4Rhd8B 各次元の長さが可変で、全添字の走査が速くて、メモリの並びがFortran流かC流か選べるだけで良いのに何を揉める必要があるのか
859デフォルトの名無しさん
2022/10/08(土) 16:31:31.20ID:wlHp0G63 その程度なら自前で直ぐに作っちまいそうだが
標準に入ってることが意味あるんだろうな
標準に入ってることが意味あるんだろうな
860デフォルトの名無しさん
2022/10/08(土) 18:03:00.23ID:Ys4Rhd8B そりゃそうじゃね
「std::vectorよりも自作の配列クラスの方が優れてる」という主張が本当だったことがない
「std::vectorよりも自作の配列クラスの方が優れてる」という主張が本当だったことがない
862849
2022/10/08(土) 20:25:53.87ID:wHqQf0MD すいませんでしたw
863デフォルトの名無しさん
2022/10/08(土) 21:43:59.65ID:cYIJtZRn >>862
こちらこそ申し訳ございませんでしたw
こちらこそ申し訳ございませんでしたw
864デフォルトの名無しさん
2022/10/09(日) 00:52:23.28ID:KNQys/Sq SIMD まで自分ではやりたくないのでnumpyを呼ぶのほうが早い
865デフォルトの名無しさん
2022/10/09(日) 17:16:44.85ID:gpj8txwq >>864
じゃあ全部Pythonでよくねーか?
じゃあ全部Pythonでよくねーか?
866デフォルトの名無しさん
2022/10/09(日) 20:20:03.73ID:30oWykTj >>865
実際自分にとってはそんな感じですね。C++でpython とcudaとかopenmpを糊付けしている感覚があります
実際自分にとってはそんな感じですね。C++でpython とcudaとかopenmpを糊付けしている感覚があります
867デフォルトの名無しさん
2022/10/14(金) 14:32:13.11ID:hVSCfGeq set, mapというデータ構造があります。
mapはキーと値のペアをハッシュテーブルや2分探索木に格納しているのでしょうか?
mapはキーと値のペアをハッシュテーブルや2分探索木に格納しているのでしょうか?
868デフォルトの名無しさん
2022/10/14(金) 15:00:32.18ID:zHYXwlQW 平衡二分探索木です
ハッシュテーブル版はunordered_*です
ハッシュテーブル版はunordered_*です
869デフォルトの名無しさん
2022/10/14(金) 15:09:19.24ID:hyLjfQu2 ハッシュテーブルの方が大抵の場面で速いと思ってええんか?
870はちみつ餃子 ◆8X2XSCHEME
2022/10/14(金) 15:26:57.00ID:rgl2oNFZ871デフォルトの名無しさん
2022/10/14(金) 15:33:11.96ID:IS1pk00F872デフォルトの名無しさん
2022/10/14(金) 19:23:56.82ID:6Xf8KnhS >>871
ハッシュテーブルのサイズ、という地雷的制約は好まないのですけれどもね
ハッシュテーブルのサイズ、という地雷的制約は好まないのですけれどもね
873はちみつ餃子 ◆8X2XSCHEME
2022/10/15(土) 03:19:05.65ID:nP2nOTvD std::map::operator[] は O(long(N)) のオーダーなんだが、
std::unorderd_map::operator[] のオーダーは平均で O(1) 、最悪で O(N) ということになってんよね。
意図的に最悪を引き当てる、つまり攻撃に晒されるような状況では unorderd_map のほうが不利になる可能性もある。
std::unorderd_map::operator[] のオーダーは平均で O(1) 、最悪で O(N) ということになってんよね。
意図的に最悪を引き当てる、つまり攻撃に晒されるような状況では unorderd_map のほうが不利になる可能性もある。
874デフォルトの名無しさん
2022/10/15(土) 18:57:25.60ID:b3v/HVBd C++の例外処理は、class SomeClass {}; と中身の無いクラスであっても、
throw SomeClass{}; をcatch(SomeClass) {・・・}
で受け取ることが出来るらあしいけど、
どういう仕組みでcatchは、例外の種類を識別してる?
"SomeClass"のようなclass名の文字列のポインタでも一緒に渡している
のだろうか?
typeid(x)は、RTTI(実行時型情報)が必要で、仮想関数が定義されて無いクラス
に対しては上手く働かないのではなかったっけ?
throw SomeClass{}; をcatch(SomeClass) {・・・}
で受け取ることが出来るらあしいけど、
どういう仕組みでcatchは、例外の種類を識別してる?
"SomeClass"のようなclass名の文字列のポインタでも一緒に渡している
のだろうか?
typeid(x)は、RTTI(実行時型情報)が必要で、仮想関数が定義されて無いクラス
に対しては上手く働かないのではなかったっけ?
875デフォルトの名無しさん
2022/10/15(土) 21:57:03.29ID:QGPaA4bd まず基本を禿の本でも規格票でも読んで
C++例外処理ってそもそも何ってとこをわかってから
出直したら? そんな有様じゃマトモなレス付かないよ
C++例外処理ってそもそも何ってとこをわかってから
出直したら? そんな有様じゃマトモなレス付かないよ
876デフォルトの名無しさん
2022/10/15(土) 23:57:29.06ID:xWZqYwiR >>874 typeid と同等の情報で照合すれば可能ではあるんだから、何を不思議に思うことがあるのか。
「上手く働かないのでは」なんて言うぐらいならコード書いて確かめればいいだろうし。
「上手く働かないのでは」なんて言うぐらいならコード書いて確かめればいいだろうし。
877はちみつ餃子 ◆8X2XSCHEME
2022/10/16(日) 01:59:22.59ID:SvF0Fhwf >>874
例外を送出してスタックの巻き戻しをするのは例外を送出する側 (受け取る側ではなく) なんだよ。
つまり送出される例外オブジェクトの型はわかっている。
むしろどこまで巻き戻せばよいか (送出されるオブジェクトの型に対応する catch はどこにあるか) の情報が動的なものだ。
例外を送出してスタックの巻き戻しをするのは例外を送出する側 (受け取る側ではなく) なんだよ。
つまり送出される例外オブジェクトの型はわかっている。
むしろどこまで巻き戻せばよいか (送出されるオブジェクトの型に対応する catch はどこにあるか) の情報が動的なものだ。
878デフォルトの名無しさん
2022/10/16(日) 14:48:55.82ID:pwk0SnpM メンバ変数をまったく使っていないメンバ関数を見つける方法ってなんかある?
CppCheckとかでできるんだっけ
CppCheckとかでできるんだっけ
879デフォルトの名無しさん
2022/10/16(日) 15:16:25.24ID:r52/9r+u まあ普通の静的解析はチェックしてくれるのでは
880デフォルトの名無しさん
2022/10/16(日) 17:18:37.82ID:Y43orZLw881デフォルトの名無しさん
2022/10/16(日) 17:21:15.08ID:Y43orZLw typeid(x)の返すオブジェクトは完全にtype_info型なのか、
それとも、type_infoを継承したクラスなのか、どっち?
それとも、type_infoを継承したクラスなのか、どっち?
882はちみつ餃子 ◆8X2XSCHEME
2022/10/16(日) 22:40:17.52ID:SvF0Fhwf883デフォルトの名無しさん
2022/10/17(月) 05:46:15.36ID:SQKgR2D+ それこそtypeidに聞いてみりゃいい
cout << typeid(typeid(some_one)).name();
cout << typeid(typeid(some_one)).name();
884デフォルトの名無しさん
2022/10/17(月) 22:30:57.72ID:K/vFJtXQ T x;
T y;
に対して
x=move(y); //(1)
とした場合、時系列的に
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の中身だったものを削除する。
というような流れになるという理解で合ってる?
T y;
に対して
x=move(y); //(1)
とした場合、時系列的に
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の中身だったものを削除する。
というような流れになるという理解で合ってる?
885デフォルトの名無しさん
2022/10/17(月) 23:38:12.11ID:w3P18B12 実装依存では
886デフォルトの名無しさん
2022/10/17(月) 23:46:42.02ID:K/vFJtXQ >>885
特に確認したいのは、
>3. (1)の式の最後で、右辺のオブジェクト y に対してデストラクタが呼び出される。
の部分。
stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
らしいが、それは常に正しいのかな?
特に確認したいのは、
>3. (1)の式の最後で、右辺のオブジェクト y に対してデストラクタが呼び出される。
の部分。
stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
らしいが、それは常に正しいのかな?
887デフォルトの名無しさん
2022/10/18(火) 00:25:45.29ID:FMJmuyaZ >>886
> stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
> らしいが、それは常に正しいのかな?
そういう型を作ることはできるけど、そんな動作をしたらスコープアウトで走るデストラクタを
止めないといけなくなって非常に使いづらくなる。正しくなさそう。
あなたが何か読み間違えてるものと思われる。
> stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
> らしいが、それは常に正しいのかな?
そういう型を作ることはできるけど、そんな動作をしたらスコープアウトで走るデストラクタを
止めないといけなくなって非常に使いづらくなる。正しくなさそう。
あなたが何か読み間違えてるものと思われる。
888デフォルトの名無しさん
2022/10/18(火) 00:27:10.46ID:LFBcX+LO889デフォルトの名無しさん
2022/10/18(火) 03:36:36.81ID:UO6WFDjC xの元の中身も適切に破棄されますよっていう話を歪んだ理解してそう
890デフォルトの名無しさん
2022/10/18(火) 08:32:29.82ID:GEQmlbnE >>888
[訂正]
正しくは、
・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;}
[訂正]
正しくは、
・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;}
891デフォルトの名無しさん
2022/10/18(火) 08:42:53.23ID:FMJmuyaZ >>888 あなたの読み間違いではないと主張したいなら出典を挙げられるのがよいかと。
892はちみつ餃子 ◆8X2XSCHEME
2022/10/18(火) 12:16:32.80ID:PTXT62EI >>888
右辺と右辺値を混同しているとかじゃない? 右辺値と右辺値参照も違う概念。
右辺値 (というか prvalue) が完結式の終わりで解体されるのは保証された動作だけど、
std::move でキャストした結果はあくまでも参照を右辺値参照として返すってだけで
元のオブジェクト (この場合は y) は依然として左辺値だよ。
y のデストラクタが呼ばれるのは y のスコープの終わりであることは保証される。
右辺と右辺値を混同しているとかじゃない? 右辺値と右辺値参照も違う概念。
右辺値 (というか prvalue) が完結式の終わりで解体されるのは保証された動作だけど、
std::move でキャストした結果はあくまでも参照を右辺値参照として返すってだけで
元のオブジェクト (この場合は y) は依然として左辺値だよ。
y のデストラクタが呼ばれるのは y のスコープの終わりであることは保証される。
893デフォルトの名無しさん
2022/10/19(水) 01:49:23.30ID:ACk8fEyB >>892
>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のデストラクタが呼び出されることを前提に処理しなければならない、
ということになる。
>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のデストラクタが呼び出されることを前提に処理しなければならない、
ということになる。
894デフォルトの名無しさん
2022/10/19(水) 02:44:50.18ID:ACk8fEyB895はちみつ餃子 ◆8X2XSCHEME
2022/10/19(水) 04:13:29.85ID:CfflWiLk >>893
そう。 move assignment operator と呼ばれてはいるが
右辺値であるということがわかる以上の違いはない。
ムーブは寿命を左右せず、内容の状態がどうなるかは実装次第。
具体例で言えば std::unique_ptr はムーブ後には空になる (メンバ関数 get は空ポインタを返す) ことが保証されるが、
std::string は (新たな内容が与えられるまでは) 未規定の値になる。
右辺値参照が導入されたのは C++11 からで、
デストラクタのタイミングが変わってしまうような変更を入れられるわけがない。
そう。 move assignment operator と呼ばれてはいるが
右辺値であるということがわかる以上の違いはない。
ムーブは寿命を左右せず、内容の状態がどうなるかは実装次第。
具体例で言えば std::unique_ptr はムーブ後には空になる (メンバ関数 get は空ポインタを返す) ことが保証されるが、
std::string は (新たな内容が与えられるまでは) 未規定の値になる。
右辺値参照が導入されたのは C++11 からで、
デストラクタのタイミングが変わってしまうような変更を入れられるわけがない。
896デフォルトの名無しさん
2022/10/19(水) 23:39:12.93ID:8y/Qrf1S C++で15年ぶりにプログラミングをすることになったんだけど、
C++11以降のことは何も知らないのでまずは復習もかねて勉強することにした
今でもbjarneの本が初心者にとって一番のテキストなの?
それとももっとシンプルで分かりやすい本が出てるのでしょうか?
C++11以降のことは何も知らないのでまずは復習もかねて勉強することにした
今でもbjarneの本が初心者にとって一番のテキストなの?
それとももっとシンプルで分かりやすい本が出てるのでしょうか?
897デフォルトの名無しさん
2022/10/19(水) 23:45:19.38ID:w93eWlNE >>895
今考えてみれば、条件分岐の中だけでmove代入される場合も有るからかも知れませんね。
今考えてみれば、条件分岐の中だけでmove代入される場合も有るからかも知れませんね。
898デフォルトの名無しさん
2022/10/20(木) 03:01:20.64ID:3bh5ldea 昔のC++知ってるならとりあえずEffective Modern C++.でいいんじゃないの
899デフォルトの名無しさん
2022/10/20(木) 06:31:14.16ID:pIDfWPXL >>896
本は読者との相性があるから一概には言えないが
俺的にはやっぱ禿の本だな
変に手加減してこないところに安心感がある
ただし「プログラミング言語C++第4版」は
あくまでC++11で、C++14以後には触れていないので
構造化バインディングやコンセプトは学べない
俺はこのあたりはここやQiitaできっかけだけ拾って
あとは規格票やhttps://cpprefjp.github.io/で憶えてる
本は読者との相性があるから一概には言えないが
俺的にはやっぱ禿の本だな
変に手加減してこないところに安心感がある
ただし「プログラミング言語C++第4版」は
あくまでC++11で、C++14以後には触れていないので
構造化バインディングやコンセプトは学べない
俺はこのあたりはここやQiitaできっかけだけ拾って
あとは規格票やhttps://cpprefjp.github.io/で憶えてる
900はちみつ餃子 ◆8X2XSCHEME
2022/10/20(木) 13:52:31.60ID:w/WeLGfC901デフォルトの名無しさん
2022/10/20(木) 17:53:11.99ID:ieIEHaM0 ビャーネの本、章の構成がよく分からんのだけど何がどうしてああなったん
902デフォルトの名無しさん
2022/10/20(木) 18:26:02.35ID:zGrDbuOl 昔は、ロベールが鉄板だった
903デフォルトの名無しさん
2022/10/20(木) 18:47:34.03ID:sgmqUmRA bj氏の本のダブルディスパッチの部分と、次のVisitorの部分、
どっちもよく分からなかった。
まず、前者のShape&の引数が何のためにあって、どういう役割を果たしているか
誰か教えて。
どっちもよく分からなかった。
まず、前者のShape&の引数が何のためにあって、どういう役割を果たしているか
誰か教えて。
904デフォルトの名無しさん
2022/10/20(木) 18:49:51.30ID:sgmqUmRA >>903
プログラミング言語C++第四版 日本語版の
p.653, 22.3.1 ダブルディスパッチの辺りから。
bool intersect(const Shape&);
関数が無くてもこの例だと動作すると思うんだけど、
なんなん?
プログラミング言語C++第四版 日本語版の
p.653, 22.3.1 ダブルディスパッチの辺りから。
bool intersect(const Shape&);
関数が無くてもこの例だと動作すると思うんだけど、
なんなん?
905デフォルトの名無しさん
2022/10/20(木) 19:41:09.72ID:tMcnfqkZ ダブルディスパッチは勘違いしやすいよね
906はちみつ餃子 ◆8X2XSCHEME
2022/10/20(木) 23:26:04.47ID:w/WeLGfC 今でも「ロベールの C++ 入門講座」で学ぼうとしているらしいやつを Teratail や Qiita でたまに見るぞ。
C++03 と C++11 でほとんど互換性は維持されてはいるはずなんだがちょっとは非互換もあるし、
残されている機能でも今となってはあまりお勧めできないということもあるから
なるべくなら新しい本のほうがよいとは思うんだが、
俺自身が読んだことがある本が古すぎていまどきの良い本が全然わからん。
C++03 と C++11 でほとんど互換性は維持されてはいるはずなんだがちょっとは非互換もあるし、
残されている機能でも今となってはあまりお勧めできないということもあるから
なるべくなら新しい本のほうがよいとは思うんだが、
俺自身が読んだことがある本が古すぎていまどきの良い本が全然わからん。
907はちみつ餃子 ◆8X2XSCHEME
2022/10/20(木) 23:52:16.92ID:w/WeLGfC >>904
メンバーアクセス演算子によるメンバの選択は抽象クラスなら動的 (仮想関数テーブルを辿る) だが、
引数を元にしたオーバーロード解決は静的型 (static type) の情報が元になる。
静的型はあくまでも Shape だから一旦は Shape& で受けて
オブジェクトと引数を入れ替えてもういちど intersect を呼び出すことで両方とも動的な型でディスパッチすることになるんだよ。
普通はメンバアクセスの側だけが動的ディスパッチだから二つのオブジェクトについて動的ディスパッチをするには
こういうトリックが必要になる。 ふたつの動的ディスパッチをするからダブルディスパッチなの。
メンバーアクセス演算子によるメンバの選択は抽象クラスなら動的 (仮想関数テーブルを辿る) だが、
引数を元にしたオーバーロード解決は静的型 (static type) の情報が元になる。
静的型はあくまでも Shape だから一旦は Shape& で受けて
オブジェクトと引数を入れ替えてもういちど intersect を呼び出すことで両方とも動的な型でディスパッチすることになるんだよ。
普通はメンバアクセスの側だけが動的ディスパッチだから二つのオブジェクトについて動的ディスパッチをするには
こういうトリックが必要になる。 ふたつの動的ディスパッチをするからダブルディスパッチなの。
908デフォルトの名無しさん
2022/10/21(金) 03:42:31.85ID:sdgXBR6P909デフォルトの名無しさん
2022/10/21(金) 19:14:57.19ID:RdD+Edtl >>980
これは分かりにくかったかも知れません。
void func(Shape &a, Shape &b)
{
x.intersect(y); //(1)
}
Circle c{xxx};
Box b{xxx};
func(c, b);
のような場合に、(1)において、x の部分は仮想関数によってC++のもともとの機能で
実行時の型によって動的に振り分けできるが、y については、仮想関数では
そのような意味では振り分けできないから特殊な方法が必要になる、ということですね。
これは分かりにくかったかも知れません。
void func(Shape &a, Shape &b)
{
x.intersect(y); //(1)
}
Circle c{xxx};
Box b{xxx};
func(c, b);
のような場合に、(1)において、x の部分は仮想関数によってC++のもともとの機能で
実行時の型によって動的に振り分けできるが、y については、仮想関数では
そのような意味では振り分けできないから特殊な方法が必要になる、ということですね。
910デフォルトの名無しさん
2022/10/22(土) 00:28:36.65ID:76y4d7LL911デフォルトの名無しさん
2022/10/22(土) 21:57:41.88ID:Q+2x5vm1 モジュールはヘッダファイル・ソースファイルに代わるものと聞きました
これからは今までインクルードしていたものは全てモジュールにすればよいのでしょうか
また、グローバル変数のみのヘッダファイルや、定数のみのヘッダファイルも
モジュールにした方がよいのでしょうか
ビルド時間が速くなるそうなので気になっています
これからは今までインクルードしていたものは全てモジュールにすればよいのでしょうか
また、グローバル変数のみのヘッダファイルや、定数のみのヘッダファイルも
モジュールにした方がよいのでしょうか
ビルド時間が速くなるそうなので気になっています
912デフォルトの名無しさん
2022/10/22(土) 22:33:36.63ID:TUU3opDF >>909
ideone に動くソースを貼ってください、全然意味がわかりません
ideone に動くソースを貼ってください、全然意味がわかりません
913はちみつ餃子 ◆8X2XSCHEME
2022/10/22(土) 22:47:49.35ID:+VggblGg >>911
時期尚早だと思う。
現状の gcc ではオプションに -std=c++20 を付けるだけではモジュールは有効にならず、
明示的に -fmodules-ts を付ける必要があるようにしてあるので、普段使いするにはまだ早いという意図を感じる。
ドキュメントにはまだ完璧じゃないと書いてあるし。
(他のコンパイラの状況は知らんけど。)
それに C++20 の段階ではモジュールの基礎の基礎が決まっただけで
標準ライブラリすらモジュールとして再編できていない。 一応は C++23 でやることになってるけど
現在の C++ の規格は三年ごとに話がまとまった分を入れる、
つまり出来てない分を完成させるために期限を延長したりはせず三年後に先送りするという運用なので
C++23 がどこまで出来るものなのか全然わからん。
標準ライブラリを再編していく内にモジュール機能の問題点が発見されたりするかもしれん。
個人的に遊ぶ分には色々とやってみてわかったことはどんどん発信してほしいけど、
製品レベルのプロジェクトではやめておいたほうがいい。
時期尚早だと思う。
現状の gcc ではオプションに -std=c++20 を付けるだけではモジュールは有効にならず、
明示的に -fmodules-ts を付ける必要があるようにしてあるので、普段使いするにはまだ早いという意図を感じる。
ドキュメントにはまだ完璧じゃないと書いてあるし。
(他のコンパイラの状況は知らんけど。)
それに C++20 の段階ではモジュールの基礎の基礎が決まっただけで
標準ライブラリすらモジュールとして再編できていない。 一応は C++23 でやることになってるけど
現在の C++ の規格は三年ごとに話がまとまった分を入れる、
つまり出来てない分を完成させるために期限を延長したりはせず三年後に先送りするという運用なので
C++23 がどこまで出来るものなのか全然わからん。
標準ライブラリを再編していく内にモジュール機能の問題点が発見されたりするかもしれん。
個人的に遊ぶ分には色々とやってみてわかったことはどんどん発信してほしいけど、
製品レベルのプロジェクトではやめておいたほうがいい。
914デフォルトの名無しさん
2022/10/23(日) 00:24:14.37ID:Ti8rkbHi915デフォルトの名無しさん
2022/10/23(日) 06:09:10.65ID:lOKqFCBz MSは怪しい機能は/std:c++latestにしてるよな
916デフォルトの名無しさん
2022/10/23(日) 08:32:09.89ID:lOKqFCBz C++17のfilesystemもそうだったけど
練りきれてない未完成品を無理に入れるのやめて欲しい
バグ出ししたいんなら拡張規格かoptionalとして出してみて
標準のmandatoryにするのはしっかり固まってからにしろやって
つーかSTLもboost由来のもISO以外のところでそこそこユーザに揉まれてから来たものだろ
開拓は標準規格の役目じゃねえよ
練りきれてない未完成品を無理に入れるのやめて欲しい
バグ出ししたいんなら拡張規格かoptionalとして出してみて
標準のmandatoryにするのはしっかり固まってからにしろやって
つーかSTLもboost由来のもISO以外のところでそこそこユーザに揉まれてから来たものだろ
開拓は標準規格の役目じゃねえよ
917はちみつ餃子 ◆8X2XSCHEME
2022/10/23(日) 10:56:19.39ID:V+VjUFIF 完璧になるまで練ってたらいつまでも進まんから三年ごとに出来た分を規格に入れるという方針に変更されたんじゃないか。
不格好でも不完全でも今使えることが大事だというのは元々の理念だし。
未完成はともかく欠陥報告を乱発するのは良くはないけどさ。
不格好でも不完全でも今使えることが大事だというのは元々の理念だし。
未完成はともかく欠陥報告を乱発するのは良くはないけどさ。
918デフォルトの名無しさん
2022/10/23(日) 11:55:48.92ID:d3fh3q91 使ってる所だけ直せばいいライブラリと違って(だからって良いわけじゃないけど)
モジュール作り込んでからやっぱdefectでしたって言われたら困るからなあ
モジュール作り込んでからやっぱdefectでしたって言われたら困るからなあ
919デフォルトの名無しさん
2022/10/23(日) 12:11:50.11ID:ncgNttCh ライブラリとモジュールの違いって何ですか?
920デフォルトの名無しさん
2022/10/23(日) 12:51:46.87ID:d3fh3q91 使うだけの標準ライブラリと、モジュール自作する時の仕様のつもりだった
921デフォルトの名無しさん
2022/10/23(日) 13:12:57.82ID:HPAI20x7 filesystemって未完成なん?
922デフォルトの名無しさん
2022/10/23(日) 13:25:59.97ID:lOKqFCBz C++17の時点ではfile_clockがなかった
923デフォルトの名無しさん
2022/10/23(日) 14:32:45.34ID:ecBGWNL0 file_time_type があったと思うが
924デフォルトの名無しさん
2022/10/23(日) 14:45:23.56ID:lOKqFCBz あったけど使いものにならんかった
925デフォルトの名無しさん
2022/10/23(日) 14:59:53.65ID:NDMzlX+C その昔、iostreamというのがあってだな
皆阿鼻叫喚の断末魔の雄叫びを上げたもんじゃった
皆阿鼻叫喚の断末魔の雄叫びを上げたもんじゃった
926デフォルトの名無しさん
2022/10/23(日) 16:01:34.86ID:lOKqFCBz printfやscanfに毒舌三昧してる人に対して持っていた、お暇な方ですねという思いが蘇る
927はちみつ餃子 ◆8X2XSCHEME
2022/10/23(日) 17:49:58.24ID:V+VjUFIF ファイルシステムやらスレッドやらはシステム (OS) 側の都合があるからなぁ。
細かいことは環境依存の機能を使えという前提で
標準ライブラリを最小限にとどめるのは C の時代からの基本的な姿勢だっただろう。
環境依存だからこそ標準で吸収しておいてくれという気持ちもあるし、
現状が良いとも思わんけど…… なんというか……
C++ ってそういうもんだろと思って納得してるから不満には感じないな。
細かいことは環境依存の機能を使えという前提で
標準ライブラリを最小限にとどめるのは C の時代からの基本的な姿勢だっただろう。
環境依存だからこそ標準で吸収しておいてくれという気持ちもあるし、
現状が良いとも思わんけど…… なんというか……
C++ ってそういうもんだろと思って納得してるから不満には感じないな。
928デフォルトの名無しさん
2022/10/23(日) 20:20:25.05ID:7je1ARgT iosteamはいかにもC++初心者がやりそうな「オペレータをオーバーロードできるから
見た目イカすちょっとシャレた表記法にしようぜ!!」っていう厨二スピリット全開だったからな
でてきた時点で「あ、これはクソなやつだ」ってわかったよ
見た目イカすちょっとシャレた表記法にしようぜ!!」っていう厨二スピリット全開だったからな
でてきた時点で「あ、これはクソなやつだ」ってわかったよ
929デフォルトの名無しさん
2022/10/23(日) 20:43:19.02ID:lOKqFCBz C with classesを始めようとして
たとえばと始めたことをずいぶん後になって
鬼の首を取ったようにキリッ
たとえばと始めたことをずいぶん後になって
鬼の首を取ったようにキリッ
930デフォルトの名無しさん
2022/10/23(日) 22:04:42.81ID:d3fh3q91 演算子チェーン自体は別に悪いもんじゃない
iostreamがクソなのはそこじゃない
iostreamがクソなのはそこじゃない
931デフォルトの名無しさん
2022/10/23(日) 22:42:38.11ID:9PrlG1Sf でも競プロで何も考えずにcin >> N >> M;とかできるでしょ
932デフォルトの名無しさん
2022/10/23(日) 23:18:01.98ID:a4G1Se92 なにかとiostream叩かれやすいけど
よく聞いてみると大した批判ではないよね常に
聞くに値するiostream批判ってお目にかからないね
よく聞いてみると大した批判ではないよね常に
聞くに値するiostream批判ってお目にかからないね
933デフォルトの名無しさん
2022/10/23(日) 23:21:04.29ID:HPAI20x7 iostreamが本当にクソならイカした再実装はあるだろう?
まさかcstdioとか言わんでくれよ
まさかcstdioとか言わんでくれよ
934デフォルトの名無しさん
2022/10/23(日) 23:23:02.52ID:d3fh3q91 まあstd::cout << foo << bar;がつい最近まで規格上未定義動作だったのは擁護のしようがないけどな
935はちみつ餃子 ◆8X2XSCHEME
2022/10/23(日) 23:33:00.12ID:V+VjUFIF iostream が設計された当時は I/O のための専用の言語機能が
必要という論調があって、 Bjarne Stroustrup 氏はそれに抵抗して
当時の C++ の範疇でライブラリを作ったという経緯がある。
ここで抵抗しなければ入出力用の文法が (ライブラリとしてではなく)
言語機能として導入することになっていたかもしれないと思うと
iostream にある粗くらいは許せてしまうなぁ。
少なくとも printf みたいな型チェックがガバガバなのは C++ 的に
放置できなかったし、バッファリングと書式化をまとめつつ拡張やカスタマイズが可能で
I/O 以外も含めてストリームというインターフェイスを一般化するというのは
当時としてはこれ以上考えられない素晴らしいデザインだと思う。
ひとつこれは (iostream 設計当時でも) どうにかできただろうと思うのは
書式の変更 (マニピュレータを使うなど) をしたら陽に戻すまではそのままというのが良くなかった。
スコープを抜けたらリセットできるような方法が標準で欲しかった。
(boost にあったような気がするが名前を忘れてしまった……。)
必要という論調があって、 Bjarne Stroustrup 氏はそれに抵抗して
当時の C++ の範疇でライブラリを作ったという経緯がある。
ここで抵抗しなければ入出力用の文法が (ライブラリとしてではなく)
言語機能として導入することになっていたかもしれないと思うと
iostream にある粗くらいは許せてしまうなぁ。
少なくとも printf みたいな型チェックがガバガバなのは C++ 的に
放置できなかったし、バッファリングと書式化をまとめつつ拡張やカスタマイズが可能で
I/O 以外も含めてストリームというインターフェイスを一般化するというのは
当時としてはこれ以上考えられない素晴らしいデザインだと思う。
ひとつこれは (iostream 設計当時でも) どうにかできただろうと思うのは
書式の変更 (マニピュレータを使うなど) をしたら陽に戻すまではそのままというのが良くなかった。
スコープを抜けたらリセットできるような方法が標準で欲しかった。
(boost にあったような気がするが名前を忘れてしまった……。)
936デフォルトの名無しさん
2022/10/23(日) 23:47:22.83ID:d3fh3q91 ステートはクソで出来るだけ無くすべきっていう現代の常識が当時はなかったからな
書式をストリームのステートにしてしまったのは今思えば大失敗だがあの時代は自然な設計だったんだろうな
書式をストリームのステートにしてしまったのは今思えば大失敗だがあの時代は自然な設計だったんだろうな
937デフォルトの名無しさん
2022/10/23(日) 23:48:05.17ID:yEdZxD03 >>934 foo, bar がどのように定義されていたらその式が未定義動作になるの?
938デフォルトの名無しさん
2022/10/23(日) 23:48:47.26ID:a4G1Se92 批判する者にその資格が無いってパティーン多々あるよな
iostream批判するやつだって
じゃあどんな素晴らしい入出力ライブラリを用意したの?
実装したの?どこの誰がどれだけ使ってるの?っていう
タダ飯喰らいがかーちゃんのご飯批判してるようなこと
iostream批判するやつだって
じゃあどんな素晴らしい入出力ライブラリを用意したの?
実装したの?どこの誰がどれだけ使ってるの?っていう
タダ飯喰らいがかーちゃんのご飯批判してるようなこと
939デフォルトの名無しさん
2022/10/23(日) 23:55:56.29ID:RbY+y3zv 未定義じゃなくて、引数の評価順が未規定だったって話では?
940デフォルトの名無しさん
2022/10/23(日) 23:56:39.14ID:d3fh3q91 >>937
何だろうと未定義(C++17以前)。なぜなら一つの式の中でstd::coutを2回変更してるから
(a+=1)+=1とか++(++a)とかも同じ
この大欠陥が見つかったせいで、式の中の評価順は基本コンパイラの好き勝手にしていいというCからの伝統を一部諦める羽目になった
何だろうと未定義(C++17以前)。なぜなら一つの式の中でstd::coutを2回変更してるから
(a+=1)+=1とか++(++a)とかも同じ
この大欠陥が見つかったせいで、式の中の評価順は基本コンパイラの好き勝手にしていいというCからの伝統を一部諦める羽目になった
941デフォルトの名無しさん
2022/10/24(月) 00:00:00.66ID:9tRgjj9T >>940
foo, bar の評価順が未規定だった件を未定義動作と勘違いしてるのか。
https://cpprefjp.github.io/lang/cpp17/expression_evaluation_order.html
cout に対する操作は関数呼び出しの内外の順序付けが入るから未定義動作にはならないよ。
foo, bar の評価順が未規定だった件を未定義動作と勘違いしてるのか。
https://cpprefjp.github.io/lang/cpp17/expression_evaluation_order.html
cout に対する操作は関数呼び出しの内外の順序付けが入るから未定義動作にはならないよ。
942デフォルトの名無しさん
2022/10/24(月) 00:02:05.10ID:9tRgjj9T >>940 (a+=1)+=1 も ++(++a) も未定義動作にはならないよ。必ず a が 2 増えて、 a への参照が得られる。
943デフォルトの名無しさん
2022/10/24(月) 00:24:37.42ID:hB4gzcTK >>940
<<は左から評価じゃね?
<<は左から評価じゃね?
944デフォルトの名無しさん
2022/10/24(月) 00:26:04.46ID:hB4gzcTK もっというと同じ2項演算子が複数でてきたら左から評価では?
数学と同じ
数学と同じ
945デフォルトの名無しさん
2022/10/24(月) 00:43:11.90ID:g4dlefHT cout<<a<<b;
の場合、左結合なので、評価順序は、
(cout<<a)<<b;
となるが、aとbの中に関数や演算子が書いてあるような場合、
それがいつ評価されるのは実装依存だったような気がする。つまり、
operator<<(operator<<(cout,a),b);
みたいに評価はされることは決まっているが、aとbの評価が、aが先かbが先かは
決まってない、というような話。もっと言えば、cout自体の部分が式や関数になって
いる場合も、cout,a,bの評価順序が決まって無いかも。
の場合、左結合なので、評価順序は、
(cout<<a)<<b;
となるが、aとbの中に関数や演算子が書いてあるような場合、
それがいつ評価されるのは実装依存だったような気がする。つまり、
operator<<(operator<<(cout,a),b);
みたいに評価はされることは決まっているが、aとbの評価が、aが先かbが先かは
決まってない、というような話。もっと言えば、cout自体の部分が式や関数になって
いる場合も、cout,a,bの評価順序が決まって無いかも。
946デフォルトの名無しさん
2022/10/24(月) 00:45:03.87ID:g4dlefHT947デフォルトの名無しさん
2022/10/24(月) 00:54:22.51ID:etIo9wEk 未規定の動作(unspecified behavior)と未定義動作(undefined behavior)は違うよ
948デフォルトの名無しさん
2022/10/24(月) 01:00:58.84ID:hB4gzcTK949デフォルトの名無しさん
2022/10/24(月) 01:15:48.16ID:g4dlefHT >>948
実は、x86などでは、スタックが、メモリーアドレスの大きい方からから小さい方
に成長するようになっているので、引数は右側から左側に評価した方が効率が良い。
そのため、逆さまに評価する処理系があっても不思議ではない。
実は、x86などでは、スタックが、メモリーアドレスの大きい方からから小さい方
に成長するようになっているので、引数は右側から左側に評価した方が効率が良い。
そのため、逆さまに評価する処理系があっても不思議ではない。
950デフォルトの名無しさん
2022/10/24(月) 01:33:32.70ID:1OFaOw+N ちょっと前までの規格では単一式(≒セミコロンとセミコロンの間)の中の評価順は基本的にコンパイラが好き勝手に弄る事が許されてた
例えば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|のチェーンの検討をしてるときに発覚してみんな真っ青になって慌てて評価順のルールが見直されたっていう、まあアホ臭い話でした
幸い病的な最適化コンパイラが生まれる前だったから規格文言だけの話で実害はない
例えば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|のチェーンの検討をしてるときに発覚してみんな真っ青になって慌てて評価順のルールが見直されたっていう、まあアホ臭い話でした
幸い病的な最適化コンパイラが生まれる前だったから規格文言だけの話で実害はない
951デフォルトの名無しさん
2022/10/24(月) 01:59:23.78ID:hB4gzcTK aが1のとき(a+=2)*=3が5に成り得たと書いているがほんまかいな?
952デフォルトの名無しさん
2022/10/24(月) 02:10:09.65ID:JEuztk1D 9か5かってのは説明上の話で、実際は未定義で鼻から悪魔だから9でも5でも0でも-1でも42でも4394967295でもどんな可能性もあった
今の規格では必ず9になった
今の規格では必ず9になった
953デフォルトの名無しさん
2022/10/24(月) 02:11:12.04ID:b0depGja https://ja.cppreference.com/w/cpp/language/eval_order
スカラーオブジェクトに対する変更にしかUB関係なくね?
スカラーオブジェクトに対する変更にしかUB関係なくね?
954デフォルトの名無しさん
2022/10/24(月) 02:19:24.78ID:od8Ytdiw operator<<が触ってるcoutのメンバ変数やグローバル変数にスカラーオブジェクトが一切含まれてなければ関係ないけど普通はそんなはずは無い
955デフォルトの名無しさん
2022/10/24(月) 07:45:35.99ID:bUVy0t4Y テキストがバラけたり変数の並び順を変えられなくてi18n対応が困難になるのがiostreamの一番の問題かな
956デフォルトの名無しさん
2022/10/24(月) 08:12:37.76ID:OQANp5iI957デフォルトの名無しさん
2022/10/24(月) 09:31:36.65ID:9tRgjj9T >>950
> それが「単一式で同じオブジェクトを2回変更したら未定義」というもの
C++11 より前のシーケンスポイント(副作用完了点よるルールの話だとしても関数呼び出しの前後には
シーケンスポイントが入るので cout の operator<< で未定義動作が起こるような話にはならない。
> それが「単一式で同じオブジェクトを2回変更したら未定義」というもの
C++11 より前のシーケンスポイント(副作用完了点よるルールの話だとしても関数呼び出しの前後には
シーケンスポイントが入るので cout の operator<< で未定義動作が起こるような話にはならない。
958デフォルトの名無しさん
2022/10/24(月) 09:49:55.97ID:9tRgjj9T >>950
「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.
「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.
959デフォルトの名無しさん
2022/10/24(月) 23:16:53.41ID:Fd/xLFmz どなたか、clangコンパイラのソースコードで、main()関数がどのソースファイル
にあるか分かりませんか?
にあるか分かりませんか?
960デフォルトの名無しさん
2022/10/24(月) 23:38:51.20ID:uNnUskRf grepで始めよう
新しい検索を
新しい検索を
961デフォルトの名無しさん
2022/10/24(月) 23:50:22.01ID:Fd/xLFmz >>960
もちろんgrepはしていますが、
test用のソースコードなどに大量に出てきてしまうのでどれか分からないのです。
探しているのですが、むしろ、clangコンパイラ自体のmain関数は存在して
無いのではないかと思えてしまいます。
もちろんgrepはしていますが、
test用のソースコードなどに大量に出てきてしまうのでどれか分からないのです。
探しているのですが、むしろ、clangコンパイラ自体のmain関数は存在して
無いのではないかと思えてしまいます。
962デフォルトの名無しさん
2022/10/25(火) 00:20:05.85ID:ALWiFOZj963デフォルトの名無しさん
2022/10/25(火) 00:20:30.61ID:ALWiFOZj まちがえたdriver.cppね
964デフォルトの名無しさん
2022/10/25(火) 15:32:20.93ID:VfaC5Wzc このコードで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));
}
ユニバーサル参照の受け取りのとこで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));
}
965デフォルトの名無しさん
2022/10/25(火) 15:33:30.00ID:Ct0eul8Q 超初心者+わかりにくい文章で、ごめんなさい。
今までは、.NetFramewor4.72でWinFormを使って実装していました。
今、.Net6.0 の WinFormで実装する必要が出てきたので
.Net6.0 で実装しています。
.NetFramewor4.72 でWindowsBaseの参照の追加で使えていた
System.Windows.Threading.Dispatcher が
.Net6.0 では、「依存関係」の「COM」で設定しようとしても、
WindowsBaseが表示されず、WindowsBaseを設定できなくて
System.Windows.Threading.Dispatcherが使えなくて、困っています。
同じような課題を諸先輩方は
どのように解決されましたか?
今までは、.NetFramewor4.72でWinFormを使って実装していました。
今、.Net6.0 の WinFormで実装する必要が出てきたので
.Net6.0 で実装しています。
.NetFramewor4.72 でWindowsBaseの参照の追加で使えていた
System.Windows.Threading.Dispatcher が
.Net6.0 では、「依存関係」の「COM」で設定しようとしても、
WindowsBaseが表示されず、WindowsBaseを設定できなくて
System.Windows.Threading.Dispatcherが使えなくて、困っています。
同じような課題を諸先輩方は
どのように解決されましたか?
966デフォルトの名無しさん
2022/10/25(火) 15:37:45.19ID:VfaC5Wzc967デフォルトの名無しさん
2022/10/25(火) 15:39:23.68ID:Yrt8fN18 CLIはこっちか?
968はちみつ餃子 ◆8X2XSCHEME
2022/10/25(火) 15:54:18.45ID:kIG3TWOj >>964
参照を剥がすのを入れるのが常道じゃないかな?
template<class T>
requires std::integral<std::remove_reference_t<T>>
void func(T&&);
参照を剥がすのを入れるのが常道じゃないかな?
template<class T>
requires std::integral<std::remove_reference_t<T>>
void func(T&&);
969デフォルトの名無しさん
2022/10/25(火) 16:15:10.24ID:2SxwmPby970デフォルトの名無しさん
2022/10/25(火) 18:06:59.76ID:NHQVrZyF そういうとき脳死でstd::decay使っちゃうけどあんま行儀良くないかな
971デフォルトの名無しさん
2022/10/25(火) 18:13:31.96ID:UwkZi3XT >>962
ありがとう。関数名が main() ではなく、
clang_main()
なんですね。
cmakeすると、これがすぐ呼び出されるような main() 関数が
作られるようです。
cmakeがどういう仕組みでそうやっているのかは分かりませんが。
ありがとう。関数名が main() ではなく、
clang_main()
なんですね。
cmakeすると、これがすぐ呼び出されるような main() 関数が
作られるようです。
cmakeがどういう仕組みでそうやっているのかは分かりませんが。
972デフォルトの名無しさん
2022/10/25(火) 18:15:07.22ID:UwkZi3XT973デフォルトの名無しさん
2022/10/25(火) 20:38:52.33ID:m6AygvvN どっちかってーと リンカで実行時のエントリポイントを細工してるんじゃないのかな?
974デフォルトの名無しさん
2022/10/26(水) 01:01:19.91ID:lrkwz/4D 追加質問です。
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);
}
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);
}
976デフォルトの名無しさん
2022/10/26(水) 01:09:20.17ID:AzbtQsoy977デフォルトの名無しさん
2022/10/26(水) 01:53:26.73ID:U/bwzoe1 >>975
以下の様に、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));
・・・
}
以下の様に、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));
・・・
}
978デフォルトの名無しさん
2022/10/26(水) 01:56:10.10ID:U/bwzoe1 >>976
>ごめん、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); }
のような一行の関数が出来ます。
>ごめん、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); }
のような一行の関数が出来ます。
979デフォルトの名無しさん
2022/10/26(水) 02:33:27.35ID:U/bwzoe1 >>978
(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 が
生成したものと思われます。
(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 が
生成したものと思われます。
980デフォルトの名無しさん
2022/10/26(水) 09:07:24.21ID:AzbtQsoy981デフォルトの名無しさん
2022/10/26(水) 09:39:06.48ID:8n8wOLOb >>968
やはりrequiresを1行足すしかないか...
template<allow_ref<std::integral> T>
void func(T&&);
とでも書きたかったけど、コンセプトを受け取るテンプレートが書けないっぽいから諦めた
やはりrequiresを1行足すしかないか...
template<allow_ref<std::integral> T>
void func(T&&);
とでも書きたかったけど、コンセプトを受け取るテンプレートが書けないっぽいから諦めた
982デフォルトの名無しさん
2022/10/27(木) 02:01:40.47ID:XIiqnbUh clangのソースで、CPUのマシン語を生成している場所を調べていて、
X86AsmPrinter クラスや X86MCInstLower クラスがそれに強く関与していることが分かって
きました。
X86AsmPrinter クラスや X86MCInstLower クラスは、お互いに参照されてますが、
この2つのクラスは、いずれも「作られている場所」が見つかりません。
「作られている」とは、new X86AsmPrinter や、X86AsmPrinter a;、
new X86MCInstLower や X86MCInstLower b; のようにしている場所です。
どなたか分かりませんか?
X86AsmPrinter クラスや X86MCInstLower クラスがそれに強く関与していることが分かって
きました。
X86AsmPrinter クラスや X86MCInstLower クラスは、お互いに参照されてますが、
この2つのクラスは、いずれも「作られている場所」が見つかりません。
「作られている」とは、new X86AsmPrinter や、X86AsmPrinter a;、
new X86MCInstLower や X86MCInstLower b; のようにしている場所です。
どなたか分かりませんか?
983デフォルトの名無しさん
2022/10/27(木) 02:32:01.95ID:XIiqnbUh >>982
すみません、多分、以下の部分ですね。
これで、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;
}
・・・
};
すみません、多分、以下の部分ですね。
これで、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;
}
・・・
};
984デフォルトの名無しさん
2022/10/27(木) 02:43:40.35ID:InDGsMhW なんかコンセプト以前にテンプレートにもあまり慣れてなさそう
985デフォルトの名無しさん
2022/10/27(木) 02:44:18.56ID:XIiqnbUh 間違えました。
xxx.AsmPrinterCtorFn に登録しているのは、new X86AsmPrinterの
アドレスではなく、
RegisterAsmPrinter<X86AsmPrinter>::Allocator(・・・)
のアドレスのようですね。
そして、このAllocator (==関数)を呼び出すと、new X86AsmPrinter
を行なえるようです。
xxx.AsmPrinterCtorFn に登録しているのは、new X86AsmPrinterの
アドレスではなく、
RegisterAsmPrinter<X86AsmPrinter>::Allocator(・・・)
のアドレスのようですね。
そして、このAllocator (==関数)を呼び出すと、new X86AsmPrinter
を行なえるようです。
986デフォルトの名無しさん
2022/10/27(木) 08:37:49.38ID:yP/aIJbf 関係ないけどあんまりnewせんほうがええよ
それしかないと思ってるならちょっと古い感じ
それしかないと思ってるならちょっと古い感じ
987デフォルトの名無しさん
2022/10/27(木) 22:03:08.74ID:+UGgATct あんまりデータメンバに直アクセスしないほうがええよ
あんまりグローバル変数使わんほうがええよ
あんまりSendMessageを直に使わんほうがええよ
あんまりナマポ使わんほうがええよ
あんまりアセンブラ使わんほうがええよ
あんまりC++使わんほうがええよ
ラップしろってことだろうけど
一切離れたやつはもうC++使いじゃない
あんまりグローバル変数使わんほうがええよ
あんまりSendMessageを直に使わんほうがええよ
あんまりナマポ使わんほうがええよ
あんまりアセンブラ使わんほうがええよ
あんまりC++使わんほうがええよ
ラップしろってことだろうけど
一切離れたやつはもうC++使いじゃない
988デフォルトの名無しさん
2022/10/28(金) 00:40:37.68ID:sQHy7sst989デフォルトの名無しさん
2022/10/28(金) 08:56:31.64ID:+oOKe7Yr 可変長テンプレートはじみて使ったけど便利だなこれ
990デフォルトの名無しさん
2022/10/28(金) 09:06:12.57ID:kPJo8naK threadがあんなに使いやすくなっているのは
ひとえにtemplate-parameter-packのおかげ
ひとえにtemplate-parameter-packのおかげ
991デフォルトの名無しさん
2022/10/29(土) 23:34:49.08ID:Ank2ZEY0 >>950の話は終わりかな?
レスついたけど反論がないようだけど
レスついたけど反論がないようだけど
992デフォルトの名無しさん
2022/10/30(日) 03:51:06.75ID:i1fpLCEI 5ch始めたばかりなのかな?
993デフォルトの名無しさん
2022/10/30(日) 11:42:15.05ID:/mJPvv5N 気になるじゃん
994デフォルトの名無しさん
2022/10/30(日) 15:52:08.41ID:zpZIwFpu 仕事ハネた後のヨレヨレ状態で見てるから
長文()を読もうとすると寝落ちしかねない
長文()を読もうとすると寝落ちしかねない
995デフォルトの名無しさん
2022/10/31(月) 13:27:29.89ID:Q1JWQuIa VC++ や GCC で <cstddef> をインクルードすると、
std の明⽰的修飾、using 宣言、using 指令がなくても
size_t が使えるのですが、これは C++ 標準の仕様ですか?
std の明⽰的修飾、using 宣言、using 指令がなくても
size_t が使えるのですが、これは C++ 標準の仕様ですか?
996はちみつ餃子 ◆8X2XSCHEME
2022/10/31(月) 13:53:23.25ID:HpV/6ZOj >>995
いいえ。 未規定です。
std 名前空間内で定義されることは当然に保証された動作ですが、
グローバルには定義されてもされなくてもかまいません。
逆に言えばグローバルに定義されていることはありうると想定する必要があります。
(なので自分が定義する名前がそれに衝突しないようにするべきです。)
いいえ。 未規定です。
std 名前空間内で定義されることは当然に保証された動作ですが、
グローバルには定義されてもされなくてもかまいません。
逆に言えばグローバルに定義されていることはありうると想定する必要があります。
(なので自分が定義する名前がそれに衝突しないようにするべきです。)
997デフォルトの名無しさん
2022/10/31(月) 13:55:26.92ID:cQbFxG4K size_tを知らんでもsizeofは使える?
998はちみつ餃子 ◆8X2XSCHEME
2022/10/31(月) 14:17:38.34ID:HpV/6ZOj999デフォルトの名無しさん
2022/10/31(月) 14:31:14.54ID:J5sgTSch C++相談室 part162
https://mevius.5ch.net/test/read.cgi/tech/1667194175/
https://mevius.5ch.net/test/read.cgi/tech/1667194175/
1000デフォルトの名無しさん
2022/10/31(月) 14:31:53.89ID:J5sgTSch 立てました
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 162日 17時間 8分 25秒
新しいスレッドを立ててください。
life time: 162日 17時間 8分 25秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 高市総理の周辺「小さな火種が火事になりかけている。早く鎮火しないといけない」 ★5 [Hitzeschleier★]
- 日本の立場説明へ…外務省局長が北京到着 “台湾有事”首相答弁に中国反発 [煮卵★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る [蚤の市★]
- 高市総理の周辺「小さな火種が火事になりかけている。早く鎮火しないといけない」 ★6 [Hitzeschleier★]
- 【外交】日中関係悪化、長期化の様相 2012年には自動車輸出80%減も ロイター★2 [1ゲットロボ★]
- 早大名誉教授が高市早苗首相の発言に言及「台湾も迷惑だと言っている」… [BFU★]
- 【んな専🏡】姫森ルーナ(・o・🍬)総合スレッド🏰【ホロライブ▶】★2
- 安倍晋三「台湾省は中国様のものでゲス~🤓」 1年後安倍晋三「台湾で中国と米国の武力衝突が起きた場合、米側で参戦する [455031798]
- 【悲報】有名ウヨ論客、「現実的に考えて中国と仲直りするしかなくね?」と言ったら野良ウヨから総叩きにあう [856698234]
- 【高市悲報】経団連会長、高市と面談「おい!ちゃんと中国と対話しろよ!😨」 [359965264]
- 【実況】博衣こよりのえちえち雀魂1位耐久🧪★4
- TV「港区美女スペシャル」👉すべからくカリカリが出てきて界隈に衝撃が走る [329329848]
