X



C++相談室 part161
レス数が1000を超えています。これ以上書き込みはできません。
0005デフォルトの名無しさん
垢版 |
2022/05/22(日) 03:20:20.13ID:sZoQvYay
ODRってC++処理系の仕様?
処理系はODRの記述を含まない仕様だけあればその通り作ったら
合理的な手間で検知可能な範囲のODR違反コードをエラーにする
ふるまいになるというのが当然で、つまりODRは仕様の結果であってODRを仕様に含めるのは論理的に冗長という印象

どっちかというとODRは正しく動くためにプログラマーが従わねばならないルール、という認識やったわ、
この観点ではinlineがODRの例外というのは例外も糞もなくてそんなプログラムは書いたらあかんからODR違反
コンパイラが合理的な手間でそれを検出できなかったり、それがあってもコードの動きに破綻が無いこととは関係無い
的な、
0007はちみつ餃子 ◆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 と書いてある部分については (可能であれば処理系も検出するけど) どちらかというとユーザに対する要求というニュアンスはあるかも。
0008デフォルトの名無しさん
垢版 |
2022/05/22(日) 19:47:14.24ID:WUnKKX5R
有料無料関係なしで最高のIDEってなに?
0009ハノン ◆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インライン関数の本体内の文字列リテラルは、異なる翻訳単位で同じオブジェクトを指す。
0010はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/05/22(日) 20:04:27.44ID:9X/55aF0
>>9
見かけ上は同一に見える (アドレスを取らずに呼び出すときに限ってインライン化できる) ことを保証するという意味だよ。
インライン化できる条件を整えておきたいということと矛盾しない。
0011デフォルトの名無しさん
垢版 |
2022/05/22(日) 20:07:42.95ID:ZvvsRMN9
>>8
俺が通ってる外国のコミュニティでその質問が出ると毎回Visual StudioでFA?って回答が帰ってくる
ネタで言ってるのか本気で言ってるのかは知らない
0012はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/05/22(日) 20:15:45.42ID:9X/55aF0
>>8
人によって使いやすさって違うからアドオンとかドキュメントの量とかが重要になってくるんだよ。
いくら潜在的に良い出来栄えであってもちょっとしたカスタムを全部自分で書かなきゃならないようでは面倒くさすぎる。
どこをどういじればいいのかいちいちソースコードを見ないとわからないのではダルい。
なんだかんだ不満があってもユーザ人口の多いものは全体としては良い選択になりがち。 物量重要。
0013デフォルトの名無しさん
垢版 |
2022/05/22(日) 20:19:45.26ID:sBUJB3wj
vs以外だとIDEっていうよりエディタとコマンドでやってるイメージ
ボーランドとか死にかけだしなあ
0015デフォルトの名無しさん
垢版 |
2022/05/22(日) 20:37:44.89ID:WUnKKX5R
>>11
ググった感じだと海外では無料版が多いように感じたw

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

レスサンクスです
0017はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/05/22(日) 20:50:26.55ID:9X/55aF0
>>16
>>9
> 定義を持たないコンパイル単位にでは inline の指示があっても inline しなくてもいいといっているに等しい
が結論だとしたらそう。 同意する。
むしろ定義を持つ翻訳単位でもインライン化しなくていい。

だから残る inline の意味は ODR の例外として機能するって部分になるわけ。
0018デフォルトの名無しさん
垢版 |
2022/05/22(日) 22:42:48.81ID:rj0GqvkC
>>17
なるほど。私の元の主張に反するのですが、規格上はそのように誘導されてしまうのですね…‥(呆然)
0020デフォルトの名無しさん
垢版 |
2022/05/28(土) 13:34:18.53ID:kIghR+Cp
C++入門書でオススメがあったら教えてください
0022デフォルトの名無しさん
垢版 |
2022/05/28(土) 14:07:22.40ID:kIghR+Cp
>>21
多謝多謝!
0024はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/05/28(土) 15:44:53.73ID:IqCM7SI4
C++ はそれなりに歴史が長いから仕様も変わってるし思想や習慣の変化もある。

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

色んな事情が絡むし、単純に C++ が巨大なのでどうせ一冊でちゃんとした理解にはならないと思う。
適当なやつをどれから読み始めてもいいんじゃないかね。
まあ、あまり古い奴は避けた方がよいだろうというのが最低限の基準かな。
0027デフォルトの名無しさん
垢版 |
2022/05/28(土) 17:21:17.26ID:DrsyU/Zk
違うでしょうなあ。
0029ハノン ◆QZaw55cn4c
垢版 |
2022/05/28(土) 20:36:31.97ID:HcUv+Nxj
>>24
ふむふむ。なかなか一筋縄ではいかない大人の事情ってのがてんこ盛り、ってことですね
私もそろそろ C++ をやり直そうかな‥‥
0030デフォルトの名無しさん
垢版 |
2022/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()); // ここがまずい
}
};
0031デフォルトの名無しさん
垢版 |
2022/05/31(火) 21:37:16.47ID:Cpwrpvdc
コピーコンストラクタが呼ばれて、最終的にmapのunique_ptrがコピーできないってことか。。。
C++98の人間だし10年以上離れてたから最近のC++まったくわからんわ・・・
0033蟻人間 ◆T6xkBnTXz7B0
垢版 |
2022/05/31(火) 22:00:19.02ID:eSF5ElRz
rは*thisの別名。
*thisの所有物を*thisにコピー。だめ。
*thisよりも高位じゃないと。。。
0035デフォルトの名無しさん
垢版 |
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(計算時間と誤差が劣化するがシュリンク可能))
0036デフォルトの名無しさん
垢版 |
2022/05/31(火) 23:48:59.95ID:xnVZpK0y
さすがに天才の漏れも三角関数って何だっけというあたりからスタートしたので
日数がかかってしまったが、いまやバッタフライ演算を完全に理解したから
純アルゴリズム的には最善の実装になっていると言える(希ガス、

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

あとはメモリアクセスの時間局所性を改善して1000倍にする、
0038デフォルトの名無しさん
垢版 |
2022/06/01(水) 07:38:09.36ID:g+4BWW21
過去形でワロタ
0041デフォルトの名無しさん
垢版 |
2022/06/01(水) 10:00:14.05ID:vvQTEkHX
>>36
漏れや希ガスというタイポや、バタフライ演算とかいう大学2年の信号処理の課題で出る程度のアルゴリズムを自信満々に書いちゃうあたり、かわいそうな人なのかな
0042デフォルトの名無しさん
垢版 |
2022/06/01(水) 10:09:19.65ID:IxX6jh1U
その辺はタイポじゃなくて20年近く前の2ch語なのじゃ……
イタいことには変わりないが
0047デフォルトの名無しさん
垢版 |
2022/06/01(水) 13:51:18.40ID:pJ9e03Xl
template <class T> void F(const T &t){ auto x = t; }
って関数があった場合、autoで推論(導出?)されるxの方はconst T&になるの?
ついでにここらへん分かりやすい資料があったら教えてほしい。
0048はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/01(水) 14:22:19.84ID:YMgHeGpL
>>47
テンプレートの実引数推論と同じ規則が適用される。
つまり
template<class U> void foo(U u);
というテンプレートが仮にあったとして、これに
foo(t);
としたときの U の型がその場合の x の型になる。
故に x の型は T であって const も参照もつかない。
0049デフォルトの名無しさん
垢版 |
2022/06/01(水) 22:01:40.23ID:g+4BWW21
auto&にすればconst参照も推論されるし、右辺値も取り得るならauto&&にしておけば間違い無いんだっけ
0050はちみつ餃子 ◆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);
と同じ推論になるわけだね。
0054デフォルトの名無しさん
垢版 |
2022/06/02(木) 10:56:54.96ID:MPFVtYTL
バッタフライってバッタとハエのことか
0056デフォルトの名無しさん
垢版 |
2022/06/02(木) 22:50:27.49ID:W32R/zzX
>>37-46
んまー藻前らの言う通り
>>(前スレ)695 のオリジナルのプログラムが書き方が変にIQ高すぎたせいで
漏れが普通に書いたプログラムの方が速かったということかもしれませ
んね、

しかしこれをここから2^3倍にするというのが真の天才の仕事なので
ご気体くだち、
0059デフォルトの名無しさん
垢版 |
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));
0061デフォルトの名無しさん
垢版 |
2022/06/03(金) 08:54:35.11ID:I7UEGKwl
>>59 move 使わないと移動しないでしょ。アドレス見るなりして確認できるはず。
>>60 「移動させたい」と言ってるんだから move で正しいでしょ。
0063はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/03(金) 09:33:30.85ID:ysQR9TY9
>>59
C++ の常識的な設計としてはには >>60 が主張するように forward を使うべき。
右辺値か左辺値かによって適切に切り替えが成されるので。

「常に」ムーブさせたいのであれば >>61 の述べる通りだが、
その場合は a.add(std::move(x)); の move は不要。 (有っても害はないが……。)
左辺値でも add がムーブするなら右辺値にキャストする意味はない。
0064デフォルトの名無しさん
垢版 |
2022/06/03(金) 09:48:25.29ID:IxeUpLcv
push_backが適切にやってくれるだろうし素人がここで手入れするところではないな
006959
垢版 |
2022/06/03(金) 14:58:35.62ID:3oYQiySt
これでいいってことですか?
void add(vector<int> &&x){
 vec.push_back(std::forward(x));
};

あと、
>「常に」ムーブさせたい
という言葉が気になるんですが、右辺値を受け取る場合に「ムーブさせない」場合があるんでしょうか?
0070デフォルトの名無しさん
垢版 |
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 が正解。なんで適当答える前に手元で確認しないのか
0071はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/03(金) 15:44:21.94ID:ysQR9TY9
>>69
ムーブさせない場合はある。

それとは別に可能なら左辺値にも右辺値にも対応するのが通例なので
それを無意識に前提に入れてしまっておかしなことを書いてしまった。
ごめんね。
0074デフォルトの名無しさん
垢版 |
2022/06/03(金) 16:10:12.85ID:g1oXgs2q
あ、もしかして >>59
> a.add(std::move(x));
について言ってんのか?そりゃここには move が要るが今は add の中の話だろ?
0075デフォルトの名無しさん
垢版 |
2022/06/03(金) 18:50:26.25ID:lbrgnw5P
>>73
さてはrvalueの挙動理解してないな?
https://wandbox.org/permlink/rtkW4N7gWRu9yyqK

rvalueとして受け取った時点でlvalue扱いなんだよ
moveするまで所有権を持っていて、moveで所有権を放棄する。
所有権はT&&を受け取る関数に移る。
0076デフォルトの名無しさん
垢版 |
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する
0078デフォルトの名無しさん
垢版 |
2022/06/04(土) 12:47:58.32ID:TQBK1egQ
cpp経験のあるエンジニアが面接に来たんですがboost知らないとかあり得るんでしょうか
0079デフォルトの名無しさん
垢版 |
2022/06/04(土) 13:11:38.01ID:FGCXQeDT
あり得ません、エアプです
0080デフォルトの名無しさん
垢版 |
2022/06/04(土) 13:13:16.94ID:to7UVp4p
でもC++を完全に理解してるスーパーエンジニアが君の会社に来ることはないんだ
0081デフォルトの名無しさん
垢版 |
2022/06/04(土) 13:41:01.98ID:vvbHqYcO
boost知ってても使ってないとか黙殺するとかなら有り得るんじゃね
0082デフォルトの名無しさん
垢版 |
2022/06/04(土) 13:51:08.17ID:cj+dvlSK
CとCppは似てるらしいけど最初はCから始めて
基礎を身につけた方がいいとかありますか?
0084デフォルトの名無しさん
垢版 |
2022/06/04(土) 14:05:58.45ID:OQ3usAsV
C++のほうがコンパイル時の文法チェックが親切なので、g++でコンパイルするのが吉
0086デフォルトの名無しさん
垢版 |
2022/06/04(土) 14:37:22.59ID:cj+dvlSK
>>83-85
ありがとうございます!勉強になります!
0089デフォルトの名無しさん
垢版 |
2022/06/04(土) 16:03:47.30ID:OQ3usAsV
今どきの人がCの機能を学ぶにしても、最初のうちはC++コンパイラを使ったほうがいい
C++コンパイラは初心者がやりがちな意図しない型キャストに警告を出してくれる
0090デフォルトの名無しさん
垢版 |
2022/06/04(土) 16:44:33.09ID:vvbHqYcO
>>82
その通り
ハゲめ
0091デフォルトの名無しさん
垢版 |
2022/06/04(土) 21:34:58.76ID:TQBK1egQ
>>79
やっぱ有り得ないですよね
うちの会社はC++使わないんですが、盛り過ぎた経歴は看過できないので二次面接にはC++経験のあるエンジニアに同席してもらいます
0092デフォルトの名無しさん
垢版 |
2022/06/04(土) 21:43:09.92ID:OQ3usAsV
>>91
ずっと同じ部署にいてboostライブラリに接する機会がなかっただけじゃないかな
ずっと同じ部署にいたってことは専門性が高くて信頼されてた可能性がある
0093デフォルトの名無しさん
垢版 |
2022/06/04(土) 21:48:20.42ID:nRM2q6cY
>>92
はい、私がC++は門外漢すぎて突っ込んだ質問が出来なかった手落ちもあるので、後続の面接ではしっかり見極めたいと思います
C++以外の話でも怪しい部分はありましたし
0094デフォルトの名無しさん
垢版 |
2022/06/04(土) 22:16:16.74ID:IRaDT1CY
>>83も書いてるけどboost使わない職場はそれなりにあるから俺もboost使える?って聞かれたら使ったことないからよく知らんって答えると思う
そもそもそんな事で採用決めるような会社はこちらから断ると思うが
0095デフォルトの名無しさん
垢版 |
2022/06/04(土) 22:23:56.45ID:FR2x7OcT
はい、職歴に書かれた内容に曇りがないか見極めたかっだけなので、Boostに知見があるかどうかはさほど問題にしてません
0096デフォルトの名無しさん
垢版 |
2022/06/04(土) 22:54:17.16ID:cXL4Xuwo
>>78
バカか
boostは標準化されてないだろ
ヘッダ入れ込んでまでわざわざ使うヤツは縛りプレイヤーかマニアだぞ
0097デフォルトの名無しさん
垢版 |
2022/06/04(土) 22:56:04.77ID:4luU2XzE
>>79はネタで言ってるかエアプだと思うよ
boost役に立つものもあるし個人では使うが、仕事で必須かというとそんなことはない
0099デフォルトの名無しさん
垢版 |
2022/06/04(土) 23:04:03.58ID:BuoePqDI
知ってるけどあんまり使ってない、使ったことないから詳しくは知らない、とかならまあ別に普通だけど
知らない聞いたことすらないってのはヤバい
0101デフォルトの名無しさん
垢版 |
2022/06/04(土) 23:12:59.31ID:4luU2XzE
>>98
その標準じゃないもん、にはOSのAPIとか目的のソフトに必須のライブラリ群も含んでる?
0102デフォルトの名無しさん
垢版 |
2022/06/05(日) 00:13:46.63ID:/AT5pgYO
boostもサードパーティのライブラリも使わんて人は、コマンドラインのパーサーとか任意精度のライブラリとか自分で毎回書いてるのか?
正気か?
0103デフォルトの名無しさん
垢版 |
2022/06/05(日) 00:46:57.94ID:/ywqNijR
そんな便利なものは存在しないから標準ライブラリ+Win32でどうにかしてるだけじゃね?
0105デフォルトの名無しさん
垢版 |
2022/06/05(日) 03:05:51.19ID:IC6BDqn3
>>102
コマンドラインのパーサー含め、その辺の文字列処理は全部自前の文字列クラスでやっちまうな、俺はw
いちいち文字コードがどうたらとか悩みたくないし
0106デフォルトの名無しさん
垢版 |
2022/06/05(日) 05:03:18.77ID:O5HYGw/G
>>95
c++標準の勉強をしていれば単語としてboostを聞いたことあるだろう。
知らないのなら大した勉強はしていないだろうから、せいぜい業務で通り一辺触ったことがあるくらいじゃないかね。

どこまでのスキル求めているかによるけど、業務内容に近い課題を与えてテストしてみたらいいんじゃない?
業務でc++を使わないなら、c++スキルに金を払うわけじゃないから気にすんな。どうせ募集要項にc++とか書いてないんだろ。
0107デフォルトの名無しさん
垢版 |
2022/06/05(日) 06:28:02.59ID:kEvpwCAH
自分の知ってる世界がすべてだと思ってる人間の方が危険。
C++が使われる範囲が広すぎるから、言語の経験有無よりもどの分野で開発してたのかを聞くべき。
ガラケー時代のカーネルドライバ書いてたり、携帯キャリア向け機器の組み込みやってた時はboostどころかstlすら使ってなかった。
というか使えなかった。
一方でスマホゲーのバックエンドを書いてた時はboostまみれだった。
0109デフォルトの名無しさん
垢版 |
2022/06/05(日) 08:31:22.07ID:sROqatdZ
boost知らない人は自分が使ってる環境がC++11/14/17/20なのかも知らないとかありそう
大昔のC++文法しか知らない人とかいるし
面接ではこれも聞いてほしい
0110デフォルトの名無しさん
垢版 |
2022/06/05(日) 09:22:33.51ID:Zl7Pb69A
昔はboostでも使わんと正規表現扱えなかったでしょ(ヽ´ω`)
今の子は知らんのかな?
0112デフォルトの名無しさん
垢版 |
2022/06/05(日) 10:57:35.83ID:TqTpE262
今や正規表現ライブラリはpcre2使っておくのが最適解でしょ
boostもre2も速度遅すぎ
最速軽量がre2の長所だったのは昔の話
0113はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/05(日) 11:09:32.30ID:XG05O5RB
Boost 内のライブラリは組み合わせやすかったりもするだろうし、単独で性能が良いというだけが指標ではないだろう。
もちろん性能が良いに越したことは無いが、数倍程度の違いなら全体としては問題にならないことも多い。
0114デフォルトの名無しさん
垢版 |
2022/06/05(日) 11:33:39.66ID:TqTpE262
STLでregexクラステンプレートが追加されたのだから各正規表現ライブラリの供給元がstd::regexに準拠したラッパークラスを提供してくれるのかと思いきや、ほったらかしだしなあ
0115デフォルトの名無しさん
垢版 |
2022/06/05(日) 13:02:35.05ID:u0j22vIZ
おまいの募集要項にboost使用するって描いてないならおまいが可笑しい
boost以外の部分でC++の知識や使えるかどうかを確認するべき
0116デフォルトの名無しさん
垢版 |
2022/06/05(日) 13:05:40.20ID:u0j22vIZ
>>108
mpirだな
0117デフォルトの名無しさん
垢版 |
2022/06/05(日) 13:23:08.93ID:VgN5DVM1
ただの文字列なら速さで選ぶのも良いけど、HTMLやXMLのような注釈を含むテキストは、STLやboostを使うのがスマート。
0119デフォルトの名無しさん
垢版 |
2022/06/05(日) 13:44:58.69ID:JAUYaj4s
別に即戦力求めてるわけじゃないので開発言語で縛って間口狭くしたくないんですよ でも質疑応答のクオリティ上げるためには突っ込んだ質問って必要じゃないですか 今回はそれが上手く出来なかっただけです
0120デフォルトの名無しさん
垢版 |
2022/06/05(日) 15:40:19.58ID:udiiYXiV
ようするに基礎があるかどうかと伸びしろがあるかどうかだろ

今知らなくても調べればすぐ判ることが出来れば問題無い罠
0121デフォルトの名無しさん
垢版 |
2022/06/05(日) 16:50:16.03ID:sROqatdZ
本人が経歴盛ってるならクズだが、営業やエージェントが勝手に盛ってることもあるからな
その辺も見極めて大目に見てほしい
0122デフォルトの名無しさん
垢版 |
2022/06/05(日) 17:21:37.24ID:dinbGc5/
自分のとこが金をいくら出せるのか考えてからマウント取ってほしいもんだわ
0125デフォルトの名無しさん
垢版 |
2022/06/05(日) 18:15:07.18ID:VgN5DVM1
>>124
ブラウザでctrl+f押してみ。
0128デフォルトの名無しさん
垢版 |
2022/06/05(日) 22:30:48.15ID:n7vwmg3m
C言語の基本を学んでC++を勉強を始めました
バッファのフラッシュについて教えてください
プログラムは最後に全てのバッファがフラッシュされると思いますが、
std::flashやstd::endlはどういった時に使えばいいのでしょうか?
また、フラッシュの処理時間を考えるとstd::endlよりも'\n'を使った方が軽くなると思いますが、
あえてstd::endlを使う意味はありますか?
このフラッシュという概念はC言語になかったですよね…?
0130デフォルトの名無しさん
垢版 |
2022/06/05(日) 22:53:56.06ID:ypMgugQ8
>>128
キミの疑問の中に答えがあると思うんだが

>プログラムは最後に全てのバッファがフラッシュされると思いますが、
逆に言えばプログラムの途中ではいつバッファの内容がflashされるかわからないってことじゃん
どういった時に使えばいいのか、なんてプログラムの最後ではなく途中でflashしたい時だろ
0131デフォルトの名無しさん
垢版 |
2022/06/05(日) 22:55:08.26ID:JCaRLrt5
stderr(バッファリング無し)とstdout(デフォルトでバッファリング有り)のリダイレクト先が同じ(コンソール等)のとき、
printf()とfprintf()の実行順にprintf()とfprintf()の出力結果を並ばせたいときに早速ffush(stdout)の出番が、
あとfflush()せずにabort()したらバッファ上のデータが失われることがある
もっともabort()を呼ぶしかない状況とかはどうしようもない状況なので盲目的なfflush()が適切とは言えないケースも
ありえるかもし
れんが
0132デフォルトの名無しさん
垢版 |
2022/06/05(日) 23:00:34.55ID:JCaRLrt5
んまー通常はファイルのクローズでフラッシュされるから明示的にファイルポインタに対してfflush()する必要に迫られることはなさげ
腸人工的なシチュエーション(でありかあまり良い設計でない例)として、
オープンしたままのファイルA、Bにこの順でデータが追記されることを気体するプロセスが他に居るときに
A、Bの順で追記するとき要る?ぐらい??
0133デフォルトの名無しさん
垢版 |
2022/06/05(日) 23:11:06.10ID:TqTpE262
他のプロセスと通信する時に明示的なバッファフラッシュが必要になることがあるよ
0134デフォルトの名無しさん
垢版 |
2022/06/05(日) 23:17:22.56ID:JCaRLrt5
>>133
それは思わないでもなかったが、
1. バッファに入った順で出ていく
2. ほっといてもバッファ内容がどんどん出ていく
3. 通信は送りっぱなしまたはロジカルなハンドシェーク手順
である場合にfflush()が必須というケースが思いつきませなんだ、
0135デフォルトの名無しさん
垢版 |
2022/06/05(日) 23:24:31.44ID:/ywqNijR
1行ごとに結構重い処理をしたり、std::cinが入ってくるタイミングが不定期だったりするときに1行ごとにflushしておくと便利。
C言語でも使うテクニックだけどね
0137デフォルトの名無しさん
垢版 |
2022/06/05(日) 23:36:59.90ID:JCaRLrt5
>受信側(他アプリ)の都合次第
どのような都合かkwsk、
fflush()したら動いて、fflush()しないと止まってしまう通信処理とかはなんかおかしいのでは……

ほっといてもバッファ内容がどんどん出ていく 限りfflush()せずとも送信は成立する
受け取れたかどうかはACKかNAKでも返してもらえばワカルから、
受信タイムうアウト検知ぐらいしかタイミングが関係する要素は無さげ、
0138デフォルトの名無しさん
垢版 |
2022/06/05(日) 23:57:14.80ID:TqTpE262
「受け取れたかどうかはACKかNAKでも返してもらえばワカル」ってのがすでに受信側の都合だろ
0140デフォルトの名無しさん
垢版 |
2022/06/06(月) 00:15:14.95ID:1jBvtBty
それがフラッシュしておかないと停電のときデータ全部持ってかれるんだよな
0141デフォルトの名無しさん
垢版 |
2022/06/06(月) 00:19:06.76ID:68av+k9D
とりあえず言っておくが、水がもったいないからと言って水洗トイレを流さずに退出するのはやめたほうがいい
0143デフォルトの名無しさん
垢版 |
2022/06/06(月) 00:23:36.15ID:1jBvtBty
フラッシュってのはハードディスクにどこまでデータ書いたか正規化する目的で行うから、フラッシュしないで停電モードでクラッシュすると、復旧したときに書いてたデータはゼロバイトのままだったりするが、こまめにフラッシュでデータを確定申告してる場合は書いた分がきちんと残ってたりする
0145デフォルトの名無しさん
垢版 |
2022/06/06(月) 00:28:00.96ID:1jBvtBty
ま、無停電装置つけてたり電源不足などでHDDが頻繁に切断される環境でなければ問題ないけどね
0146デフォルトの名無しさん
垢版 |
2022/06/06(月) 00:28:38.87ID:68av+k9D
一休はすでに縄を持って待ち構えてくれているのだから、義満が虎を屏風から追い出せばいいだけ
簡単なことだろ
0147デフォルトの名無しさん
垢版 |
2022/06/06(月) 02:46:25.01ID:ETmHHhEk
誤解している人が多そうだけど
fflush()はC標準ライブラリの中のバッファリングデータを全て吐き出すだけであって
システムコールでいえばwriteするだけだよ
一方でカーネルがディスクなどに書き出すのを保証するのはシステムコールではsync/fsyncであってこれはfflush()しても行われない別のもの
014859
垢版 |
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))

この理解であってますか?
0149デフォルトの名無しさん
垢版 |
2022/06/06(月) 08:55:53.89ID:Ug3DHjCK
>>147
sync sync sync
最後に電源切る前に
^C 連打ですね
判ります
0152デフォルトの名無しさん
垢版 |
2022/06/06(月) 10:28:30.66ID:0alNkgKE
noexceptの有無で動作が変わるなんてC++ムズすぎィ!
0153デフォルトの名無しさん
垢版 |
2022/06/06(月) 11:42:00.12ID:Ug3DHjCK
>>152
>>66
0154デフォルトの名無しさん
垢版 |
2022/06/06(月) 11:43:05.77ID:Ug3DHjCK
まあ原因と結果が全然離れた別の場所で起こるっていう意味では難易度高いとは思う
0155デフォルトの名無しさん
垢版 |
2022/06/06(月) 12:41:54.06ID:jOQJjNZV
>>148
あってる
0159デフォルトの名無しさん
垢版 |
2022/06/08(水) 22:59:00.34ID:lI0dIi5c
>>138
話をそらすでないは;;;
通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
受信側(他アプリ)に伝わるやんけ
fflush()全然必須じゃないやんけ
fflush()に関してはやっぱ受信側の都合も糞も無いやんけ;;;

んまー今日日の計算機は速いから、世迷言てんこ盛りの呪術指向プログラミングでも
比較的まともっぽく動くが、
0160デフォルトの名無しさん
垢版 |
2022/06/08(水) 23:03:01.67ID:lI0dIi5c
fflush()にはフロー制御で止まっている送信を動かす力は無いし、
ブロック型デバイスの書き込みのトリガーになる保証は無いしで
やっぱ使いどころは>>131みたいに多対1の書き込み(dstが同じ)というケースでの論理的な書き込み順序保証ぐらいしか無さげ
0162デフォルトの名無しさん
垢版 |
2022/06/09(木) 19:04:36.80ID:d61AFL9R
受信側の都合どうこうの話は知らんが
>通常のキャラクタ型デバイスならfflush()せずともバッファ内容がどんどん出ていって
それは送信側がどんどん送り出している場合でしょ
0163デフォルトの名無しさん
垢版 |
2022/06/09(木) 19:12:48.98ID:6LGi7Ubo
高機能トイレしか使ったことない人は、何もしなくても離席したら勝手に排泄物が流されていくと思っているからね
0168デフォルトの名無しさん
垢版 |
2022/06/10(金) 18:15:06.01ID:q3uEdydr
長時間ストリーミング書き込み時にFileFlushBuffersコールしてなかった停電時の悲劇
0169128
垢版 |
2022/06/11(土) 13:05:09.88ID:qY+svW4r
なんとなく分かりましたが、C言語でfflush()を使っていなかったので困ることもなさそうです
改行は'\n'を使ってもう少し勉強を進めてから改めて皆さんのレスを読み返そうと思います
返事が遅くなりました、ありがとうございました
0171デフォルトの名無しさん
垢版 |
2022/06/11(土) 21:16:14.33ID:ZeuO2q0P
>>163
ソフトウェアー呪術者、、、、

>>163 のような台詞はファイルをクローズしない人に言ったらよい
fflush()しないことにに当てはまらない理由はすでに述べているっつーの;;;
0172デフォルトの名無しさん
垢版 |
2022/06/11(土) 21:25:33.69ID:ZeuO2q0P
>>168
左様停電に対して備えたいならI/Oストリームのバッファ階層の操作で満足するのではなくて
ioctlレヴェルの働きかけで掃き出し操作を保証を行うべき、(デバイスによってやるべきことが違う

というわけで論理的思考う能力に乏しい香具師がfflush()万能教にはまっている悪寒、
0173デフォルトの名無しさん
垢版 |
2022/06/11(土) 21:47:10.33ID:ZeuO2q0P
ていうかそもそも馬鹿でかいバッファを用意しておいてから停電を恐れるというのはアレな発想でありまして、
真に停電に備えたいなら馬鹿でかいバッファを備えたデータのストリームとは別に、
どこまで書き込みが終わったかというだけの小さいサイズのジャーナル情報を
こまめに書くというのがファイナルアンサーであって
停電の際はジャーナル情報だけ保証して停電の瞬間に馬鹿でかいバッファ上にあったデータは諦めるのが正しいシステム

停電による処理中データの喪失がどうしても嫌ということなら速度の方を諦めてアンバッファーにするかバッファを小さくしてくだち、
0174デフォルトの名無しさん
垢版 |
2022/06/11(土) 21:56:10.36ID:ZeuO2q0P
まとめ:
この地球上のどこを探しても停電への備えがこまめなfflush()(笑)ということはありえない
0176デフォルトの名無しさん
垢版 |
2022/06/11(土) 23:31:57.10ID:pfxnOy19
小さいサイズでもそれが即座に反映だれるとは限らないけどな
停電に備えるならUPSだろ
何がこまめに書くのがファイナルアンサーだよ
突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな
0178デフォルトの名無しさん
垢版 |
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スレッド
0179デフォルトの名無しさん
垢版 |
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分ぐらい、
0180デフォルトの名無しさん
垢版 |
2022/06/12(日) 14:00:10.22ID:0uPAg53b
OpenMPは昨日始めたのでなんか間違ってるかもしれん……orz
行列の転置が8スレッド使って(2回目以降も)実行時間1/8にならない件について:

https://ideone.com/rFCMy5
のfftb6::transpose()のコードの書き方だと50%ぐらいにしか短縮されなんだ 。n_
0181デフォルトの名無しさん
垢版 |
2022/06/12(日) 14:02:02.73ID:0uPAg53b
つなみにVS2019でOpenMP有効にするには
「構成プロパティー」→「C/C++」→「言語」→「OpenMP のサポート」
で逝ける、
0182デフォルトの名無しさん
垢版 |
2022/06/12(日) 14:04:35.42ID:0uPAg53b
>>176
>何がこまめに書くのがファイナルアンサーだよ
NTFSの実装、、、

>突然の電源断で書き込み先のデバイスが壊れる可能性だってあるんだからな
しらそん
それはUPSを買う金もないのに停電とかを引き合いに出してきた香具師に言ってやってくだち
0184デフォルトの名無しさん
垢版 |
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についても言える)
0187デフォルトの名無しさん
垢版 |
2022/06/13(月) 23:36:52.53ID:dm71PatD
並列処理に何でマルチスレッド使ってんだよ
昭和からタイムスリップしてきたのか?
0190デフォルトの名無しさん
垢版 |
2022/06/14(火) 16:46:20.69ID:yDV29Um0
教えてください
C++で書かれたDLLがあります
とあるCエクスポート関数を呼び出すと稀に Access Violation 0xc0000005 が発生することがありプロセスが異常終了してしまいます

幸いなことにこの関数は大した仕事をしておらず結果が得られなければそれで困ることもありません(結果が得られれば少し役に立つ程度です)
なのでこの関数の失敗を握り潰したいのですが、C++ でアクセス違反を try-catch で握り潰すことはできるのでしょうか?
それともアクセス違反は致命的なエラーなので必ずプロセス終了に至るのでしょうか?
0194デフォルトの名無しさん
垢版 |
2022/06/14(火) 18:22:20.04ID:WigeF4Tr
>>190
> 幸いなことにこの関数は大した仕事をしておらず結果が得られなければそれで困ることもありません(結果が得られれば少し役に立つ程度です)
そんな関数なら空の関数に差し替えればいいんじゃね
0195デフォルトの名無しさん
垢版 |
2022/06/14(火) 18:39:01.73ID:yDV29Um0
>>193
ありがとうございます!
/EHa を付けたらキャッチできました!
いままでは /EHsc が指定されてましたのでオプションの意味の違いを調べてみます
0196デフォルトの名無しさん
垢版 |
2022/06/14(火) 19:23:09.63ID:bI70PJIL
DLLが例外出してるのをCで握り潰してるのが原因だろ
0197デフォルトの名無しさん
垢版 |
2022/06/15(水) 20:40:34.83ID:RdmQ7I01
素人の質問でごめんなさい。(ここが一番関連ありそうだったので)
バイオインフォマティクスをやっているのですが、例えば主にC++で書かれたUnicycler (https://github.com/rrwick/Unicycler)というソフトウェアでは、--threadsオプションで使用するスレッド数を指定できます。
デフォルトだとスレッド数8なのですが、仮にそれを1コアを使って実行した際はどのような挙動になるのでしょうか。
コア数<スレッド数なので失敗するかと思ったのですが、思いの他うまく実行できてしまいます。
一般的にこういう場合、並列 (parallel)処理ではなく並行 (concurrent)処理で、スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか・・・
0198はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/15(水) 20:45:50.35ID:VY0KZJ3n
>>197
> スレッドごとに時間を分けて同一コアで処理している、ということなのでしょうか

せやで。
OS がスケジューリングしてスレッドを交互に実行しとる。
コア数以上のスレッドに分けても実行速度が上がったりはしないよ。
コンテキスト切り替えのコストの分だけむしろ遅くなると思う。
0199デフォルトの名無しさん
垢版 |
2022/06/15(水) 21:02:51.51ID:RdmQ7I01
>>198
なるほど、OS賢いですね。。
つまり1コアでやるときは複数スレッドの処理もできるけど、無難に1スレッドの処理にした方がむしろ速い、ということですね。
勉強になりました!ありがとうございます!
0200デフォルトの名無しさん
垢版 |
2022/06/15(水) 21:05:28.34ID:74xVOU49
各スレッドがio待ちしてるかも知れんし、コア数より多くても早くなる場合もあるんじゃね
gcc動かすときもコア数1.5倍位指定してる
0201デフォルトの名無しさん
垢版 |
2022/06/15(水) 21:28:42.61ID:RdmQ7I01
調べてみたらコンテキストスイッチにもプロセスコントキストスイッチとスレッドコンテキストスイッチがあって、
後者の方がコストが格段に低いとありました。
この場合は同一プロセス中の複数スレッドで後者なので、
>>200さんの言っていることもありますし、コア数よりスレッド数を少し多めに設定しても速くなるのかもしれませんね。
実験して確かめるのが一番かもですね。
0203デフォルトの名無しさん
垢版 |
2022/06/15(水) 22:07:11.11ID:Ltc382Vw
>>202
何の話だ?
0205デフォルトの名無しさん
垢版 |
2022/06/15(水) 22:28:16.78ID:Ltc382Vw
pythonでもマルチスレッドとマルチプロセッシングは別物だろが
0207はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/15(水) 22:56:22.65ID:VY0KZJ3n
そのへんは色んな論が合って今の主流がどうなってんのかよくわからん。
でも一度はプロセスを軽くする方向 (スレッドの実態をプロセスとする方向) になったというのは私も聞いたことがあるような気がする。
(BSD 系の話と混ざってるような気もする。 だいぶんうろ覚え。)
プロセスを軽くするというよりは段階を分けるというか、
プロセスをスレッド的な範囲で使っている分にはスレッド程度の処理しかしないみたいな感じ。
ただ、それは最終的には管理コストが思ったより大きくてそれほど効果的ではないというオチじゃなかったっけ?
0209デフォルトの名無しさん
垢版 |
2022/06/15(水) 23:14:22.38ID:8Ciw/luQ
forkもCoWがあるからオーバーヘッド大したことないんだっけ?
0210デフォルトの名無しさん
垢版 |
2022/06/16(木) 06:09:16.40ID:acnLqVz4
>>206
誰に聞いたんだよw
てか、少しは疑うことを覚えた方がいいぞ

>>208
ソース出してみ

>>209
Copy on writeを使わない実装よりは大幅に軽いけどメモリー空間とかを準備しなくて済むスレッドよりは重いよ
0211デフォルトの名無しさん
垢版 |
2022/06/16(木) 06:36:56.71ID:GA9mXaJg
>>205
そうだった。勘違いしてた。
pythonで流行りの並列処理をやろうとしたらマルチプロセスだった。何を言ってるのか わからねーと思うが(以下略)
0212デフォルトの名無しさん
垢版 |
2022/06/16(木) 07:01:31.35ID:ilsRfae9
>>199
ユニプロセッサでも例えばI/O待ちやユーザ入力待ちしている間にできることをやっとくんだよ
0213デフォルトの名無しさん
垢版 |
2022/06/16(木) 07:17:28.07ID:lg2Mpz7e
例えばシングルスレッドのみを利用のサーバーでも
その中で非同期タスクを1万個動かしてクライアント同時接続1万個の処理が可能
ほとんどがネットワーク待ちとディスク待ちだから非同期ならばそれだけ同時に並行処理(≠並列処理)できる
0214デフォルトの名無しさん
垢版 |
2022/06/16(木) 07:30:29.25ID:lg2Mpz7e
もし同期プログラミングしか出来ないと
その多数のクライアントを捌くためにスレッド数を増やすことで対応することになるが
スレッドリソースを喰うため大きいためスレッド数を増やせず
スレッドスイッチングも重いため圧倒的に不利となってしまう
0215デフォルトの名無しさん
垢版 |
2022/06/16(木) 08:51:16.63ID:ilsRfae9
ネットのサーバーは本質的にマルチタスクで
たとえシングルで力技かましてても外から見て複数のタスクを同時にこなしている
0217デフォルトの名無しさん
垢版 |
2022/06/16(木) 09:53:32.18ID:JxXqg7BH
>>216
それは初心者まで
普通は非同期に処理する
0219デフォルトの名無しさん
垢版 |
2022/06/16(木) 11:53:53.45ID:ilsRfae9
マルチスレッドは基本的に非同期だけどな
必要に応じてミューテックスやシグナルで待ち合わせする
0222デフォルトの名無しさん
垢版 |
2022/06/16(木) 17:24:48.01ID:Vxm/sO96
しかしまあどこかにライブラリを作ってる人がいるんだけど、その事実を認識できんプログラマというのはおるよな
0224デフォルトの名無しさん
垢版 |
2022/06/16(木) 17:39:26.55ID:T9ZCQ85W
非同期プログラミングでは多くの言語でPromiseもしくはFutureと呼ばれる同じ概念の抽象化を用いて行なう
つまりこれから行われることを期待する未来の約束という抽象化したものに次々と託していくことで
プログラムコードの見かけ上の記述順とは異なり並行して非同期に複数のタスクが走ることで非常に効率的に実行
それらは一つのスレッド内で何十も何千も非同期に並行して動かすことが可能であるがマルチスレッドを使えばさらにそのコア数倍を動かせる

>>216
それだと効率が悪すぎてお子様向け
0225デフォルトの名無しさん
垢版 |
2022/06/17(金) 01:35:07.48ID:UGOae7/Q
プログラマー目指してるんですが、C++やるなら03と11の両方勉強しておいた方がいいですか?
0226デフォルトの名無しさん
垢版 |
2022/06/17(金) 01:42:46.88ID:OGNvxC9Z
はて?
C++11やればC++03もカバーしたことになるからC++11以降一択だよ
細かいことはコンパイルエラーが出てから考えればいいんだよ
0230デフォルトの名無しさん
垢版 |
2022/06/17(金) 09:56:39.22ID:UGOae7/Q
C++11を勉強しておけば良さそうですね
独習C++をやります
ありがとうございました
0231デフォルトの名無しさん
垢版 |
2022/06/17(金) 13:24:12.81ID:SEHo94h9
c++11で書いたコードをC++20でコンパイルしようとしたらエラー出まくりんぐ
教えてエロい人
0234デフォルトの名無しさん
垢版 |
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
0235デフォルトの名無しさん
垢版 |
2022/06/17(金) 15:34:14.31ID:tDJ88+fU
C#かなんかと混ざってない?

vector<int> unkos;
for(auto unko : unkos) { }
0236デフォルトの名無しさん
垢版 |
2022/06/17(金) 15:55:37.01ID:SEHo94h9
しょっちゅうC++とC#往復するから頭おかしくなるな
でもコードスニペットで自動的にfor each (auto unko in unkos)みたいな構文に補完されるんだよね
てか以前までこれでビルド通ってたし
VSのバグかな?
0238デフォルトの名無しさん
垢版 |
2022/06/17(金) 16:10:31.33ID:SEHo94h9
確認したけど.cppと.hで試してる
C++17まではビルド通るけどC++20にするとエラーだわ
0239デフォルトの名無しさん
垢版 |
2022/06/17(金) 16:18:22.80ID:G79h5Zer
C++11 以前はもう忘れていいとは思うけど
以前と以降の違いは知ってた方が良いとも思う
0241デフォルトの名無しさん
垢版 |
2022/06/17(金) 16:20:08.55ID:G79h5Zer
>C++17まではビルド通るけど

マジか?
0243デフォルトの名無しさん
垢版 |
2022/06/17(金) 17:16:26.61ID:iqIqAnpY
参照&とか、左辺値とか、moveとか、copyとか、体系的に学びたいんだけど、
その辺、いいKindle本ない?
オススメない?
0244デフォルトの名無しさん
垢版 |
2022/06/17(金) 17:24:24.76ID:G79h5Zer
その質問が出て来る時点で既に体系的に知ってるだろ
0245デフォルトの名無しさん
垢版 |
2022/06/17(金) 17:42:51.03ID:2abskYGH
C++の書籍紙の本ばっかだよな
ネット上のドキュメント漁れって事なんだろうけど
0246243
垢版 |
2022/06/17(金) 18:07:25.78ID:iqIqAnpY
C++をclassの使えるCとしか使ってなくて(そんなに使ってない)、
んで参照&を使った左辺値?を見よう見真似で使ったんだけと、うまくいかなくて(結局ポインタを使った参照を使いました)

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

Webだと細切れなのでKindle本で読みたいと思います。
オライリーのEffective modern C++なんか適当でしょうか?
でもKindleないんだよなぁ
0252デフォルトの名無しさん
垢版 |
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アプデが原因っぽい感じするし、大人しく推奨の構文使うようにするよ
お騒がせしてスマソ
0255デフォルトの名無しさん
垢版 |
2022/06/17(金) 19:48:56.19ID:sTQyUMOv
>>254
両方使えるって書いてあるけど

> この非標準のキーワードは、C++/CLI プロジェクトと C++ ネイティブ プロジェクトの両方で使用できます。 ただし、これを使用することはお勧めしません。
0256はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/17(金) 19:50:56.98ID:Ic1RtTnb
>>246
「江添亮のC++入門」は比較的ハードルが低く基礎を理解できるように書かれてると思う。
(別途学習する前提で継承まわりをごっそりと省いたりしてるけど……)
元になった原稿は無料で公開されてて、 Markdown で書かれているので
適当なツールを使えば Kindle で読める形式にもできるんじゃないかな。
0258デフォルトの名無しさん
垢版 |
2022/06/17(金) 20:05:32.50ID:wjEVmEJW
C++/CLIはC++20で見捨てられてるので強制的にC++17としてコンパイルされる

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

ちょっとしたプログラムならwandboxとかでgcc/clang試してみてもいいんじゃない?
MSVCは独自拡張とか、標準ライブラリでも新しいバージョンのものを先行実装してたりするよ
0259はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/17(金) 20:06:26.13ID:Ic1RtTnb
MSVC を使ってないからよう知らんけど拡張を抑制するオプションとかないの?
0262デフォルトの名無しさん
垢版 |
2022/06/17(金) 23:05:28.99ID:nJOnHnXa
C++/CLI捨てられちゃうのか
じゃあ今後C#とかとのグルーには何使えばいいの?
0265デフォルトの名無しさん
垢版 |
2022/06/17(金) 23:43:23.56ID:+i8GyaaY
中国人に非ずば人に非ず。
0266デフォルトの名無しさん
垢版 |
2022/06/17(金) 23:57:35.61ID:OGNvxC9Z
PCREやbregonig.dllなどのPerl互換正規表現ライブラリでは、日本の漢字と中国の汉字が同じ\p{Han}に一絡げにされてるから注意しなよ
0267デフォルトの名無しさん
垢版 |
2022/06/18(土) 20:22:14.05ID:jYGrUTdl
ユニコードだからってことじゃなくて?
0268デフォルトの名無しさん
垢版 |
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/
0270デフォルトの名無しさん
垢版 |
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倍速、
0271デフォルトの名無しさん
垢版 |
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マクロ定義をコメントアウト。元に戻せば前と同じになる。)
0272デフォルトの名無しさん
垢版 |
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倍を達成したのであった、
0273デフォルトの名無しさん
垢版 |
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キャッシュ間の帯域をうまいぐあいに有効活用してくれているっぽい
ここらになってくると詳細は調べようが無いので漏れもソフトウェアー呪術者にならざるおえない
0277デフォルトの名無しさん
垢版 |
2022/06/21(火) 23:41:17.67ID:Nd0elFbL
内容に関係のないクソみたいな指摘しかできないお前らも大概終わってるけどな
まあこんなとこじゃなくてブログとかSNSにまとめろよとは思う
0278デフォルトの名無しさん
垢版 |
2022/06/22(水) 00:04:15.50ID:nUS9+NCG
ジジイだから周りのこととかスレの流れとか見えてないんだろう
前頭葉が加齢で萎縮して空気を読む能力が衰えたのかな
0279デフォルトの名無しさん
垢版 |
2022/06/22(水) 02:07:39.75ID:mxrPsC3u
>>277
> 内容に関係のないクソみたいな指摘しかできない
ハァ?
文盲じゃなかったら本人だろコイツ

1の乗根じゃなくて整数環でFFTした方が誤差の意味でも速度の意味でも劇的に改善するって何度も指摘してるんだが
0281デフォルトの名無しさん
垢版 |
2022/06/23(木) 16:48:56.08ID:gevVgEYw
どうでもいい言葉尻に突っかかるやつ
若さを自慢したつもりになってるの?
尻の青さをバカにされてるだけだよ
0282デフォルトの名無しさん
垢版 |
2022/06/23(木) 18:18:04.50ID:5dy8Tjxk
プログラマの発言じゃないな
プログラムは1文字のタイプミスで全く違う挙動になるのだから
0283デフォルトの名無しさん
垢版 |
2022/06/23(木) 18:26:17.60ID:rC+mT8P4
偶によくC++読み書き出来ない奴がレスしてるんだけどどっから湧いてきてんの
0284◆QZaw55cn4c
垢版 |
2022/06/23(木) 21:32:27.41ID:m7vQCh0J
いよいよ Java のクラスライブラリを C++ に移植しようと思っていますが、需要はありますか?
そろそろ共通のクラスライブラリが確立されてもいいと思っているのですが、あまりそんな話がないのが不思議です
0285デフォルトの名無しさん
垢版 |
2022/06/23(木) 22:23:51.49ID:R7SBWA0E
需要あるのでよろしくお願いします
0287デフォルトの名無しさん
垢版 |
2022/06/23(木) 22:59:01.86ID:lRxLFmXq
stdやboostじゃ不足か?
0289デフォルトの名無しさん
垢版 |
2022/06/24(金) 00:00:51.28ID:KtheM8QT
>>287
OO な各言語で名前と機能が共通するライブラリの必要性を痛切に感じているのです
提供されるクラスライブラリが共通であれば、各種言語の純粋な潜在的能力に応じた評価が可能となります
0293デフォルトの名無しさん
垢版 |
2022/06/24(金) 10:44:21.40ID:K2we1Lar
お願いですから名前は短くしてくださいね
0294デフォルトの名無しさん
垢版 |
2022/06/24(金) 13:31:54.09ID:dbAYBMOA
>>282
template <typename T> を template <class T> と書いただけでジジイ呼ばわりするようなもんだぞ
誰もtypoの話なんかしてない
あ、1人だけいるのかw
0296はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/24(金) 15:47:15.76ID:STd+R5JH
>>295
いいえ。 少なくとも ISO の規格としては最初から有りますし (型引数のところに書く分には) 機能的な差もないです。
だから、 >>294 は単なる表記の揺らぎにすぎない (どちらが間違いというものでもない) 例として出しているんだと思います。
0297デフォルトの名無しさん
垢版 |
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>という書き方しかできなかった
0298デフォルトの名無しさん
垢版 |
2022/06/24(金) 21:00:22.61ID:VuV41aeC
三十年くらい前にC++primerだったかな?
「typenameとclassならclassのほうで書いとけ、
なぜならタイプ数が少ないから」
みたいに書いてるところがあって(半分ジョークなんだろうな)
最初にそれで刷り込まれてるからclassでしか書いたことない
0300デフォルトの名無しさん
垢版 |
2022/06/24(金) 22:03:13.47ID:JvzMg+3d
C++ってstaticメソッド継承されますっけ?
Parent.Hoge()ってChild.Hoge()としても呼べます?

あるスクリプト言語を使ってた時にどうやら継承されてなかったようで、言語ごとに違うのか気になりました
0302はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/06/24(金) 22:31:13.16ID:STd+R5JH
型引数は class と書いてあってもクラスに分類されない型 (スカラ型など) を受け取れるのでなんか変な気分ではあるな……。
それでも私は class キーワード派だけど。
0303デフォルトの名無しさん
垢版 |
2022/06/24(金) 22:46:12.30ID:TGTBUWMm
modern C++ designの著者は、ユーザー定義型のみを想定してる場合はclass,
組み込み型も想定してる場合はtypenameにしてると書いてたな
0305デフォルトの名無しさん
垢版 |
2022/06/25(土) 10:55:48.71ID:23CjKpU2
>>300
private とか protected とか知ってるか
0306デフォルトの名無しさん
垢版 |
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();}
0308デフォルトの名無しさん
垢版 |
2022/06/25(土) 13:43:07.60ID:xaZtK0Rm
>>307
class継承のpublic忘れるとエラーになるよと言う話
2箇所あるpublicのどっちか消してみなよ
0310デフォルトの名無しさん
垢版 |
2022/06/25(土) 13:48:22.71ID:23CjKpU2
publicつけ忘れで
0311デフォルトの名無しさん
垢版 |
2022/06/25(土) 13:49:20.71ID:23CjKpU2
>>309
staticもつけ忘れたのか
どんくさいなお前
0312デフォルトの名無しさん
垢版 |
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で激速化することを極めんとしているわけや;;;
0313デフォルトの名無しさん
垢版 |
2022/06/25(土) 17:47:57.25ID:x+PfXs9r
それと>>279の口ぶりでは数論変換にしたら桁違いに早くなるみたいに読めるが
double同士の掛け算2^15回分が
int64同士の掛け算2^15回分に高速化される程度であって現行のレコード145 秒が100 秒切れるようになるか
っていうとビミョー

はい論破、
0318デフォルトの名無しさん
垢版 |
2022/06/25(土) 19:23:01.22ID:/zwkJ/mi
>>314
なんできゅうにそこのtypenameの話しだすの?
単に型パラメータんとこの話をずっとしてたんやないん今まで
0323デフォルトの名無しさん
垢版 |
2022/06/29(水) 12:39:09.60ID:CyBPFABm
>>300
>C++ってstaticメソッド継承されますっけ?
継承と言うか「可視」ではある。

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

でも微妙だな、Child::Hoge()で呼び出せるかどうか、実験の必要はある。
0327デフォルトの名無しさん
垢版 |
2022/07/03(日) 05:57:55.66ID:S0pZ0Csa
C++コンパイラっていつからconst char*型引数がbool型引数に暗黙変換されるようになったんだ?
以下のような内容が警告なしでコンパイルできてしまうんだが

int foo(bool bar);

const char* ptr = "test";
foo(ptr);
0328デフォルトの名無しさん
垢版 |
2022/07/03(日) 07:53:18.35ID:K2/9xttr
スカラ型がboolに暗黙変換できるのは太古から変わってない

int (*p)(bool) = foo;
std::cout << foo; //出力は「1」だがfooが1番地から開始ということではない
0330デフォルトの名無しさん
垢版 |
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ポインタ関連の記述をコメントアウトさせると普通に動作するので、大まかなコード自体は問題ないと思うのですが……
リインタプリットキャストも出来ず困り果てておりますが、名前空間内部のメンバにポインタは持たせない方がいいのでしょうか?
それとも名前空間での不完全クラスでの定義がまずいんでしょうか?

ほとほと困り果てております。
わかる方がいらっしゃいましたらお教えいただけれう゛ぁ……
先感謝!
0333デフォルトの名無しさん
垢版 |
2022/07/04(月) 17:28:39.11ID:nt0V70V1
どっかで
namespace hoge{
class member_ptr;
}
class member_ptr;
みたいなことやってるような気がする

前方宣言(か実体定義)が別の名前空間にあって、同じclassを見てるつもりで別のclassを見ているだけじゃない?
0334デフォルトの名無しさん
垢版 |
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;
}
//↑この定義部分で「宣言に互換性がありません」というエラーが出てしまいます
0335はちみつ餃子 ◆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 とは別物なので別物というエラーになるわけ。
0339デフォルトの名無しさん
垢版 |
2022/07/04(月) 19:27:20.38ID:KuJlBNV3
>>335!336,338
ありがとうございます!

おっしゃる通りに名前空間の外で前方宣言し、ソース部分で定義したらうまくいきました!
特に理由がない限り、名前空間内部で定義してはいけない(戒め)
ありがとうございました!
0340デフォルトの名無しさん
垢版 |
2022/07/05(火) 15:17:54.21ID:CUrAgxNd
有害だな
0342デフォルトの名無しさん
垢版 |
2022/07/05(火) 23:44:59.73ID:tIUWM2dq
VB.NETからバイナリをC++(JNI)に渡して受け取ったバイナリをJavaに渡したいんですけど、C++で受け取ったBYTEをjobjectに変換する方法が分かりません。
どなたかご存知でしょうか。
0343デフォルトの名無しさん
垢版 |
2022/07/06(水) 23:58:31.79ID:Hb7nTur+
C++勉強中です。ムーブコンストラクタについて教えてください。
ムーブコンストラクタは、要はムーブ元の指すポインタをムーブ先に変更しているだけだと思います。
これはconstなしコンストラクタでも実現できると思いますが、意図を明示するためにコンストラクタが分かれていると思っていいですか?
また、ムーブコンストラクタの仮引数が右辺値参照になっている(std::moveした右辺値を渡す)理由がよく分からないのですが、これは決まり文句として覚えるしかないでしょうか?
0344デフォルトの名無しさん
垢版 |
2022/07/07(木) 00:12:38.45ID:wEF1aVE0
>>343
まさにその発想で作られたauto_ptrとかいうスマポ(廃止済み)がとんでもねえゴミカスだったから
その教訓でコピーとムーブが分けられたんだよ
0345デフォルトの名無しさん
垢版 |
2022/07/07(木) 00:13:26.51ID:owvrtcUU
ムーブって、所有者が移転してると考えた方が
場所なんてどうでもいいでしょう
0346はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/07/07(木) 00:38:46.12ID:6JbvD3+y
>>343
右辺値は大抵の場合に一時オブジェクトだからどうせすぐに破棄される。
後で別の場所で使うということがないと期待できるから内容を移動してしまっても問題にならないんだ。
だから右辺値を入力とするときは原則としてムーブ扱いにする。
0347デフォルトの名無しさん
垢版 |
2022/07/07(木) 08:00:15.88ID:dqsYDet1
多分、右辺値参照イコールmoveと覚えてしまってるのでは?
C++11より前は一時オブジェクトとそうでないものを文法上区別することが出来なかったのよ
moveはあくまでキャストに過ぎない、一時オブジェクトでないものを一時オブジェクト扱いにしてるだけ
0348343
垢版 |
2022/07/07(木) 23:27:53.10ID:jxXWRXC4
一時オブジェクトにキャストしてすぐ破棄されるようにしたと言っても、
右辺値参照に代入しているのでヌルポインタにするまでは使い続けられますよね
そもそもstd::moveで一時オブジェクトにキャスト、これを右辺値参照で束縛して有効期間を延ばす…って
初めから普通の変数を使えばいいのでは?と思ってしまいました
ムーブを表すための仕組みとして&&とstd::moveの組み合わせが追加されたということなんでしょうかね
0349デフォルトの名無しさん
垢版 |
2022/07/07(木) 23:44:43.71ID:a8KVNXrY
>>348
結局そのあたりも含めてC++で複雑化した様々な点を全てシンプルに綺麗に整理し直して分かりやすくした言語が望まれてRustが登場したんだろうね
0351はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/07/08(金) 00:21:33.36ID:5BE4kGYi
>>348
何を言いたいのか全然わからない (仕組みを間違って理解しているか用語が誤っているかしている) ので
もうちょっと具体的に実例か何かで示してみて。
0353デフォルトの名無しさん
垢版 |
2022/07/08(金) 08:04:48.18ID:0Bd0SGWI
ムーブは「所有権」をムーブさせるものなので、所有権という概念がないと理解できん
0354デフォルトの名無しさん
垢版 |
2022/07/08(金) 08:29:23.83ID:ZqNcNR35
>>349
引数渡しのデフォルトをmoveにしているのは失敗だと思うけどな。
性能優先でそうしたんだと思うけど、そういった技術的説明無いから設計ミスにしか見えない。
0355デフォルトの名無しさん
垢版 |
2022/07/08(金) 09:59:25.74ID:XQyLgyG5
>>354
あれは大正解
実際に色々なプログラミングをするとよくわかってくる
Rustは上手く設計されていることがわかる
0357デフォルトの名無しさん
垢版 |
2022/07/08(金) 10:20:08.07ID:u/BCh/UE
右辺値参照って概念的に難しいよね
そもそも右辺値とはなんぞやというところから、一時オブジェクトの生成とそれが破棄されるまでのコンパイラ側の仕組みを的確に理解する必要がある
こんなのよく思いついたなと感心はするけどw
0358デフォルトの名無しさん
垢版 |
2022/07/08(金) 10:47:23.92ID:lp4DRBe8
テンプレート関数で頻繁に出現する=演算子コピーによるオーバーヘッドを減らす必要に迫られただけの話ジャマイカ?
0359デフォルトの名無しさん
垢版 |
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/
0360デフォルトの名無しさん
垢版 |
2022/07/08(金) 12:00:52.61ID:u/BCh/UE
>>353
「所有権」って言っちゃうと誤解を生むような気がする
実体としてはデストラクタを呼ぶ権利だよね
インスタンス自体は(通常)スタック上に確保されているので、その所有権の移動まではできない
だからこそ「参照」なんだけども
0362デフォルトの名無しさん
垢版 |
2022/07/08(金) 15:16:55.64ID:bBPWEvXX
>>355
移譲にした方が嬉しい例を示してくれ。
C++なら引数渡ししてもオブジェクトは手元に残るのが常識だから、Rustがわざわざ移譲デフォルトにしているのは違和感しかない。実際、Rust習得の最初の難関が移譲だし。

>>360
本当は「所有権」じゃなくて「管理責任」だからな。スマートポインタとか所有していないリソースの管理とかやらされるし。
0363デフォルトの名無しさん
垢版 |
2022/07/08(金) 16:27:06.32ID:VZayErSn
>>362
移譲という概念はない
C/C++もRustも同じで&を付けて&varnameの形で渡せば参照渡しとなる
同じ形なので全く違和感はない
所有権を手放さないで渡すには参照渡ししかないのだからその場合は&を付ければよい

もちろんプログラミング言語によって異なる部分もあるのは当然
そんな些細なことを違和感と言うのは極少数の類似言語しか知らないと言ってるようなもの
0364デフォルトの名無しさん
垢版 |
2022/07/08(金) 16:46:29.18ID:MdbO63iw
まあ所有権というよりは「後始末をする義務」だよな
日常的にポイ捨てしてるモラルの低い人間にはピンとこないかもしれない
0366デフォルトの名無しさん
垢版 |
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での引数などの渡し方の表記方法は上述のようになっている
0367343
垢版 |
2022/07/09(土) 00:02:30.53ID:h3YKvoyj
理解してから質問させてもらったつもりなんですが、まだ全然だったようです
確かに所有権という概念を理解していません
勉強してから出直します
ありがとうございました
0368デフォルトの名無しさん
垢版 |
2022/07/09(土) 00:12:24.76ID:GNVCknQf
void君復帰したん?
0370デフォルトの名無しさん
垢版 |
2022/07/09(土) 10:56:35.87ID:xh0VR/GV
>>367
というより、コードが実際にどういう動作になるかがわかってない感じ(それこそC言語レベルの基本のところ)
もっと書いて実験した方がいいよ
0371デフォルトの名無しさん
垢版 |
2022/07/09(土) 11:11:15.93ID:tUS5A0PY
move の挙動を「C言語レベルの基本の」サンプルコードで理解できたら画期的だなあ笑
0373デフォルトの名無しさん
垢版 |
2022/07/09(土) 12:51:52.12ID:l8dyP7Xp
エアプだろお前ら
>>348辺りから読み直せ
一時オブジェクトの破棄とか裏で何が起こるかの超基本が理解できてないから
あくまで文法上のことに過ぎないmoveと破棄をごっちゃにしてると言ってる
0374デフォルトの名無しさん
垢版 |
2022/07/09(土) 12:55:08.37ID:GKrnmeJx
所有権ってデストラクタで破棄する義務を負う、権利とは名ばかりな概念でしょ
0376デフォルトの名無しさん
垢版 |
2022/07/09(土) 13:45:41.58ID:CWVMe8St
自分から破棄しない限りはアクセスできることが保証されるから権利ではあるな
0379デフォルトの名無しさん
垢版 |
2022/07/09(土) 16:17:17.24ID:vntA8Dp0
>>376
他からアクセスできることが保証されなければバグってすべておじゃんなのだから
>>376の権利は有難がっても仕方が無い
0380デフォルトの名無しさん
垢版 |
2022/07/11(月) 10:49:23.74ID:1W23UOpt
>>358
ほんそれ
0381デフォルトの名無しさん
垢版 |
2022/07/11(月) 10:51:27.98ID:1W23UOpt
>>364
ほんそれ++
0383デフォルトの名無しさん
垢版 |
2022/07/16(土) 16:37:55.35ID:scS6hSP+
condition_variableってなんでわざわざmutexと一緒に定義しないといけないの面倒でしかたないんだけど。
しかもへんてこな目覚めがあるなんてバグを平然と放置してるし。
win32のSetEvent()のほうが俄然使いやすいんだけど。
0384はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/07/16(土) 17:49:19.54ID:cnHD4OK4
mutex は排他の仕組みであって同期の仕組みと分離する思想なんじゃないかなぁ……。
あんまりイケてないとは思うけど。
0385デフォルトの名無しさん
垢版 |
2022/07/16(土) 19:38:19.38ID:UNJL4ykU
それはOSの問題なうえ、充分合理的な動作と認められている。
0386デフォルトの名無しさん
垢版 |
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にやらざるおえないから、ミューテックスのブロック内でイベントの待機とセットを行わねばならない仕様に、
なったと思う
0387デフォルトの名無しさん
垢版 |
2022/07/16(土) 21:20:57.63ID:ucdNPaM6
それ隠蔽できるだろうけど、条件変数の基本要素がそれなんだからそういうもんです。
0388デフォルトの名無しさん
垢版 |
2022/07/16(土) 21:25:01.45ID:cotnetTK
しかしまあ普通にスレッドの中にイベント待ちを作ったら、
イベント要因は
(1) 本来のイベントの意味(複数かもしれん
(2) スレッド終了
の2種類は必ず生じるけどこのために2種類以上のイベントオブジェクトを設けてWaitForMultipleObject()で待機するのは
アフォらしいので結局条件変数的に、イベントオブジェクトは1個、イベント要因を表す変数が1個、みたいな形になって
条件変数と同じようなしくみに落ち着く
、希ガス
(ただしイベントオブジェクトとイベントを待つスレッドの実体が完全に1対1ならミューテックスによるガードは不要
0390デフォルトの名無しさん
垢版 |
2022/07/16(土) 22:02:42.26ID:cotnetTK
イベント要因が3種類以上とかイベント発生と待機解除が必ず1対1でなければならない、みたいなケースを含むちょう一般論で言うとそうかorz
0392デフォルトの名無しさん
垢版 |
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)ならそういう問題が無い
0393デフォルトの名無しさん
垢版 |
2022/07/17(日) 03:32:35.77ID:RIt+yucv
バトン持ってるやつが偉いというのはいいとして、バトンを途切れなく渡すための仕組みが要るんじゃ
0394デフォルトの名無しさん
垢版 |
2022/07/17(日) 11:47:51.28ID:sgfC4LCK
>>383
実際まあ面倒くさいよな。
最近は後で書き直すつもりでとりあえずスピンしてatomic_bool待つコード書いてしまってるわ
0395デフォルトの名無しさん
垢版 |
2022/07/21(木) 12:23:18.60ID:eB2QSMyp
>>388
>>392

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

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

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

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

以上
0396デフォルトの名無しさん
垢版 |
2022/07/26(火) 01:16:01.56ID:DHatjrG/
基底クラスのprivateメンバと、private継承された基底クラスのpublicメンバって派生クラスから見たら同じじゃないんでしょうか?
前者は派生クラスからアクセス不可で、後者は派生クラスからアクセス可能なようです
というとこは意味が違うんでしょうが調べでもよく分かりませんでした
どなたか教えてください
0397デフォルトの名無しさん
垢版 |
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のアクセスに制限はない。
0399デフォルトの名無しさん
垢版 |
2022/07/27(水) 00:43:24.02ID:YyifIEEo
>>397
class Bをprivate継承したことで、b2はclass Cのprivateメンバになるということですね
理解しました、ありがとうございました
0401デフォルトの名無しさん
垢版 |
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だとコンパイルエラーになります。
どのような違いがあるのでしょうか?
0402デフォルトの名無しさん
垢版 |
2022/07/29(金) 02:07:00.18ID:drZ02Ew4
>>401
キャストが原因でコンパイルエラーが出てるわけではないです

簡単に言うと②の右辺は rvalue なので非 const lvalue に束縛できません
0403デフォルトの名無しさん
垢版 |
2022/07/29(金) 08:15:31.60ID:FIiQg0BH
>>401
値へのキャストは、一時オブジェクトを作り必要ならコンストラクタを実行する
参照へのキャストは、一時オブジェクトを作らない

ただしconst修飾された参照と右辺値参照の場合はこの限りでない
0404はちみつ餃子 ◆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);
}

注意点として、
本来なら一時オブジェクトは式の終わりに解体されるので参照が無効になりそうなもんだが
参照で受けている場合はその参照の寿命と同じ分だけ延命される特例がある。
0405デフォルトの名無しさん
垢版 |
2022/07/29(金) 10:44:28.57ID:nIcw6oQb
>>396
違うに決まってるだろ
0406デフォルトの名無しさん
垢版 |
2022/07/29(金) 11:30:48.51ID:FIiQg0BH
俺が言ったのはこれのこと

struct base
{
base(int);
};

int main()
{
static_cast<base const&>(1);
static_cast<base&&>(1);
}
0407デフォルトの名無しさん
垢版 |
2022/07/30(土) 21:44:57.83ID:Ejgi0TIU
コンストラクタの最適化(によるコンストラクタ呼び出し自体を削除)は
コピコンだけが適用?
0409デフォルトの名無しさん
垢版 |
2022/07/31(日) 13:35:39.44ID:VcJyNGFX
じゃあ>>406 のコードでは
コンストラクタの呼び出しだけは保証されて、
その後のコピーやムーブは保証されない動きになる?
0411デフォルトの名無しさん
垢版 |
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万円の支援金を支給
0412デフォルトの名無しさん
垢版 |
2022/08/03(水) 14:12:19.69ID:Y5L3Fd0k
練習でオブジェクトデータベースもどき を書いたらGITHUBに送ったのになんか反映されない。

がーん!!
0414デフォルトの名無しさん
垢版 |
2022/08/04(木) 00:40:10.66ID:s3oOei4P
コンストラクタって本当に戻り値無いんですか?
例えば
MyClass c = MyClass();
としたとき、cにはMyClassのコンストラクタで生成されたインスタンスが格納されます
戻り値が無いのになぜそうなるのでしょうか?
0415はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/04(木) 01:26:43.48ID:hPtMGH66
>>414
それは明示的な型変換 (関数記法) という規則で示されている。
https://timsong-cpp.github.io/cppwp/n3337/expr.type.conv
見かけ上は普通の関数呼出しと区別がつかない記法を使うけれど関数呼出しではない。

クラス名を関数風に使ったらコンストラクタで構築したオブジェクトを (あたかも関数の返却値のように) 返すことになっているというだけなんで、
まあそういう仕様なのだと覚えてもらうしかしょうがない。
コンストラクタは特別な地位にあって色々と特別な規則があるんよ。
0416デフォルトの名無しさん
垢版 |
2022/08/04(木) 01:47:34.25ID:s3oOei4P
>>415
ありがとうございます
そういう仕様だと覚えることにします

ついでで申し訳ないんですが、コンストラクタと明示的な型変換って同じものなんですか?
MyClassA a;
MyClassB b = MyClassB(a);
としたとき、コンストラクタはMyClassBの関数ですが、明示的な型変換はa(MyClassA)の関数ですよね?
0417はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/04(木) 02:30:19.53ID:hPtMGH66
>>416
> コンストラクタと明示的な型変換って同じものなんですか?

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

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

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

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

何がいいたいのかわからない。
MyClassB と書いてあるのに何故か MyClassA のなんらかのメンバ関数が呼ばれると思っているということ?
どうしてそう思ったのかもうちょっと詳しく説明してみて。
0418デフォルトの名無しさん
垢版 |
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のメンバ関数であるコンストラクタを呼び出しているのと見分けがつかないので、疑問に思いました
0420はちみつ餃子 ◆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 が呼ばれてから初期化される。
0421デフォルトの名無しさん
垢版 |
2022/08/04(木) 12:25:40.96ID:YlkBTNtd
職業としてc++を使用してる人に聞きたいんだけど
設計者がどう動作するか分かってないコードが含まれる製品が出荷されてるのっておかしくない?

しかもその担当は、俺あんまりパソコン得意じゃないって。
そんな人間が書いてるソフトをお金を出して買ってくださってるお客様に言えるかよ、馬鹿なのかな
0423デフォルトの名無しさん
垢版 |
2022/08/04(木) 12:49:09.16ID:iuI8tOa1
自社製品のすべてをわかっている事業者なんてないよ
もしものためにお客様相談窓口あるわけだし
0424デフォルトの名無しさん
垢版 |
2022/08/04(木) 12:58:24.87ID:YlkBTNtd
>>423
そう言うことではない。
では、あなたに聞きたい
車を買いに行って、ディーラーの人に「このボタンなんですか?」と質問して「押してみないと分からない」なんて答えたらどう思いますか?

ディーラーが設計してるわけではないことくらい誰でも知ってるけど、ここで買っていいのか?って思いませんか?
0425デフォルトの名無しさん
垢版 |
2022/08/04(木) 13:09:55.40ID:4HLZV6kX
>>421
C++使いはPCのパワーユーザーとは限らんよ
それにPCだって無数の技術が詰め込まれていて
たとえるなら1つの大学のようなもので
迂闊に「俺はものすごくPCに詳しいんだ!」なんて言うと
ほぼ100%恥かくしな
0430デフォルトの名無しさん
垢版 |
2022/08/04(木) 19:04:48.18ID:4E08n67o
>>420
解決規則が知りたいと思ったのですが状況によって難しそうですね
混乱してきたので整理して考え直します
ありがとうございました
0431デフォルトの名無しさん
垢版 |
2022/08/04(木) 19:32:37.46ID:YMWE04jW
>>428
マジで言ってるならもう少し勉強してきた方がいい
ボタンの操作とかのように取説に載ってるのは外部仕様
>>421はそういう話じゃない
原理はわからなくてもテストちゃんとしとけばいいという世界もある
0432デフォルトの名無しさん
垢版 |
2022/08/04(木) 20:58:43.21ID:msSueNHM
windows作ってる開発者や営業にメモ帳のショートカット全部言えるか聞いてみればいいんじゃね?
外部仕様すら知らんの?馬鹿なのかなって
0433デフォルトの名無しさん
垢版 |
2022/08/04(木) 21:17:24.76ID:isEYuHXY
「メモ帳のショートカットを言え」がなんのことやらわからない。
0434はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/04(木) 21:27:41.19ID:hPtMGH66
最大限にエスパー能力を発揮してアクロバティックに解釈するとテキスト形式のファイルのことではないかと思う。
デフォルトだとメモ帳に関連付けられているからテキスト=メモ帳という認識が出来上がる可能性はある。
0435デフォルトの名無しさん
垢版 |
2022/08/04(木) 21:36:35.22ID:isEYuHXY
関連付けされた拡張子の話をしてるのかな?
それでもあとからインストールされたものでコロコロ変わるから、意味不明だな。
0436デフォルトの名無しさん
垢版 |
2022/08/04(木) 21:58:15.71ID:msSueNHM
メモ帳はnotepad.exe、ショートカットはキーボードショートカットの意味だがそれすら想像つかないなんてずいぶん頭が悪いな
パソコン得意じゃないのはお前のことじゃん
0437デフォルトの名無しさん
垢版 |
2022/08/04(木) 21:59:21.33ID:isEYuHXY
>>436
Windowsのショートカットはそういう意味じゃない。
0438デフォルトの名無しさん
垢版 |
2022/08/04(木) 21:59:22.67ID:Xd358RP3
ショートカットキーのことでは?
0439デフォルトの名無しさん
垢版 |
2022/08/04(木) 22:00:54.91ID:isEYuHXY
>>438
そんなのわかっているが、彼の略語が自分にしかわからないから問題にしている。
0440デフォルトの名無しさん
垢版 |
2022/08/04(木) 22:04:19.71ID:isEYuHXY
>>438
メモ帳にショートカットキーは割り当てられていない。
メモ帳を起動する方法の種類を言っているんだろう。
0441デフォルトの名無しさん
垢版 |
2022/08/04(木) 22:05:15.46ID:isEYuHXY
自分のPCの設定をデフォルト設定だと思っているジジイだろうな
0442デフォルトの名無しさん
垢版 |
2022/08/04(木) 22:05:56.15ID:isEYuHXY
変なのいくらでもいるんだなと思った
0443デフォルトの名無しさん
垢版 |
2022/08/04(木) 22:06:10.34ID:Xd358RP3
争いが起きるのは霊的な問題もあると思うんですよね。
先日亡くなられた安倍元総理も生前大切にされていた霊験あらたかな壺があるそうなんですよ。
ただ、とても値が張るそうで、安いものでも3000万を下らないそうなんです。
そこで、5ch有志でお金を出し合って共同で購入しませんか?
そうすればスレも安定すると思うんです。
0444デフォルトの名無しさん
垢版 |
2022/08/04(木) 22:17:42.40ID:isEYuHXY
Windowsのファイルの種類のひとつが「ショートカット」というのがわからなくなって、Windowsそのもののことがわからないのに知ったかぶりで物を言う認知症のじいさんなんだろ。
0447デフォルトの名無しさん
垢版 |
2022/08/04(木) 22:24:31.32ID:YMWE04jW
>>432
そらで全部言える必要ないだろ
開発者なら外部仕様にアクセスできるだろうから一覧くれって言えば出すことはできるだろ
0448デフォルトの名無しさん
垢版 |
2022/08/04(木) 22:27:08.73ID:isEYuHXY
メモ帳にショートカットキーがあるという架空の設定で話していてもよくわからない。
0449デフォルトの名無しさん
垢版 |
2022/08/04(木) 22:42:58.32ID:142AVZpN
F5で現在時刻入力とかCtrl+Gで行番号指定ジャンプとかCtrl+-/+/0で縮小・拡大・元に戻すとかの
メモ帳のキーバインドのことなんじゃないのどうでもいいけど
0450デフォルトの名無しさん
垢版 |
2022/08/04(木) 23:10:21.02ID:isEYuHXY
>>449
メモ帳そのもののことを言っていたわけか。メモ帳を使っている人間がどれだけいるのか疑問だけど。
0452デフォルトの名無しさん
垢版 |
2022/08/04(木) 23:42:02.70ID:CV93jyTL
というか、あれってエディットコントロールの機能ですよね
エディットコントロールのソースってどっかでみることが出来ますかね?
0453はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/04(木) 23:54:18.07ID:hPtMGH66
Windows のソースコードは一部の政府機関や学術機関と契約を結んで提供している事例はあるが、
個人で見せてもらえるようなもんじゃないよ。
あえて言うなら ReactOS (Windows 互換の OS を目指すオープンソースプロジェクト) が参考になるかもね。
0454デフォルトの名無しさん
垢版 |
2022/08/06(土) 14:19:53.03ID:eSBCWCwI
>>415
MyClass a();
MyClass & b = MyClass();
const MyClass & c = MyClass();
MyClass d = MyClass(); ← コピーコンストラクタ発動?
それともムーブ?
0456デフォルトの名無しさん
垢版 |
2022/08/06(土) 15:11:57.86ID:eSBCWCwI
>>421
javascriptやelectronやphpやvb/vbaの方が判ってない人が描いてる確率は高い
0457デフォルトの名無しさん
垢版 |
2022/08/06(土) 15:16:10.01ID:eSBCWCwI
>>449
最近覚えたのは Win+G ですね判ります
0458デフォルトの名無しさん
垢版 |
2022/08/06(土) 15:17:59.77ID:eSBCWCwI
>>449-450
ああそれで
「押してみないと判らない」
って話が出て来たのか
普通の人間なら闇雲に押すんじゃなくて
押す前にマニュアルやヘルプファイル読むだろうな
0459デフォルトの名無しさん
垢版 |
2022/08/06(土) 15:44:10.54ID:xsmVc9Uv
GUIでキー操作というのは矛盾も含んでいるんだけどな
0460はちみつ餃子 ◆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();
}
0462デフォルトの名無しさん
垢版 |
2022/08/07(日) 09:01:37.78ID:5PDs1Uf6
むかしまだMacOSが漢字TalkだったころにMacキチガイの知りあいが
「Windowsなんて駄目だよ、だいたいマウスにボタンが2つあるみたいなシンプルさを欠く設計な上に
なにかとキーボードを併用しないといけない、GUIとして未完成といわざるをえない(キリッ」とかいいながら
Macでマウスボタンとコマンドキーやらシフトキーのコンビネーションをものすごい熟練の手付きで操作していたのが印象的だった
0463デフォルトの名無しさん
垢版 |
2022/08/10(水) 19:17:19.29ID:0w2i6tTa
windows10でスタートメニューを非表示にしたいのですが良い方法ないですかね?
スタートメニューのHandleを取れれば良いのですが、、。
ネットでいろいろ調べましたが見つけたサンプルコードは、windows10では動きませんでした。
0465デフォルトの名無しさん
垢版 |
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にするとコンパイルエラーになるので違うようです。
インスタンス生成の{}を()に変えるとコンパイルできなくなるのでそれもどうしてか知りたいです。
0466デフォルトの名無しさん
垢版 |
2022/08/11(木) 00:36:21.03ID:sYNKGRSM
struct myClass
{
int x;
int y;
};

int main()
{
struct myClass c = { 100, 200 };
}
と同じ理屈じゃね?
0470デフォルトの名無しさん
垢版 |
2022/08/11(木) 09:13:13.76ID:7cUH/Z7I
建増しでやってきた言語だからしょうがないけど初期化の方法がやたらいっぱいあって混乱する
0471はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/11(木) 10:28:32.68ID:5k4DsUHs
>>465
集成体初期化 (Aggregate Initilization) に該当する。
クラスが一定の条件を満たしたときに集成体の扱いになる。
文法表記を似せているだけの別物と思った方がいいかも。

ちなみに C++20 からは丸括弧でも集成体初期化が出来るようになってるよ。
0472デフォルトの名無しさん
垢版 |
2022/08/11(木) 16:39:22.98ID:8ZZGyUVA
>>466-467, >>471
ありがとうございます
C言語の構造体の初期化と同じですね
後方互換を保つために残してるような気がしました
コンストラクタ定義が無いときしか使えないんですね
0473デフォルトの名無しさん
垢版 |
2022/08/15(月) 03:58:18.08ID:NUjkjU1P
皆さんにお聞きしたいんですけど
inline展開しまくることによる弊害って主になんでしょうか?
0476デフォルトの名無しさん
垢版 |
2022/08/15(月) 06:06:45.25ID:y6q1hWI/
もうデメリットはなくなって来たな
実際のコンパイラもデフォでinlineぽい動きするし
ただの開いたサブルーチンというだけでなく定義の統合がありがたい
0477デフォルトの名無しさん
垢版 |
2022/08/16(火) 10:58:28.11ID:2x3mrzZQ
デバッグが面倒臭くならない?
そうだあれか
リバエンし難くする効果があるとか
0478デフォルトの名無しさん
垢版 |
2022/08/16(火) 11:14:28.05ID:NN3FHXHG
インライン展開するとスタックトレースで関数名が出なくなりますか?
0479デフォルトの名無しさん
垢版 |
2022/08/16(火) 14:07:30.89ID:GaLydNkX
>>478
コンパイラにもよると思うけど
おそらく出なくなると思います!
0480デフォルトの名無しさん
垢版 |
2022/08/16(火) 14:11:45.62ID:GaLydNkX
>>474-475-476-477
なるほど…
0481デフォルトの名無しさん
垢版 |
2022/08/16(火) 14:16:34.26ID:GaLydNkX
c++ってまだまだ需要あると思いますか?
私はあるかなと思うんですけど...意見ください。
0482はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/16(火) 14:22:21.76ID:+o+ePBjP
何年も前だがインライン展開の基準を指定する GCC のオプションで
めちゃクソに緩めの数値を指定 (つまりインライン展開されまくる) して
ベンチマークをとった記事が話題になったような覚えがある。

結論を覚えてないし、どこで見たのかも覚えていないので役に立たん話ですまぬ。
0483デフォルトの名無しさん
垢版 |
2022/08/16(火) 14:48:39.55ID:oZyv9MO8
>>481
C++は需要が減り衰退していく
昔はともかく現代の視点からは、設計が悪くそこへ建て増しを繰り返しているため、言語として劣っていて使いにくい
そのため次第に既存システムの保守がメインの言語となっていっているが、それさえGoogleの発表したCarbonのような言語の方がプログラマーにとってもありがたい
もちろんそのCarbonでさえそのFAQにこれはあくまでも既存の保守用の言語でと書かれている
0485デフォルトの名無しさん
垢版 |
2022/08/16(火) 15:07:03.88ID:2x3mrzZQ
>設計が悪くそこへ建て増しを繰り返している

言語仕様がそうなっていることは認めるが
設計が悪い部分は無理して使わず良い部分だけ使えば良い話でもある
0487デフォルトの名無しさん
垢版 |
2022/08/16(火) 15:24:11.24ID:n8xVLVvG
>>481
需要で言えばCOBOLでさえ無くなっていないからなぁ。

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

個人的にはRustを参考にした初心者向けのサブセットC++か、Rustの複雑さをマイルドにしたスタックフレーム指向の新言語が出てくると思う。
0489デフォルトの名無しさん
垢版 |
2022/08/16(火) 15:57:43.55ID:bqAknUU+
>>487
誰が見てもC++よりRustの方が言語仕様も小さいしシンプルで洗練されていて学習しやすいよ
これは両方を使っている人なら必ず分かるから>>487は知らないものを妄想で語っている?
ちなみにRustはコンパイラによるアドバイスが非常に親切でプログラミング言語の中でもトップクラスな点でもC++との差異が大きいね
0490はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/16(火) 16:21:45.34ID:+o+ePBjP
どうだろうなぁ。
C を学んでいる人が多かったというところから実務に使いながら少しづつ C++ に習熟していくという動線があったわけで、
C という前提が崩れたら Rust のほうが合理的に設計されていて楽かもしれないとは思う。
ただ、その一方で C++ が消えてなくなるほど劣勢になる気はしないんだよな。
0491デフォルトの名無しさん
垢版 |
2022/08/16(火) 16:38:57.39ID:GaLydNkX
c++とかcやってからじゃないと到底無理
ってよく聞くんですけど
どういうことですかね?
0492デフォルトの名無しさん
垢版 |
2022/08/16(火) 16:39:15.94ID:uEezmwqj
class b:a{};
class a{};
このコードはコンパイルできませんが、aを前方宣言せずにコンパイルを通す方法ってありますかね?
0493デフォルトの名無しさん
垢版 |
2022/08/16(火) 17:52:12.39ID:2x3mrzZQ
1.
class a;
class b:a{};
class a{};

2.
class a{};
class b:a{};
0494はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/16(火) 17:53:02.94ID:+o+ePBjP
>>491
個々のルールを頭に詰め込むだけってのはしんどい。
思想に沿うように個々のルールが制定されているので思想が分かればある程度はルールの想像がつく。
低レイヤで何が起こるかある程度は認識していると思想が把握しやすい。

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

ただ、 C++ の「汚くていいんだ」というのもそれはそれで優しい世界なので私は好きだよ。
0495デフォルトの名無しさん
垢版 |
2022/08/16(火) 19:22:32.37ID:wpAgGEI5
>>489
初心者からすればC++とRustの差なんて無いに等しい。コード1行書くのにいくつのルールを守る必要があるんだよ。
シンプルで洗練されている言語が初心者に良いというなら、RustよりFORTH(とその末裔)の方が初心者にふさわしいと思うわ。
0497デフォルトの名無しさん
垢版 |
2022/08/16(火) 22:17:19.28ID:bk3ffD66
>>495
FORTHはCと同等の速さを出せないし問題のすり替えはみっともない
RustはCと同等の速さを出しつつ現代的なプログラミングしやすい様々なパラダイムを洗練してシンプルにまとめている
FORTHを入れてC/C++/Rustの四者で比較してもRustがプログラミング効率も良いと同意できるだろ
0498デフォルトの名無しさん
垢版 |
2022/08/17(水) 02:44:27.88ID:C+o8slGL
夏厨って夏に湧いて出る厨房の事を指す言葉だったはずだけど
その厨房も今じゃ中年おじさんなんだよな
0500デフォルトの名無しさん
垢版 |
2022/08/17(水) 05:49:59.92ID:jVY1lffe
>>499
そうかな
C++(スマポ必須で所有権)よりはRustがシンプルではっきりと初心者向けだよ
自動解放で安全が前提でないと困るからその二つが比較対象で合っているよね
0501デフォルトの名無しさん
垢版 |
2022/08/17(水) 07:00:37.46ID:8QCiHT08
皆さんのオブジェクト指向に対する考え方
おください!
0502デフォルトの名無しさん
垢版 |
2022/08/17(水) 08:26:24.61ID:/AaT26gR
>>500
C++との比較なんてしていない。よく読め。
C++が駄目なのと同じくらいRustも初心者の学習コストはダメ。
C++はまだ部分的に汚く使う柔軟性を持つから、better c くらいのところから段階的に使う余地はある。しかしRustはいきなり複数の概念(所有権とか参照とかmoveとか)を使わないとプログラムが書けない絶壁の学習コストをしているから、「とりあえず使う」という選択肢が無い。初心者の選ぶ言語にはならんよ。
0503デフォルトの名無しさん
垢版 |
2022/08/17(水) 08:34:18.80ID:/AaT26gR
>>501
オブジェクト指向のオブジェクトは主体/客体のサブジェクト/オブジェクト。
プログラマー(主体)が操作・命令する対象(客体)をまとめて整理する考え方&手法がオブジェクト指向。
0506デフォルトの名無しさん
垢版 |
2022/08/17(水) 08:50:31.11ID:svOZgDad
他の言語との類似や相違など色んな話題が出てもええんちゃう
特にRustはC++後継言語の一つでもあるし
0508デフォルトの名無しさん
垢版 |
2022/08/17(水) 09:18:05.65ID:3A+P/0wQ
GAFAMがRustをC++の後継言語の1つとして位置付けてRust Foundationを共同で設立したりしてますもんね
ただしGoogleは既存コードのメンテ用としてはCarbonもC++の後継言語の1つとして実験していますね
Rustはシステム更新時や分離できる新たな部分に対してC++の後継言語となるのでしょう
0509デフォルトの名無しさん
垢版 |
2022/08/17(水) 09:43:49.92ID:G5jxF3Mu
>>504
C++関連としては>>487
あとは「Rustは初心者向けじゃないからC++後継できるところまでは行かん」という主張に対する話。C++だって学習障壁から初心者取り込みできずにユーザー規模が縮小しつつあるのに、もっと絶壁のRustが普及するとは思えん。
C++後継としてはRust以外の初心者に配慮した言語が来るんじゃない?
0510デフォルトの名無しさん
垢版 |
2022/08/17(水) 10:06:28.08ID:JpVQLN3v
スマポすなわち所有権を使ってるC++プログラマーならRustは簡単で楽勝
まともな案件ならばスマポ使っているし、急にではないけど、より安全なRustへ徐々に少しずつ移っていくんだと思うよ
0511デフォルトの名無しさん
垢版 |
2022/08/17(水) 10:18:24.59ID:T2QftTg0
>>506
それなら類似や相違など語り合うスレのほうがいいのでは?
無いなら立てれば良いし
C++の相談に来ているスレで今はRustだよなんて言われてもね
0512デフォルトの名無しさん
垢版 |
2022/08/17(水) 10:27:35.49ID:tNGd1WjN
学習障壁でユーザー規模が縮小って
なんかCOBOL臭えな

アホフィルタを外すより待遇を改善すべきだろ
マ板でやるべき内容だな
0514デフォルトの名無しさん
垢版 |
2022/08/17(水) 10:41:14.61ID:tNGd1WjN
は? 「C++が使える」アホは俺でも知ってるが
それがこの話と何か関係あるのか?
0518デフォルトの名無しさん
垢版 |
2022/08/17(水) 12:03:04.79ID:tNGd1WjN
都合が悪くなると荒らしたいだけとか全く
C++相談室でRustを連呼するやつに言われたかねえな
0519デフォルトの名無しさん
垢版 |
2022/08/17(水) 12:06:02.53ID:tNGd1WjN
相談者はチームで突然、Rustに変えようと言い出せば
解決につながるとでも言うのか
そんな力のあるやつが相談に来るとでも?
0521デフォルトの名無しさん
垢版 |
2022/08/17(水) 12:50:49.80ID:hpgzuSC5
手動メモリ管理のZigでは無理だよ
手動メモリ管理で複雑化したときにどうしても発生している穴を防ぐことがどのIT企業でも課題となっている
0523デフォルトの名無しさん
垢版 |
2022/08/17(水) 13:46:04.27ID:0xu2lUBy
shared_ptrやunique_ptrで特に問題ないと思うが?
手動メモリ管理ってパフォーマンスでも気にしてるの?
0525デフォルトの名無しさん
垢版 |
2022/08/17(水) 15:14:20.93ID:ka8BV2dl
>>522
それはJavaがGC言語だからしょうがない
非GC言語でプログラマーによるコードに依存せず自動メモリ解放して欲しいならば現状Rustしかない
0528デフォルトの名無しさん
垢版 |
2022/08/17(水) 15:53:30.62ID:RcTU5KfW
>>523
正確にはスタックフレームに積む or スマートポインタを使ってヒープに置く、だな。

shared ptrは関数呼び出し時の値渡しのインクリメントデクリメントコストが気になるところ。
スタックフレームに存在するかどうかで参照渡しか値渡しかを自動で切り替えると便利そうだけど、最適化で上手く処理してくれたっけ?
0529デフォルトの名無しさん
垢版 |
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ではそのコストを必要としない
などなど
0532デフォルトの名無しさん
垢版 |
2022/08/17(水) 17:56:04.99ID:IlAVLAST
この手の議論って「全てのプログラマがポインタを直に操作する必要に迫られている」という詭弁に基いていて辟易するんだよな
0535デフォルトの名無しさん
垢版 |
2022/08/17(水) 18:40:18.95ID:JVW7ncQZ
>>532
ある程度の大きなデータは抽象的な意味でcall by reference (pointer) により受け渡しすることになり実装的にはポインタを使わざるをえない気もする
0536デフォルトの名無しさん
垢版 |
2022/08/17(水) 19:39:41.85ID:/AaT26gR
>>529
Rustの変数をunique ptrと比較している時点でRustの利点を理解出来ていない。
Rustの変数に対応するのはあくまで自動変数で、unique ptr に対応するのはBox<T>。

Rustは「高速化と自動化のためにできるだけスタックフレームを活用する」という基本的な考え方があって、そのためにあの窮屈なルールで自動変数を高機能化している。
Rustの変数がデフォルトムーブだからといって、Rustの変数はunique ptr みたいなものとするのは理解の足りない粗忽者のやることだわ。
0537デフォルトの名無しさん
垢版 |
2022/08/17(水) 19:59:51.79ID:07u67rxx
>>536
ある意味それも正しいが現実問題じゃないな
例えばi32を10個返す関数を作るとして
その型を[i32; 10]、Box<[i32; 10]>、Vec<i32>のそれぞれにした場合に生成コードはどうなりどれを選ぶべきか考えるとBoxの意義がなああ
結局Rustではもっと最適なものを選ぶからunique_ptr相当すら使うことがレアだよな
0538デフォルトの名無しさん
垢版 |
2022/08/17(水) 20:32:26.88ID:k/cupzFM
>>491
C++ちょっと分かったなーって気持ちになれるまでの遠い道のりを考えると、Cができるなんて入口にすら立ってない感じ。
だからC知ってたくらいではアドバンテージないよ。個人の感想です。
0539デフォルトの名無しさん
垢版 |
2022/08/17(水) 21:07:14.75ID:0xu2lUBy
>>529
>・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるが
>Rustではそのコストを必要としない
本当にコストは必要ないのかな?
本当に参照カウントしないのかな?
0542デフォルトの名無しさん
垢版 |
2022/08/17(水) 21:37:14.43ID:IDhwUS5q
>>539
Rustは借用(とライフタイム)があるから、
複数の参照が同時に必要となっても、
所有者は一人のまま何も変わらず、
複数の借用を普通に使うだけで済んでしまい、
付加コストの発生は無し。

一方でC++は、
複数の参照が同時に必要となる場合、
unique_ptrではもちろんダメなので、
shared_ptrを使わざるを得ず、
参照カウンタ増減という付加コストが発生。
0543デフォルトの名無しさん
垢版 |
2022/08/17(水) 21:39:05.15ID:bVkA6pax
>>540
デフォルトはヒープを想定しているだろ。
Rustの変数はデフォルトスタックを想定している。
0544デフォルトの名無しさん
垢版 |
2022/08/17(水) 21:40:11.05ID:GcPebzMx
そんなん設計でどうにでもなる
ありきたりの道具使ってばっかいるからアタマが退化してんだろ
0545デフォルトの名無しさん
垢版 |
2022/08/17(水) 21:41:54.05ID:GcPebzMx
>shared_ptrを使わざるを得ず
おまえがそう決め付けているだけで、ここら辺は設計でどうにでもなる
0547デフォルトの名無しさん
垢版 |
2022/08/17(水) 21:51:11.86ID:eXFNTowk
同じクラスが重複して定義されたとき、
そのクラスに変数が定義されていてもコンパイルエラーにならないのはなぜですか?
関数が定義されている場合、インライン展開されないとコンパイルエラーになると思います
変数にはそのような指定が無いと思いますが、なぜエラーにならないのでしょうか?
0548デフォルトの名無しさん
垢版 |
2022/08/17(水) 22:07:13.27ID:vZEBwtyc
言っている意味がちょっとわからないので最小のコードを提示してもらえるとありがたい
0549デフォルトの名無しさん
垢版 |
2022/08/17(水) 22:09:46.76ID:wEP2ktHW
単純に、同じクラスを(同じ定義で)二回定義してもエラーにならんの
便利なようで不思議だよな
0551デフォルトの名無しさん
垢版 |
2022/08/17(水) 22:12:24.01ID:vZEBwtyc
大抵インクルードガードで1回しか通らないようにしてたけど
(クラス定義だけなら)インクルードガードなしで二重に読んでも通るってことなのか… それはしらんかった
0553デフォルトの名無しさん
垢版 |
2022/08/17(水) 22:17:02.42ID:IDhwUS5q
>>550
それはダングリングポインタになりうるからダメ
C++には借用とライフタイムの概念がないため先に解放されてしまう事態を避けられない
0554デフォルトの名無しさん
垢版 |
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と同様に複数のソースで重複定義になる気がするのですが
0555デフォルトの名無しさん
垢版 |
2022/08/17(水) 23:24:22.15ID:0xu2lUBy
>>542
コンパイル時に参照数が決まらない場合は参照カウントしてるやろ?
コンパイル時に決まるよう状況ならC++でもT&で十分
0556はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/17(水) 23:28:24.67ID:ito9w61P
>>554
int i; はメンバ宣言に該当するがそれ自体は定義ではない。
クラス定義の中にメンバ宣言があるってのがようわからん理屈だがその時点では実体が作られない、
逆に言えばその型のオブジェクトを生成するときになって初めて実体が作られるので
この段階では重複として排除する必要がない。
0557デフォルトの名無しさん
垢版 |
2022/08/17(水) 23:31:25.13ID:6ShnCCAk
>>553
参照を渡した先でどこかに参照を格納・保持して後で使う必要があるなら shared_ptr で
渡すのがいい状況になりそうだけど、その場合は Rust でも借用では済まないのでは?
0558デフォルトの名無しさん
垢版 |
2022/08/17(水) 23:51:08.75ID:eXFNTowk
>>556
ありがとうございます
グローバルスコープに定義するときは、
int i;
この記述で定義になるので、複数のソースでインクルードすると当然重複定義になります
クラス内では宣言のみになるとは思いませんでした
そういうものと覚えるしかなさそうですね
0559はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/18(木) 00:07:40.00ID:KKIhvA0h
>>553
C++ にもライフタイムの概念はあるよ。
コンパイラが検査してくれないってだけ。
ダングリング参照を作ってはいけないというルールは C++ でも Rust でも同じ。
0560デフォルトの名無しさん
垢版 |
2022/08/18(木) 02:53:41.59ID:TJJ2kcCc
>>555
スマポを使っている限りは安全だと客観的にも保証されるけど
そこでT&を使ったら自己責任の世界に戻ってしまい意味なしとなってしまう
0561デフォルトの名無しさん
垢版 |
2022/08/18(木) 04:29:06.72ID:HNqVdbFt
>>559
決定的な違い
Rustではダングリング参照するプログラムを絶対に作れない(コンパイラがエラーとする)
C++ではダングリング参照するプログラムがうっかり容易く生じてしまう(そしてコンパイラが通してしまう)
0562デフォルトの名無しさん
垢版 |
2022/08/18(木) 04:53:19.13ID:X/mZUHYK
>>561
話変わってるだろ
検査してくれるかどうかじゃなくて
> ・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるがRustではそのコストを必要としない
の話だったと思うが?
0563デフォルトの名無しさん
垢版 |
2022/08/18(木) 05:23:06.33ID:l0miaXwd
>>562
それはC++で安全を保証しようとすると
複数の参照を用いるならば常にshared_ptrの使用を必須とするしか安全を保証できないのに対して
Rustは複数の参照だけなら借用のみで安全を保証できるという話ではないか

ちなみにRustでは複数の参照ではなくもっとレアケースである複数の所有が生じた時に初めてコンパイラがRcを要求する
つまりRustでは参照と所有が明白に分離されているところが大きな違いとなる
0565デフォルトの名無しさん
垢版 |
2022/08/18(木) 07:06:14.45ID:DhI3ZTcW
C++11以降のマナーでは、ダングリングは発生しない。
設計を見直すべきでは?

旧い規格、例えばDOMを実装する場合、設計を見直すことはできない。
ところで、DOMについて、C++によるGoogle Chromeの実装は素晴らしい洞察で問題を回避している。
後学のために読んでみるとよい。
0566デフォルトの名無しさん
垢版 |
2022/08/18(木) 07:10:02.07ID:DhI3ZTcW
如何にして安全なスパゲッティ・コードを書くかというのがRustのアプローチなら。
C++の方法論は、「安全なスパゲッティなど存在しない、素麺にしましょう」ということ。
旧式のスパゲッティ・コードを書きたい人にとってC++は役に立たない。
0567デフォルトの名無しさん
垢版 |
2022/08/18(木) 08:09:28.79ID:ywzuYu7m
まぁ、c++でももっと積極的にスタックフレームに限定するアプローチは欲しいよね。

以前にインスタンスがスタックフレームに存在することを保証するスマート変数を作ろうとしたけど、インスタンス変数をどうしても制限できなくて挫折したことがある。
スマートポインタが必ずスタックにあるのなら、スマートポインタの参照渡しとかもっと活用できるのにね。
0569デフォルトの名無しさん
垢版 |
2022/08/18(木) 09:19:43.25ID:X/mZUHYK
>>567
> 以前にインスタンスがスタックフレームに存在することを保証するスマート変数
それなんの意味があるんだ?
てかC++ならスタック上にインスタンス生成すればよくね?
0571はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/18(木) 10:26:05.65ID:KKIhvA0h
大抵の環境でデフォルトのスタックサイズはそれほど大きくない。
数メガバイトというのは現代的な感覚では極端に小さいようにも見える。

でもまあだいたいこれで足りるし、足りるように書くのが普通なんじゃないの。
0572デフォルトの名無しさん
垢版 |
2022/08/18(木) 11:28:19.94ID:p/limWqp
C > Nim > C++ > Rust
0573デフォルトの名無しさん
垢版 |
2022/08/18(木) 11:29:37.71ID:p/limWqp
>>569
GC要らなくなる
0574デフォルトの名無しさん
垢版 |
2022/08/18(木) 11:47:13.53ID:u9P7LJR3
>>571
スタックオーバーフローしたら Linux/Unix は自動拡張しなかったっけ?
Windows はなぜか(オプションで可変出来るけどスレッド起動後は)固定なんだよね
0576はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/18(木) 12:03:37.12ID:KKIhvA0h
>>574
割り当てが足りなくなれば拡張するが、その上限の設定がデフォルトでは 8MB になっている。
0578デフォルトの名無しさん
垢版 |
2022/08/18(木) 12:35:06.23ID:R9m+Nq0X
ポインタたくさん使う人っておじさんですよね?
実年齢か精神年齢かはともかく
0579デフォルトの名無しさん
垢版 |
2022/08/18(木) 12:37:54.86ID:ywzuYu7m
>>577
ちょっと補足。
スマートポインタがスタックにあるのなら、shared ptr の参照とかポインタみたいなヤバイのもそこそこ安全に扱える。余計なインクリメントデクリメントも発生しなくて良くなるし。
0582デフォルトの名無しさん
垢版 |
2022/08/18(木) 13:29:45.98ID:KxsikMs2
>>563
つまりコンパイル時に参照数が決まらない場合はRustも参照カウントする

>>529
>・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるが
> Rustではそのコストを必要としない
従ってこれは間違っている
0583デフォルトの名無しさん
垢版 |
2022/08/18(木) 13:34:11.90ID:AgenDKWc
>>579
一見その通りだけど
関数で参照を返したい時に、その実体が呼び出し元(かそれ以前)のスタックフレーム上なのか、
それとも消え去る現在のスタック上なのか、安全を保証するために区別する情報が必要となる

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

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

以上を言語仕様に組み込んだのがRust
0585はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/18(木) 14:09:16.33ID:KKIhvA0h
私もそう思う。 C++ でも明確で、解釈の余地はほぼない。
その上で知ってても人は間違うというところは問題で、チェックを自動化できるように整理したという Rust の功績は大きくはある。
ルール自体の差は C++ と Rust でそれほど大きくはない。
0586デフォルトの名無しさん
垢版 |
2022/08/18(木) 14:18:54.74ID:PTM9RcdX
C++のライフタイムはプログラマーにとっては明確でもコンパイラにとっては明確でない
そのためC++では参照の安全性をコンパイラが保証することができない
そして複雑化した時に人間(プログラマー)はミスを無くすことが出来ない
そのためC++で書かれた多くのソフトウェアで常に穴が発生し続けている
0588はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/18(木) 16:15:40.31ID:KKIhvA0h
>>587
C++ のスマートポインタはやっぱり後付け感はある。
Teratail とかの質問サイトを見てたら (コンパイル時にエラーに出来ない形で) 使い方を間違ってセグフォしてたりするのはちょくちょく有る。
コンパイラがガッツリと検査してくれる Rust はありがたいよ。
0590デフォルトの名無しさん
垢版 |
2022/08/18(木) 16:27:29.27ID:9oKj6z2J
桐蔭トリプルプレーだよ
0592デフォルトの名無しさん
垢版 |
2022/08/18(木) 16:59:01.63ID:4Dlj1ckV
>>587
unique_ptrやshared_ptrの使い忘れや使い方ミスなどをしてもコンパイラはエラーとすることができないためC++は安全性を保証できない
他にもget()して得たポインタを関数などに渡した後にそのライフタイムを逸脱しないかなどの保証もできない
全ては人間頼みとなるため多数の穴が生じてきた
0593デフォルトの名無しさん
垢版 |
2022/08/18(木) 19:33:28.16ID:74ku3J2B
性能厨としては何でもスタックフレームに置いて集積度を高くしたいところ。レジスタの効率とかキャッシュヒット率とか変わるだろうし。

Rustのスタックへのこだわりはいいんだけど、無駄に抽象化しているから余計に複雑になっている感じを受ける。
0594デフォルトの名無しさん
垢版 |
2022/08/18(木) 21:49:54.60ID:SUTQRi3H
C++のスマポは言語機能じゃないから書き方長くてだるいし
外部ライブラリは当然ナマポ使ってるから結局その辺でセグフォの危険を排除できないし
オウムみたいにスマポでいいじゃん連呼してるやつは本当に使ったことあんのか?
0595デフォルトの名無しさん
垢版 |
2022/08/18(木) 21:58:35.30ID:KxsikMs2
>>592
使えば?と私は提案してるので「使い忘れ」は論外として
「使い方ミス」はどんなミスでしょうか?
ミスのしようがないほど単純だと思います

Rustのコンパイル時にチェックしようという設計は
もちろん良いと思いますよ
0598デフォルトの名無しさん
垢版 |
2022/08/18(木) 22:12:02.34ID:3gZlWdNz
>>596
君のような勘違い自信過剰な人がうっかりミスを起こして問題を引き起こしてきた
チェックを人間に依存している限りミスは必ず発生する

ソース記事
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/
グーグルによればAndroidに存在した深刻なセキュリティー脆弱性の70%近くがメモリー安全に関するバグに起因するという。
同様にマイクロソフトも、同社製品に存在したセキュリティー脆弱性の70%がメモリー安全に関するバグに起因すると述べている。
C/C++を使う限りセキュリティー脆弱性を根絶するのは不可能と
0600デフォルトの名無しさん
垢版 |
2022/08/18(木) 22:17:29.31ID:KxsikMs2
>>598
> >>596
> 君のような勘違い自信過剰な人がうっかりミスを起こして問題を引き起こしてきた
私は最近はメモリ管理で全く失敗がないので私とは違うな
0602デフォルトの名無しさん
垢版 |
2022/08/18(木) 22:29:53.88ID:6c/4Q98o
>>600
それは貴方がアホだからミスに気付いていない可能性、使われないからバグが未発見なだけの可能性、単純なことしかしていないだけの可能性、…
複雑化すると、どんなにベテランでも、多数の人々がコードをチェックしていても、メモリ管理ミスが現実に起きている現実を受け入れましょ
0605デフォルトの名無しさん
垢版 |
2022/08/18(木) 23:09:02.07ID:KxsikMs2
>>604
ごめんごめん
>>598がいちいち私を引き合いに出してきたので否定したまでだよ
>>598の書き込みも冒頭の「君のような」を書かなければ
良いのに何でいちいち書くのかね?
0606デフォルトの名無しさん
垢版 |
2022/08/18(木) 23:31:07.48ID:RTRtwr2z
どんな複雑なケースでも一度もミスをしたことがない!今後も絶対にミスをしない!
と言ってる人を信頼できるわけがない
0607デフォルトの名無しさん
垢版 |
2022/08/18(木) 23:38:25.32ID:KxsikMs2
>>606
>一度もミスをしたことがない!今後も絶対にミスをしない!
そんなことは一言もいっとらんがなw
0608デフォルトの名無しさん
垢版 |
2022/08/18(木) 23:42:25.87ID:KxsikMs2
本当にunique_ptrやshared_ptrでミスするかい?
信じられないほど単純なクラスだと思うけど
>>592の「使い方ミス」って何なの?

getで中身取り出して云々は割とあり得るんだろーけど
それはunique_ptrやshared_ptrの外の出来事だし
0610デフォルトの名無しさん
垢版 |
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に入って全部リプレースした
あとは過去にも犯さず使用しできてるよ
みんなはどうだい?
0612デフォルトの名無しさん
垢版 |
2022/08/19(金) 00:47:36.81ID:SM6rQCcv
>>611
外部ライブラリの関数呼ぶのにget使うけど
意味するところを理解しているので
慎重になるから失敗した覚えはないなぁ

当たり前だけど自分の書く関数の引数に生ポインタを使うことはない
0613デフォルトの名無しさん
垢版 |
2022/08/19(金) 01:36:44.63ID:Iq0pX04r
>>612
ところで複数の関数呼び出しそれぞれに参照を渡したい時はどうしてる?
生ポインタ使わないからshared_ptr?
0615デフォルトの名無しさん
垢版 |
2022/08/19(金) 02:09:43.59ID:SM6rQCcv
>>613
その書いている「参照」ってのはC++の参照ではないですよね?

関数にT型のオブジェクトを引数として渡すとき
関数がシーケンシャルに実行されるなら原則としてT &で渡す
中身が無効値である可能性があるならunique_ptr <T> &で渡す
関数が並行に実行されるならshared_ptr <T>を渡す
0616デフォルトの名無しさん
垢版 |
2022/08/19(金) 03:25:13.02ID:oQfRblXd
T&渡した時にそれが他へ転用され保持されて生き残り続ける可能性を考慮しないの?
0617デフォルトの名無しさん
垢版 |
2022/08/19(金) 05:39:15.80ID:HCuI/gXC
静的試験を絶対視するなーんにも分かっとらんやつが推すほどイメージが悪くなるな
0618デフォルトの名無しさん
垢版 |
2022/08/19(金) 07:27:50.77ID:QMISJLeV
>>616
だからポインタ使うの?
まあ寿命の長いオブジェクトを駆使しないほうがかっこいいのでは
0621デフォルトの名無しさん
垢版 |
2022/08/19(金) 08:45:24.08ID:xzucV8hS
>>597
constructor destructor関数オブジェクトを用意すれば良かったんじゃなかったっけ?smart ptrの典型的な応用例だから、調べりゃすぐ出てくるよ。
0623デフォルトの名無しさん
垢版 |
2022/08/19(金) 10:22:48.97ID:51hioa9S
>>617
俺も以前はそう思っていたんだけど
わずかな補助情報を人間が与えるだけで
Rustコンパイラが静的試験してくれて
人間にとって面倒かつ慎重さを必要とする作業から解放してくれるのを知って考えが変わった

例えて言うなら
動的型付け言語を使っていたところを
わずかな型情報を人間が与えるだけで
静的型付け言語のコンパイラが静的試験をしてくれるようになったのと似てる
0624はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/19(金) 11:08:02.29ID:FT/EuRcZ
昔とはソフトウェアの規模感が違う。
そしてプログラミングするのがプログラミングの専門化とは限らない領域が増えた。
(いわゆるエンドユーザー・コンピューティング)

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

動的な検査でも静的な検査でもいいが、
C/C++ は検査せずに未定義に突入するのがあまりにも簡単すぎる。
0625デフォルトの名無しさん
垢版 |
2022/08/19(金) 11:09:58.15ID:HCuI/gXC
>>623
ナマポひとつロクに扱いきれないスキルと
動的チェックなんて恥ずかしげもなく言っちゃう
バカ用言語があんたにとって有難いのは分かったよ

ここはC++相談室
C++という土俵に立っている者の場だ
落ちこぼれて逃げ出したやつの遠吠えは
誰も聞きたがってない
どっか行け、邪魔なんだよ
0626デフォルトの名無しさん
垢版 |
2022/08/19(金) 11:17:41.46ID:HCuI/gXC
自分のミスを道具のせいにするやつ
そういえば法案のミスをワープロのせいにするバカ役人がいたな

こういう手合いは一事が万事
0628デフォルトの名無しさん
垢版 |
2022/08/19(金) 11:53:43.76ID:SM6rQCcv
一般用語の参照を使ってると思われるあたり
この人(>>613)はC++の参照を知らないレベルだと思うんだよね
C++に関してはほぼ知識がないまま
受け売りでRustが生ポインタを廃止?した利点を主張している
(私もRustのコードは書いたことがないんだけども)
この人は何がしたいんだろうか?
0630デフォルトの名無しさん
垢版 |
2022/08/19(金) 12:19:36.97ID:HCuI/gXC
動的型付け・・・あー、もしかして動的型宣言のことかな?
だとすると具体的に何言語のことを言ってるんだろう?
Bにはそんなもんないし・・・
0631デフォルトの名無しさん
垢版 |
2022/08/19(金) 12:44:26.95ID:BT0K6AVq
昔構造体を値で渡したらポインタにしろっておっさんに怒られたっけ
速度を気にしないんだったらコピーでええのに糞めんどくさかったわ
0634デフォルトの名無しさん
垢版 |
2022/08/19(金) 13:06:02.28ID:HCuI/gXC
>>633
それwikipediaソースだろpgr
で、あんたdynamic type declarationのことを言ってたの?
それとも他の何かか? Bにあったものか?
0635デフォルトの名無しさん
垢版 |
2022/08/19(金) 13:47:12.04ID:FysKbdqv
>>634
あまりにも無知すぎて話にならないな
wikipediaでも何でもいいから勉強して出直して来い
動的な型と動的型付けの区別は最低限つけろ
静的型付け言語の中には動的な型と呼ぶものもあるが
静的型付けと動的型付けは基本的に排反の関係だ
0637デフォルトの名無しさん
垢版 |
2022/08/19(金) 14:06:18.12ID:zzLlPl0v
その一文がわからないようなレベルの奴がメモリ管理で全く失敗ないとか言ってんだもん
みんな呆れてんだよ
0638デフォルトの名無しさん
垢版 |
2022/08/19(金) 14:08:38.12ID:SM6rQCcv
>>637
本当に質問の意味が分からんから説明してよ
意味が分かったら返答するからさ
0639デフォルトの名無しさん
垢版 |
2022/08/19(金) 14:09:02.63ID:HCuI/gXC
>>635
俺は動的な型と動的型宣言を混同していることを露呈するような失言はしてないぞ
していると言うなら具体的にどこなのかを示せ
誤魔化しても構わんがそれも返事と取るからな
0640デフォルトの名無しさん
垢版 |
2022/08/19(金) 14:28:41.00ID:SM6rQCcv
>>628にも書いたけどC++相談室で一般用語の「参照」は
C++の参照と混同するので普通は避けるんだよね
C++で書いた経験が皆無なんだなと俺は判断している
それで>>616のような意味を計りかねる質問をしてしまう
0641デフォルトの名無しさん
垢版 |
2022/08/19(金) 14:40:23.82ID:FysKbdqv
>>639
そこまで恥を再び晒したいなら示す

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

まず動的型宣言という用語は存在しない
"動的型付け" はググると7万件あり
"動的型宣言" はググると3件である

一般的に動的な型の宣言の話と広く解釈したとしても
動的な型の宣言と動的型付けは異なり互いに包含関係などもない
動的な型の宣言は静的型付け言語においても持つものがある
そして動的型付けは静的型付けの逆であり相反する
0642デフォルトの名無しさん
垢版 |
2022/08/19(金) 16:45:49.60ID:SM6rQCcv
>>637
説明が難しいなら簡単なコードでも良いよ
何を懸念しているのかそれで推察できると思うから
0643デフォルトの名無しさん
垢版 |
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の部門で行うべき変な質問かなとも思いますが……何かやり方やティップがありましたら教えていただければ……
相対的に有田退治にもなります!
0644はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/19(金) 17:19:48.26ID:FT/EuRcZ
>>643
メンバを

Hoge& Operator=(const Hoge&r)=default;

というように宣言すればデフォルトの定義が実装される。
全てのメンバに対して代入演算子を適用したのと同じことになる。
(もちろん全てのメンバを代入するという挙動で駄目な場合は自分で書くしかしょうがない。)
0645デフォルトの名無しさん
垢版 |
2022/08/19(金) 17:31:34.37ID:HCuI/gXC
>>641
そのレスには動的な型についての言及がないな
誤魔化したいわけね、返事ありがとう

動的型宣言という言葉は存在しないと言いながら
動的型付けとは【意味が違う】とはどういうことだ?
存在しないものは比較できないはずだぞ
operator<=>でSFINAEだなpgr
0647はちみつ餃子 ◆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; // 代入できる
}
0648デフォルトの名無しさん
垢版 |
2022/08/19(金) 19:46:49.43ID:FysKbdqv
>>645
おかしな人みたいだからこれ以上は相手にするのやめとく
動的型付けを知らなくて間違えたことは仕方ないとしても
それを指摘された後の逆ギレはみっともないから治したほうがいいよ
0651デフォルトの名無しさん
垢版 |
2022/08/19(金) 20:42:25.54ID:rkGmDNWr
>>644
>>647
規制されてしまいましたが643でございます。
メンバにユニークポインタがある場合は代入演算子とコピコンは削除された関数とされてしまい、コピーが実行できません(涙
ユニークポインタは明示的に複製されないとだめなのはわかるので、仕様には文句があるべくもないのですが……
例えばの話、データ型にint char等のメンバが100個あったとして、ユニークポインタのユーザー定義型が1個紛れ込むだけで、すべてのメンバを書き出しをしなければいけないのでしょうか?
みなさんはちゃんと書きだしているのですか?と疑問に思ったので・・・
まあユニークポインターを含むデータ型をコピーしない運用をなさっているのだと思うのですが、わたしは使ってしまいます(怒)
そこで、なにか裏技のような方法がないのかなとお聞きしてみた次第であります(`・ω・´)ゞ
0653デフォルトの名無しさん
垢版 |
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)
{
//メンバ全部かかなきゃいけない( ;∀;)
}
という感じになってしまうのが困るというか……もっと楽できないかなと思いまして(´;ω;`)
0655デフォルトの名無しさん
垢版 |
2022/08/19(金) 21:14:52.11ID:rkGmDNWr
>>654
なるほど得心いたしました!
ユニークポインタをラップしたクラスにコピーコンストラクタを実装すればいいという……ってコト?
ですね?
ちょっと試してめます
0656デフォルトの名無しさん
垢版 |
2022/08/19(金) 21:36:17.81ID:rkGmDNWr
643です
解決しました
皆様ご親切にありがとうござい甘いた
ラップしてオペレーター実装すればいいだけだったとは……
こんなので悩んでるの私だけではないだろうか
0657652
垢版 |
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 *;
};
0658デフォルトの名無しさん
垢版 |
2022/08/20(土) 17:45:23.06ID:K3rnpbr9
>>621
それがそうでもないんですよ。だれか簡単なソースで示してくれませんか?
ハンドルごとにデストラクタがいろいろと変わるのが難しいと考えています。
0659デフォルトの名無しさん
垢版 |
2022/08/20(土) 17:53:55.99ID:zyxn7VyM
ハンドルごとに異なるデストラクタを指定すればよいのでは?
何が難しいのかソースで示してくれませんか?
0660デフォルトの名無しさん
垢版 |
2022/08/20(土) 17:54:26.62ID:ThG9yriU
>>658
> ハンドルごとにデストラクタがいろいろと変わるのが難しいと考えています。
ハンドル毎にクラス作ればいい
と言うかハンドル毎にコンストラクタも色々変わるはずだがそっちはいいのか?
0661はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/20(土) 18:23:11.87ID:ktmIW8Jj
>>658
ポインタ以外のリソース一般を扱うための unique_resource クラスの提案は出ている。
一部の処理系では使えるようになっているし、ポータブルな実装があるので導入してみてもいいかもね。

このような提案が出ているのは逆に言えばスマートポインタではハンドルを上手く扱えないということでもある。
0663デフォルトの名無しさん
垢版 |
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;
}
0664デフォルトの名無しさん
垢版 |
2022/08/20(土) 21:51:59.51ID:xbv+n9gR
unique_ptr縛りですか?
shared_ptrならコンストラクタの第二引数にDeleter関数を渡せるけど
0666デフォルトの名無しさん
垢版 |
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;}
};
0667デフォルトの名無しさん
垢版 |
2022/08/21(日) 13:06:57.68ID:j3ukytx2
>shared_ptrならコンストラクタの第二引数にDeleter

ほんそれ
0668デフォルトの名無しさん
垢版 |
2022/08/21(日) 18:27:12.08ID:llGchqj4
lzw書いたら、色々プリプロセス突っ込んでやったのにメルセンヌツイスタの前に敗北した。
2色ビットマップは1/5になったけど、ブロックソートがアホみたいに遅い・・・。Orz
0671デフォルトの名無しさん
垢版 |
2022/08/25(木) 10:04:27.81ID:1QA/N1Qa
サブルーチンsub、
subを呼ぶA、
subを呼ぶB、
があって、subをAとBからしか見えないスコープに置きたくなったんですが、そういうときはnamespaceを切るしかないですか?
0672デフォルトの名無しさん
垢版 |
2022/08/25(木) 10:09:20.76ID:s36cDPHI
>>671
sub, A, Bをひとつのファイルに入れてファイルスコープで区切るとかクラスにまとめてクラススコープで区切るとか
0673デフォルトの名無しさん
垢版 |
2022/08/25(木) 12:00:46.82ID:1QA/N1Qa
>>672
クラスに入れるとしたら毎回インスタンス作って呼ぶんですかね?
外から呼ぶためだけにstatic関数にするのもなーと思ってしまうのですが、そういうのはよくやられていることですかね?
0674デフォルトの名無しさん
垢版 |
2022/08/25(木) 18:28:04.89ID:tuQ48GQq
Javaとかではstatic関数まとめクラスはよく見るけどC++ではあんまり見ない
それこそnamespaceを使う
0675はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/08/25(木) 18:44:56.88ID:ktMJLYyQ
それはどうだろう。
namespace は内部を隠蔽しない。
キッチリと隠したいなら翻訳単位を分けるか、
翻訳単位内でも隠蔽したいならクラスに入れるかしかやりようがない。

やろうと思えば namespace で区切ってここにはアクセスしないことにするという
規約で運用するとかも出来るが、その程度で足りるなら
そんなに分けなくてもよくない? って思うし。
0676デフォルトの名無しさん
垢版 |
2022/08/25(木) 20:19:01.82ID:TTLAkLfZ
subを公開ヘッダに書かずに非公開ヘッダに書くだけでよくね?もしくはヘッダを用意せずに各ソースコードからexternするとか。どっちも完全に隠蔽されるわけじゃないけど。

あとは全部同じソースコードに格納できるなら無名名前空間の中にsubを入れとくとか?
0680剛田武
垢版 |
2022/08/25(木) 23:01:36.69ID:JbTCA7nE
おお!心の友よ!
お前のものは俺のもの
俺のものは俺のもの
0684デフォルトの名無しさん
垢版 |
2022/08/31(水) 19:31:25.12ID:LmkW4fMO
MessageBox()みたいな機能でボタンのテキスト変更できるファンクションありませんか

メッセージが"ぬるぽ"なら[ガッ]のボタンを押したいじゃないですか!
[ はい ]、[ いいえ ]だと"ぬるぽです。ガッする場合は[はい]を押してください"みたいに長々と説明しないといけないので(´・ω・`)
0688デフォルトの名無しさん
垢版 |
2022/09/01(木) 10:24:37.74ID:0re8NfSH
windowsのアプリの話
C++で作成するとランタイムが必要なんですか?
Cならランタイムは不要ですか?
windowsのアプリを作成するとしたらC++とCでどちらの方が良いでしょうか?
0689デフォルトの名無しさん
垢版 |
2022/09/01(木) 10:35:00.87ID:J4auvpO0
ランタイムライブラリはCでも必要
アプリ制作が目的ならC/C++はそもそも向いてないかもしれない
出来なくはないが、そのレベルの質問をするようだと今後苦労するかも
0690デフォルトの名無しさん
垢版 |
2022/09/01(木) 10:38:04.37ID:0re8NfSH
>>689
ありがと
0691はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/01(木) 10:47:53.40ID:LhGLll4T
>>688
C/C++ のランタイムライブラリの一部は Windows の一部として入っているからその範囲内でならどちらでもあまり関係がない。
ランタイムライブラリの一部はVisual C++ 再頒布可能パッケージとして配布されているものもあるが Windows のバージョンによっては
最初から入ってるとかもあるのでそのあたりの事情は複雑。
バージョンの混乱を避けるならスタティックリンク版を使ったほうが楽だと思う。

Windows のアプリケーションを C で書くのはだいぶんしんどいと思う。
C++ なら楽というわけでもないけど各種フレームワークが C++ を前提にしていたりするので全体としては楽をしやすい可能性が高い。
ただ、言語仕様としては C++ のほうがだいぶん複雑ではあるので言語に対する習熟がどの程度かにもよる。
0693デフォルトの名無しさん
垢版 |
2022/09/01(木) 11:08:01.39ID:wgtUDrt5
Runtime と API って結局何が違うん?
0694デフォルトの名無しさん
垢版 |
2022/09/01(木) 11:10:18.56ID:wgtUDrt5
GDI+はCからでも使えるよな
0695はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/01(木) 11:17:08.19ID:LhGLll4T
ランタイムは実行時に使われるライブラリ (およびその他の実行時サポート) で、
API はそれらを呼出すインターフェイスのこと。

ただ、そんなにしっかりした定義があるわけではなくて
スタティックリンクするライブラリのインターフェイスを API と呼ぶかどうかなどは人によるかも?
API の P はプロトコルの P なので独立性の高いモジュールの外部仕様なら
形態にかかわらず API と呼んでいいんじゃないかと個人的には思っているが。
0696デフォルトの名無しさん
垢版 |
2022/09/01(木) 11:27:49.27ID:wgtUDrt5
ntdll.dll とか kernel32.dll は API って感じするけど
それ以外は全部 Runtime で良いんじゃないかとも思う
msvcrt を API かって言われたら絶対違う気がする
0698デフォルトの名無しさん
垢版 |
2022/09/01(木) 12:36:35.99ID:GpP6p1Yr
APIは「境界面・接点」だから、インターフェイスの向こう側は対象外。
ライブラリは「書庫」なので、中身を含めてライブラリ。
0699デフォルトの名無しさん
垢版 |
2022/09/01(木) 12:48:19.96ID:0gPlf6MI
ランタイムは、特定の開発手段(GCC, VSなど)に関係する実行環境に持ち込むもの
APIは、特定の操作対象(OS、アプリなど)に関係する関数など
0702デフォルトの名無しさん
垢版 |
2022/09/01(木) 13:39:01.39ID:wgtUDrt5
携帯電話をケータイと略してしまって何のことか判らなくなるのが日本人の本質
0706デフォルトの名無しさん
垢版 |
2022/09/01(木) 14:06:48.53ID:P/wcDX1Q
いうて英語圏でも普通にRuntimeと表記されまくってるよ
CRTLよりCRTのが一般的だし。RTよりはRTLかもしれんが

>>703
したらわざわざ区別するような名称が付いたりしません
0707はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/01(木) 14:15:18.72ID:LhGLll4T
>>702
いや、プログラムから呼び出されるライブラリだけでなく実行時サポートのための機構全般を含めてランタイムという場合もある。
たとえば WebAssembly の仮想機械の実装である wasmtime も "A fast and secure runtime for WebAssembly" と説明されている。
https://wasmtime.dev/

明確な用例を見つけられないんだけど .NET とかでも同じようなニュアンスだったはず……。
0710デフォルトの名無しさん
垢版 |
2022/09/01(木) 15:06:04.82ID:X5eV6Z9e
WebAPI はどうでもいいとして
Win32API 以前は API ってあんまり聴かんかった気がする
もし時代が時代なら C Runtime は Console API とか
System Call API とか名付けられていたんじゃまいか
0712はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/01(木) 15:45:49.43ID:LhGLll4T
ランタイム (実行時) という語をあてはめる以上は静的ではないというニュアンスが感じられるし、
ダイナミックリンクされるもの全般をふんわりとそう呼び始めたとかではないかなぁ。
あくまでも想像の域を出ないけど。

>710
それはどうだろう。
C ランタイムはコンソールの操作だけを司るわけではないし、ほとんどの関数はシステムコールしない。
あくまでも C という言語の事情に強く結びついているのでランタイムとは呼ばれなかったとしても
C ナントカという名前にはなったんじゃないかな。
0713デフォルトの名無しさん
垢版 |
2022/09/01(木) 16:33:34.64ID:X5eV6Z9e
stdc
0716デフォルトの名無しさん
垢版 |
2022/09/01(木) 20:14:05.79ID:IftgsB+t
DOSの頃はINT21hのシステムコールだしな。
描画はVRAM直だし。
APIと言うより割り込みだな。
0717デフォルトの名無しさん
垢版 |
2022/09/01(木) 21:31:42.28ID:2+rvldGI
APIという言葉からは、実装を絶対に見せたくないという強い意志のようなものを感じる
0718デフォルトの名無しさん
垢版 |
2022/09/01(木) 23:17:08.92ID:X5eV6Z9e
oppapi
0720はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/02(金) 00:07:28.67ID:4QwPhwTb
>>716
DOS の用語ではファンクションコールじゃなかったっけ……
と思って資料を読み返したらなんだかあまり統一されてない感じだった。
ファンクションリクエストという用語を使っている場合もある。

当時の用語の混乱は置いといて、現代的にには
機械語レベルでの値の受け渡しやメモリの配置は ABI で決めるべきことで
API はその上に構築される高レイヤな概念と解される場合が多いと思う。
ソフトウェア割込みを使うという規約は ABI に属して、
どのような値を渡してどんな効果があるかは API に属すと考えるべきじゃないかな。
0722デフォルトの名無しさん
垢版 |
2022/09/02(金) 09:12:32.54ID:K5Jq4B80
こんなのがあったんだけど

https://qiita.com/purigen/items/d68b146f341c41d260fc
c = c = testString.find_first_of(" ")

これってなんで2回も代入してりゅの???わからにゃいよ
0724デフォルトの名無しさん
垢版 |
2022/09/02(金) 10:15:17.31ID:K5Jq4B80
そっか誤植か〜
わかったニャン☆
0725デフォルトの名無しさん
垢版 |
2022/09/02(金) 10:29:24.82ID:J900FDad
Win32の頃はint2ehのだしな
描画はシステムメモリに書いてbitbltだし
APIと言うより割り込み棚
0726デフォルトの名無しさん
垢版 |
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)
| ^
0727デフォルトの名無しさん
垢版 |
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 にしても何も言ってこない
0729はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/02(金) 14:46:58.07ID:4QwPhwTb
>>726
言語仕様上は問題ないけど、どうやら特定の環境で起こる GCC のバグを修正した
ために ABI の辻褄が合わないかもしれないというような事情っぽい。
0730デフォルトの名無しさん
垢版 |
2022/09/02(金) 15:04:43.31ID:2iQGHF2d
>>727-729
有難うございます
難しすぎて書いてあることが良く分からんのですが
ABIなのでビルドし直せば問題ないと理解しました
みなさん凄い調査能力だな
0731はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/02(金) 15:06:04.63ID:4QwPhwTb
>>730
いや、エラーメッセージでググったら stackoverflow で背景の説明をしてるのが見つかったぞ。
0732デフォルトの名無しさん
垢版 |
2022/09/02(金) 18:13:40.07ID:/OwM2R8K
ω株 PI.3.14
0733デフォルトの名無しさん
垢版 |
2022/09/13(火) 14:35:12.50ID:pQsEVmxh
OSの板で聞くべきかもしらんが、終了シグナル受け取ったらメモリの中身を書き出して中断し、再びコマンドが叩かれたらメモリの中身を読み込んで途中から再開するみたいな仕組みを一番簡単にやる方法ってどんなですかね?
チェックポイント・リスタートっていうんでしょうか
0734はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/13(火) 15:19:18.69ID:w3MhG8uL
>>733
Linux とか BSD で昔はメモリをダンプするシステムコールがあったはずだが廃止されたんじゃなかったっけ。
Emacs でそのシステムコールを使ってたから色々とゴタゴタしたような記憶がある。
(そのシステムコールの名前が思い出せない……。 すまぬ。)

再開に必要な情報を適当にシリアライズして書き出すしかしょうがないんじゃないの。
0737デフォルトの名無しさん
垢版 |
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);
}
でホゲ型とホラン千秋型を引数によって変化させて返却したいのです……が、
私が見ても無理そうな感じなのです。ニパー
そもそもテンプレートってコンパイル時点で推察できないと無理ですよね?
この悩みに何か方法や別解があったりしたら教えていただきたく、スレ汚しを失礼しております。

感謝は先に申し上げておきます。
ありがとうございます!
0738デフォルトの名無しさん
垢版 |
2022/09/22(木) 17:27:40.84ID:vBAk//C3
>>737
一般的には型システムの健全性と安全性のために
そのような用途では代数的データ型(タグ付き共用体)を用いる
C++ではstd::variantであるがパターンマッチングなどの言語サポートがないため若干扱いにくい
0739はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/22(木) 19:28:31.52ID:He0eupRY
>>737
実行時の多相は抽象クラスを使うのが基本ということになってる。
その場合で言えば hoge と hage が共通のインターフェイスを持つ (抽象クラスを継承する) ようにクラス設計するのが普通。
まずは抽象クラスを学んでみて。

最初からクラス設計に関与することが出来ない場合 (既存のライブラリなので手を加えられないなど)
に動的に切り替える必要があるなら std::variant や std::any が使えるのだけれど……
使う箇所で元の型にキャストしなおしたり、 std::visit を経由したりで煩雑になりがち。
0741デフォルトの名無しさん
垢版 |
2022/09/22(木) 22:12:16.21ID:PsWl+Otb
>>737
argがコンパイル時点で決定しているのならやりようはあるが
実行時まで決まらないのならみなさんの言う通り
retをどう使うのか呼び出し側のコードを書いてみてよ
0743デフォルトの名無しさん
垢版 |
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;
}
0744デフォルトの名無しさん
垢版 |
2022/09/23(金) 02:10:00.16ID:gD4It3Ab
Python や tcl のコードだな
0745デフォルトの名無しさん
垢版 |
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;
}
0746デフォルトの名無しさん
垢版 |
2022/09/23(金) 17:57:04.27ID:tVlOtcCS
>>738
>>739
返信ありがとうございます。
variantで返すかUnionのようなもので返すか、という事ですね。
Unionの存在を初めて知ったので、できれば使いたいと思います。
0747デフォルトの名無しさん
垢版 |
2022/09/23(金) 18:13:00.58ID:MklXD0R7
そういう用途でタグ無しunionは危険で不便な昔の遺物
どの言語でも安全で便利なタグ付きunionを用いる
C++はパターンマッチングが弱いのでそこを改善すればさらに便利になるはずだ
0749デフォルトの名無しさん
垢版 |
2022/09/23(金) 23:41:53.30ID:icgBEU6J
anonymous union というとなにかこう、不穏なひびきがあるな
集団で徒党をくんでハッキングする的な
0754デフォルトの名無しさん
垢版 |
2022/09/24(土) 20:29:13.36ID:7pBAspe1
Visual Studio Community おそろしあ
0757デフォルトの名無しさん
垢版 |
2022/09/26(月) 21:36:36.83ID:T6INyDl8
ちょっとわからなくなってきたため良ければ教えてください。
他言語を使用していて強く感じることですが、.hと.cppを行ったり来たりする開発スタイルがかなり面倒に感じます。
ヘッダに実装を書いても普通にビルド出来てしまうため個人的な開発はヘッダオンリで済ませています。
何番煎じの話かもしれませんが、分割するしないでのメリット・デメリットを教えてください。
0758デフォルトの名無しさん
垢版 |
2022/09/26(月) 21:41:04.85ID:yuD7kgln
再コンパイルコストとインターフェイスと実装の分離

hに全部書いてしまうと、それの変更があった場合にincludeするすべてのファイルで再コンパイルが走り、時間がかかるようになる
hに全部書くため、変更の機会も当然多くなり、頻繁にビルド待ちの状態になるのは避けたい

インターフェイスと実装を分離しておくことは、保守や共有の最、理解を早くするという点で有用

どっちの話も大規模になると効いてくる話なので、小規模開発なら全部.hに書くスタイルでも構わないとは思う
0759はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/27(火) 09:30:59.47ID:ozjafOA0
>>757
C の延長線上でなんとかしてきた C++ の言語仕様があんまり良くないんだよ……。
実装とインターフェイスを分けるのはカプセル化の観点からも好ましいのだけれど
C++ ではテンプレートを処理する都合上でこの分離が破綻しているので
そこらへんはまあ運用の工夫で……みたいな微妙な機微がある。

どうにもならんのがわかってるから新しい C++ ではようやくモジュールが導入された。
0760デフォルトの名無しさん
垢版 |
2022/09/27(火) 09:41:59.52ID:ZJUDc1gE
FILE * は使っても
struct FILE の中身なんて知らなくて良いからな
使うだけなら void * で充分
0762デフォルトの名無しさん
垢版 |
2022/09/27(火) 11:20:16.93ID:XJRFtCjW
C#だけでなく今世紀のプログラミング言語は全てヘッダファイルなんて無いんじゃない?
不要なものなんだと思うよ
0764はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/27(火) 14:13:36.82ID:ozjafOA0
>>763
.hpp は C++ のヘッダとしてはありふれた拡張子。 定義を書くかどうかとは関係なく使われるよ。
昔は .hxx とか .h++ とかもあったし、テンプレートが含まれるヘッダには .tcc と付ける習慣が一部にはあった。
大文字で .H とか付けてるのも有ったけどファイルシステムによっては大文字と小文字が区別されないから早い内に廃れたと思う。

C と共用できるように書かれたヘッダを除いては .h という拡張子は避けたほうが運用しやすいと思うんだが、
そこらへんの考え方も慣例が確立していなくてなんだかグダグダなんだよなぁ。
0766デフォルトの名無しさん
垢版 |
2022/09/27(火) 19:06:22.22ID:c5I+FNto
ヘッダはテンプレートでごちゃごちゃしてなければどんな構造してるのかパッと見で分かりやすい
0767デフォルトの名無しさん
垢版 |
2022/09/27(火) 19:11:23.36ID:3EQ0ZEAi
ヘッダに実装書く必要がある場合は
俺はインターフェース用ヘッダと実装用ヘッダに分けてるな
ヘッダには本来インターフェースのみが簡潔に書かれているのが望ましいと思う
0768デフォルトの名無しさん
垢版 |
2022/09/27(火) 20:14:12.91ID:eLTt/hKm
他のプログラミング言語はヘッダファイルが無くても困っていないから
ヘッダファイルは大昔当時のCコンパイラがサボるために用意しただけの本来は要らない子なんじゃ?
0769デフォルトの名無しさん
垢版 |
2022/09/27(火) 20:35:59.29ID:c5I+FNto
ソース公開出来ないようなハード実装ライブラリを隠蔽して提供するためにはヘッダは必須項目
0771デフォルトの名無しさん
垢版 |
2022/09/27(火) 20:49:31.24ID:3EQ0ZEAi
>>768
必須じゃないけど便利だよ
使いたいけど実装なんか見たくないときは
プロトタイプだけヘッダに書かれてれば
それだけ見てれば良い
0772デフォルトの名無しさん
垢版 |
2022/09/27(火) 21:01:15.67ID:uWssz7Bg
>>771
時代遅れすぎだろw
今はそんなヘッダファイルを見なくても
ヘッダファイルが存在しなくても
ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
だからC/C++以外はヘッダファイルなんて存在しない
0773デフォルトの名無しさん
垢版 |
2022/09/27(火) 21:05:03.18ID:3EQ0ZEAi
>>772
>ソースファイルから自動抽出されたもっと見やすい表示や生成ドキュメントを見る
それはヘッダがないから仕方なくなのではないかな?
C++でも自動抽出ツールされたドキュメントを見ても良いのだよ
0776はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/27(火) 21:23:27.93ID:ozjafOA0
実装とインターフェイスを分離するという根本思想自体はよかったと思う。
それを実現するためにプリプロセッサで単純にヘッダをはめ込むというのは雑すぎるやり方だとも思う。
0777デフォルトの名無しさん
垢版 |
2022/09/27(火) 21:36:37.50ID:D5WhN1Dz
他の言語はヘッダ無くても何も困っていないから
本質的にはヘッダは不要物なのだと思われる
0780デフォルトの名無しさん
垢版 |
2022/09/27(火) 22:39:41.48ID:EwsxhlHO
仕組みが簡潔でドライなシステムを好む人もいるし
もはや把握しきれないカオスなシステムに帰依する人もいる

俺は前者だし、これからもそうありたい
0782デフォルトの名無しさん
垢版 |
2022/09/27(火) 23:37:44.35ID:3EQ0ZEAi
実装とインターフェイスの分離の点でC++が甘いのは
classのメンバー変数がヘッダに書くところ
俺はデフォルトでpimplにしてるけど
0783デフォルトの名無しさん
垢版 |
2022/09/27(火) 23:55:22.40ID:TrPk/9km
>>780
最近の言語はどれもその簡潔な方式だよ
ヘッダファイルとソースファイルは二重管理だからソースファイルに統一
さらにソース付随コメントとドキュメントファイルも統合してソースファイルにのみ記述
シンプルになってる
0784デフォルトの名無しさん
垢版 |
2022/09/28(水) 00:14:01.17ID:SR5jaMok
自動生成みたいなことしても、特に見通しがよくなっとらんと思うんだよね
ヘッダファイルじゃなくてもいいけど、どこかでユーザにインタフェース提示を強制する必要はある気がする
0785デフォルトの名無しさん
垢版 |
2022/09/28(水) 00:21:27.19ID:2Lj4foK2
>>784
多くの言語は関数定義かそのままインターフェース宣言を兼ねていて一元化されてるよね
バラバラに用意することこそ不自然なのよ
0786デフォルトの名無しさん
垢版 |
2022/09/28(水) 00:52:38.13ID:qgMCZEH2
いや俺はインターフェースは簡潔にヘッダーにまとまってる方が良い
管理が二重になっている云々は同意せんでもないが
同一性はコンパイラがチェックしてくれるので全く問題なし
ドキュメントの自動生成ってリアルタイムに更新してくれるんかいな?
Doxygenみたいなのを想像してるんだが?
0787デフォルトの名無しさん
垢版 |
2022/09/28(水) 00:54:10.34ID:qgMCZEH2
C++に慣れすぎて実装とインターフェースが混在してるソース見ると
俺は読みたくなくなるんだが?
0788デフォルトの名無しさん
垢版 |
2022/09/28(水) 00:57:52.51ID:ipyGSCwr
>>787
めちゃめちゃわかりすぎる
関数なりクラスなりの定義部分だけ切りだして別ドキュメントにまとめてくれや(’A’)
っていう気分にいなる
0789デフォルトの名無しさん
垢版 |
2022/09/28(水) 01:57:05.38ID:wKFGQzb0
>>785
いや兼ねていてというか、ない
だからサポートするソフトが何らかの方法で提示してるんだけど、必ずしも見やすくなってないのは問題
0790はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/28(水) 02:35:16.76ID:koSj9wX0
>>768
ヘッダを分けるのは最初は処理系の実装上の都合だったのは事実だと思う。
素朴なオブジェクトファイルは名前とアドレスの組でしか管理していない。
具体的な型をやりとりする仕組みは必要で、それがヘッダファイル。

リンカなどのツールチェインが充実していないのを
コンパイラとプリプロセッサがカバーする形なのでツールチェイン全体が上手く連携できるなら
ヘッダという仕組みは無くても良い。

それはそれとして処理に必要かどうかと言語の表現はまた別問題だ。
原理的に必要かどうかだけで言うならバイナリエディタだけあればプログラムは作れることになってしまうよ。
言語は機械に処理させる以上に人が読み書きする。

もちろんどんな言語が分かり易いかは人によるだろうけども
C++ に満足している C++ ユーザは実装とインターフェイス分離することを利点だと考えている場合は確実に多いよ。
私もそうだし。
0791デフォルトの名無しさん
垢版 |
2022/09/28(水) 05:55:54.63ID:8U6H9Gn3
単にヘッダファイルに慣れていて愛着があるだけです
冷静に考えれば分かります
他の言語はヘッダファイルがなくても機能しています
つまりヘッダファイルは不要なものです
他の言語はヘッダファイル方式を採用しませんでした
つまりヘッダファイルを採用するに値するアドバンテージはありません
0792デフォルトの名無しさん
垢版 |
2022/09/28(水) 08:10:47.02ID:PNF1OAD8
今は必要に応じてIDLを使うようになっているだけじゃない?Protobufぐらいしか知らないけど。
0794デフォルトの名無しさん
垢版 |
2022/09/28(水) 09:19:16.30ID:H8fqr1nL
c#のプロジェクト、実装してから設計起こした様なグダグダなのばっかになってるよね
pythonだとそうはならん気がするけど
0795デフォルトの名無しさん
垢版 |
2022/09/28(水) 22:49:08.92ID:6+yt9OFm
obj や lib だけを提供する場合は、ヘッダは絶対に必要かと
他の言語ではどうしていますか?
0796デフォルトの名無しさん
垢版 |
2022/09/29(木) 03:41:22.05ID:6tct/z4w
ヘッダは無くてもいいがある方が便利なときがある

使い回すマクロの定数とか定義とかヘッダに書くのが一般だし
誰かが書いてたけどヘッダファイルに関数の説明とか書くスタイルなら
そこだけ見れば済むようになるし

無くても困らないけど結局は
include xxx.c なんてソースコードを見ることなると思う
0798デフォルトの名無しさん
垢版 |
2022/09/29(木) 04:34:33.18ID:MD5zUQsY
ラムダ式でコピーキャプチャした変数ってなんでデフォルトで immutable なの?

あとそれに関連してるかもしれないけど、const int a があったとして、a をコピーキャプチャして mutable をつけたラムダ式の中で a を変更しようとすると許されないんだけど、これもなんで?
0800デフォルトの名無しさん
垢版 |
2022/09/29(木) 07:34:10.57ID:u1XdWODd
ミスか?
俺はGJと思ったぞ
constの逆は欲しかった
明示的に書き込み許可すんの
0803デフォルトの名無しさん
垢版 |
2022/09/29(木) 13:54:32.28ID:o1fQB+Qf
C++11以前なのでoverride演算子がないソースコードなのですが、
派生クラスでオーバーライドされている関数を簡単に見つける方法って
ありますか?
virtual関数を1つずつgrepするしかないですかね。
0804デフォルトの名無しさん
垢版 |
2022/09/29(木) 14:30:55.43ID:o/ss6osA
>>803 何の前提も無ければ自分がソース持ってないところでオーバーライドされてる可能性もあるので、
いろいろ前提を絞らないと無理かと。
override (「演算子」じゃなくて「キーワード」)があったとしても、付け忘れてる可能性もあるし。
0805デフォルトの名無しさん
垢版 |
2022/09/29(木) 15:19:58.87ID:o1fQB+Qf
>>804
失礼、修飾子でした。
やっぱそうですよね。
継承が3階層あって、その中間階層クラスのメンバ関数なので調べにくいのですが、
地道に1つずつチェックしようと思います。
0806デフォルトの名無しさん
垢版 |
2022/09/29(木) 15:27:09.76ID:OAAH5wr1
ヘッダに実装が書かれててもエディタでショートカット1個押して折りたたむだけでインターフェースすぐわかるくね?
0807デフォルトの名無しさん
垢版 |
2022/09/29(木) 17:04:17.17ID:nKyEXpsu
まっとうならバイナリなりだけ開発環境でインポートすれば、
綺麗にインターフェイスが見える。
0808はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/29(木) 17:12:42.79ID:xXycU9Ev
共有オブジェクト (ダイナミックリンクライブラリ) の段階にまでなってしまうと型は別のところから与える必要があって、
基本的にはビルドの時に型情報を表すなんらかのファイルも生成できるけど、めんどいのは言語をまたぐときなんよね。
Windows API はいろんな言語から使えるような (バインディングの生成元に出来るような) メタデータを提供するという形で
対処しているのでこのへんは Windows API に限らず使いやすいように規格化や環境整備が進むことを期待している。
0809803
垢版 |
2022/09/29(木) 17:14:04.54ID:o1fQB+Qf
今はLinuxでgcc+vimを使っています。
どういう環境なら見えますか?
0811はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/09/29(木) 21:13:35.71ID:xXycU9Ev
>>809
近頃は vim も LSP に対応してるはずだから clangd と合わせて使えばいいんでないの。
わいは vim についてはよう知らんけど VSCode では出来ているから原理的には出来るはず。
0812デフォルトの名無しさん
垢版 |
2022/09/29(木) 21:39:32.67ID:o1fQB+Qf
>>810,811
似たようなツールでdoxygenを使ったら簡単に見つけれるようになりました~
ありがとうございます!
0815デフォルトの名無しさん
垢版 |
2022/10/03(月) 10:37:30.67ID:BGisZcin
>>795
obj と lib と h (hpp) だけじゃ不十分
バージョン管理も必要
これ重要
0816デフォルトの名無しさん
垢版 |
2022/10/03(月) 10:40:19.01ID:BGisZcin
>>790
template ですね判ります
0817デフォルトの名無しさん
垢版 |
2022/10/05(水) 11:46:44.33ID:qhw2L+Ej
サイズが可変な自作クラスXのvectorを持ちたいとします。
このとき、Xの実体をいくつかvectorに入れて不用意に各要素のサイズを変更すると、メモリの割り当てがおかしくなりますよね?
実体ではなくポインタを持つ以外のワークアラウンドはありますか。
0820デフォルトの名無しさん
垢版 |
2022/10/05(水) 12:38:22.59ID:zqJzN+DI
>>817
出来ます
Xの参照(ポインタ等)のベクターを持ちます
Xのサイズが可変でバラバラでも構いません

もしXのサイズに上限値があるならば
別の方法としてその上限値サイズのベクターを用意する方法もあります
0823はちみつ餃子 ◆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 もそれ自体の大きさは一定。
内部的にはポインタで保持してる。
0824デフォルトの名無しさん
垢版 |
2022/10/06(木) 11:24:20.53ID:0pxze5TV
やっぱり817が思ってる「おかしくなりますよね?」の最小コード提示してもらわないと
実はそれおかしくならないって結論になりそうなんだが?
0825デフォルトの名無しさん
垢版 |
2022/10/06(木) 14:37:24.06ID:BJfOFqw4
つまりおかしくなる理由が分からない人が相談に答えようとしているわけだな。
0827デフォルトの名無しさん
垢版 |
2022/10/06(木) 18:12:29.65ID:nyTo+ttU
「サイズ(sizeof)が可変なクラス」なんて存在しないから817が何かを勘違いしてるのは確かだが
何をどう勘違いしてるのか分からんからお前さんの信念でコード書いてみなって話だろ
別におかしくない
0829デフォルトの名無しさん
垢版 |
2022/10/07(金) 02:21:50.23ID:qb/V/k6I
>827
単にお前の読解力の話でしかなかったのか。
「サイズが可変な」はvectorに掛かってると考えるだろうふつう。理由は
> 「サイズ(sizeof)が可変なクラス」なんて存在しないから
と自分で指摘してるとおり。
0830デフォルトの名無しさん
垢版 |
2022/10/07(金) 06:51:34.90ID:iCJcr8aJ
「サイズが可変な」はクラスに掛かってると考えるだろうふつう。vectorは当然サイズ可変なんだから
0836デフォルトの名無しさん
垢版 |
2022/10/07(金) 11:13:53.12ID:p6wqSRzL
817の類似
https://ideone.com/81vcNn
e1, e2 と list の要素は別物だけど (2) の操作で list も同じく反映するようにするには
list を vector<X*> として ポインタ渡す他に何か手段あるのかな
0837デフォルトの名無しさん
垢版 |
2022/10/07(金) 11:34:57.30ID:fogpWmkA
std::vectorもboost::multi_arrayも要素数の変更ができるけど、その可変可能個数要素を格納する領域はクラスのインスタンスとは別のヒープ領域に確保されるようになっていて、クラスのインスタンにはそのヒープ領域へのポインタが格納される
したがって要素数を変更してもクラスのインスタンのサイズは変わらない
だよね?
0840デフォルトの名無しさん
垢版 |
2022/10/07(金) 12:34:55.78ID:UqkGeV53
>>836
listに手を入れるとか手段はあるだろうけどそもそも
> list を vector<X*> として ポインタ渡す
で何が問題なのかを書いた方が良いかと
0841デフォルトの名無しさん
垢版 |
2022/10/07(金) 12:43:53.29ID:p6wqSRzL
>>840
自分で質問しといてなんだけど、たいした問題点でもなかったりするんだよな…

vector<X*> list; だと要素をアクセスする際に記述が煩雑になるところ
 list[i]->size(); ←おけ
 list[i]->push_back(hoge); ←おけ
 (*list[i])[j]; ←きもい
0842デフォルトの名無しさん
垢版 |
2022/10/07(金) 12:54:10.56ID:p6wqSRzL
実体のポインタを list に詰まず new したものを詰んだ場合
お漏らしやタングリングポインタになるかもしれんってのもあるかな
これだと問題点が前提とは別のところになりそうではある
0843デフォルトの名無しさん
垢版 |
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];
0844デフォルトの名無しさん
垢版 |
2022/10/07(金) 14:39:47.78ID:UqkGeV53
>>841
>  (*list[i])[j]; ←きもい
list[i]->operator [](j) ← う~ん、もっときもいかw

>>842
まあ今時生ポインタは使わんわな
shared_ptr とかを入れれば多少安全かと
0847デフォルトの名無しさん
垢版 |
2022/10/07(金) 19:57:27.07ID:T/Xux0J0
>>845
それはただのポインタトリックであってsizeof(info_t)が可変になる訳じゃない
というかそのページでもsizeofのこと説明してんじゃん
相変わらずの無能っすね
0848デフォルトの名無しさん
垢版 |
2022/10/07(金) 20:10:14.06ID:Znh4X5V+
>>847
元の質問>>817はサイズが可変としか言っていない
つまりsizeofが固定であり可変でないという話こそどうでもよい話
本件は>>845氏の指摘する可変なサイズの構造体を作れる話が適切に該当していると思う
0851デフォルトの名無しさん
垢版 |
2022/10/08(土) 03:10:20.17ID:fnM9fLAu
クラスメンバBの初期化が終わる前に、メンバAのコンストラクタにBのアドレスを渡すのって合法ですか?
0852デフォルトの名無しさん
垢版 |
2022/10/08(土) 08:08:39.60ID:i+QsN2sY
マルチアレーで思い出したけど、多次元配列クラスのSTL入ってどうなった?
boostとか自作クラスで対応せよってのは暴論だぜ
前者はパフォーマンス微妙だし管理されてない、後者はそれ言うなら何でもそうじゃん
0857デフォルトの名無しさん
垢版 |
2022/10/08(土) 15:08:15.47ID:a+ry7eGB
>>852
std::mdarrayのことなら揉めに揉めて伸びに伸びて今は一応C++26の予定
でもまだグチグチ揉めまくって収拾がつかなそうだからもう無理じゃないかな
代わりにstd::mdspanっていう配列に被せるガワが入りそう
0858デフォルトの名無しさん
垢版 |
2022/10/08(土) 15:56:11.12ID:Ys4Rhd8B
各次元の長さが可変で、全添字の走査が速くて、メモリの並びがFortran流かC流か選べるだけで良いのに何を揉める必要があるのか
0859デフォルトの名無しさん
垢版 |
2022/10/08(土) 16:31:31.20ID:wlHp0G63
その程度なら自前で直ぐに作っちまいそうだが
標準に入ってることが意味あるんだろうな
0860デフォルトの名無しさん
垢版 |
2022/10/08(土) 18:03:00.23ID:Ys4Rhd8B
そりゃそうじゃね
「std::vectorよりも自作の配列クラスの方が優れてる」という主張が本当だったことがない
0862849
垢版 |
2022/10/08(土) 20:25:53.87ID:wHqQf0MD
すいませんでしたw
0866デフォルトの名無しさん
垢版 |
2022/10/09(日) 20:20:03.73ID:30oWykTj
>>865
実際自分にとってはそんな感じですね。C++でpython とcudaとかopenmpを糊付けしている感覚があります
0867デフォルトの名無しさん
垢版 |
2022/10/14(金) 14:32:13.11ID:hVSCfGeq
set, mapというデータ構造があります。
mapはキーと値のペアをハッシュテーブルや2分探索木に格納しているのでしょうか?
0870はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/14(金) 15:26:57.00ID:rgl2oNFZ
>>869
データの性質や使い方によるのでなんとも言いにくいが基本的にはハッシュテーブルが速いことは多い。
差し替えるのは簡単だろうし、やりたいことをとりあえずやってみて測定すればいいんでね?
0871デフォルトの名無しさん
垢版 |
2022/10/14(金) 15:33:11.96ID:IS1pk00F
>>869
実際にベンチマーク取らないとわからない。
基本的には種類が少ない場合は計算の軽い探索木が、多い場合は定数オーダーのハッシュが有利。
0873はちみつ餃子 ◆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 のほうが不利になる可能性もある。
0874デフォルトの名無しさん
垢版 |
2022/10/15(土) 18:57:25.60ID:b3v/HVBd
C++の例外処理は、class SomeClass {}; と中身の無いクラスであっても、
throw SomeClass{}; をcatch(SomeClass) {・・・}
で受け取ることが出来るらあしいけど、
どういう仕組みでcatchは、例外の種類を識別してる?
"SomeClass"のようなclass名の文字列のポインタでも一緒に渡している
のだろうか?
typeid(x)は、RTTI(実行時型情報)が必要で、仮想関数が定義されて無いクラス
に対しては上手く働かないのではなかったっけ?
0875デフォルトの名無しさん
垢版 |
2022/10/15(土) 21:57:03.29ID:QGPaA4bd
まず基本を禿の本でも規格票でも読んで
C++例外処理ってそもそも何ってとこをわかってから
出直したら? そんな有様じゃマトモなレス付かないよ
0876デフォルトの名無しさん
垢版 |
2022/10/15(土) 23:57:29.06ID:xWZqYwiR
>>874 typeid と同等の情報で照合すれば可能ではあるんだから、何を不思議に思うことがあるのか。
「上手く働かないのでは」なんて言うぐらいならコード書いて確かめればいいだろうし。
0877はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/16(日) 01:59:22.59ID:SvF0Fhwf
>>874
例外を送出してスタックの巻き戻しをするのは例外を送出する側 (受け取る側ではなく) なんだよ。
つまり送出される例外オブジェクトの型はわかっている。
むしろどこまで巻き戻せばよいか (送出されるオブジェクトの型に対応する catch はどこにあるか) の情報が動的なものだ。
0878デフォルトの名無しさん
垢版 |
2022/10/16(日) 14:48:55.82ID:pwk0SnpM
メンバ変数をまったく使っていないメンバ関数を見つける方法ってなんかある?
CppCheckとかでできるんだっけ
0881デフォルトの名無しさん
垢版 |
2022/10/16(日) 17:21:15.08ID:Y43orZLw
typeid(x)の返すオブジェクトは完全にtype_info型なのか、
それとも、type_infoを継承したクラスなのか、どっち?
0884デフォルトの名無しさん
垢版 |
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の中身だったものを削除する。

というような流れになるという理解で合ってる?
0886デフォルトの名無しさん
垢版 |
2022/10/17(月) 23:46:42.02ID:K/vFJtXQ
>>885
特に確認したいのは、
>3. (1)の式の最後で、右辺のオブジェクト y に対してデストラクタが呼び出される。
の部分。
stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
らしいが、それは常に正しいのかな?
0887デフォルトの名無しさん
垢版 |
2022/10/18(火) 00:25:45.29ID:FMJmuyaZ
>>886
> stroustrup氏によれば、yに対するデストラクタが必ず呼び出される、ということ
> らしいが、それは常に正しいのかな?
そういう型を作ることはできるけど、そんな動作をしたらスコープアウトで走るデストラクタを
止めないといけなくなって非常に使いづらくなる。正しくなさそう。
あなたが何か読み間違えてるものと思われる。
0888デフォルトの名無しさん
垢版 |
2022/10/18(火) 00:27:10.46ID:LFBcX+LO
>>887
move代入の右辺のオブジェクトは、事後にデストラクタが呼び出される、
と書いてあったと思うが。
0890デフォルトの名無しさん
垢版 |
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;}
0892はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/18(火) 12:16:32.80ID:PTXT62EI
>>888
右辺と右辺値を混同しているとかじゃない? 右辺値と右辺値参照も違う概念。

右辺値 (というか prvalue) が完結式の終わりで解体されるのは保証された動作だけど、
std::move でキャストした結果はあくまでも参照を右辺値参照として返すってだけで
元のオブジェクト (この場合は y) は依然として左辺値だよ。
y のデストラクタが呼ばれるのは y のスコープの終わりであることは保証される。
0893デフォルトの名無しさん
垢版 |
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のデストラクタが呼び出されることを前提に処理しなければならない、
ということになる。
0894デフォルトの名無しさん
垢版 |
2022/10/19(水) 02:44:50.18ID:ACk8fEyB
>>893
誤字訂正です:
誤: ということになることは間違いなのですね。
正: ということになることは間違いないのですね。
0895はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/19(水) 04:13:29.85ID:CfflWiLk
>>893
そう。 move assignment operator と呼ばれてはいるが
右辺値であるということがわかる以上の違いはない。

ムーブは寿命を左右せず、内容の状態がどうなるかは実装次第。
具体例で言えば std::unique_ptr はムーブ後には空になる (メンバ関数 get は空ポインタを返す) ことが保証されるが、
std::string は (新たな内容が与えられるまでは) 未規定の値になる。

右辺値参照が導入されたのは C++11 からで、
デストラクタのタイミングが変わってしまうような変更を入れられるわけがない。
0896デフォルトの名無しさん
垢版 |
2022/10/19(水) 23:39:12.93ID:8y/Qrf1S
C++で15年ぶりにプログラミングをすることになったんだけど、
C++11以降のことは何も知らないのでまずは復習もかねて勉強することにした
今でもbjarneの本が初心者にとって一番のテキストなの?
それとももっとシンプルで分かりやすい本が出てるのでしょうか?
0899デフォルトの名無しさん
垢版 |
2022/10/20(木) 06:31:14.16ID:pIDfWPXL
>>896
本は読者との相性があるから一概には言えないが
俺的にはやっぱ禿の本だな
変に手加減してこないところに安心感がある

ただし「プログラミング言語C++第4版」は
あくまでC++11で、C++14以後には触れていないので
構造化バインディングやコンセプトは学べない
俺はこのあたりはここやQiitaできっかけだけ拾って
あとは規格票やhttps://cpprefjp.github.io/で憶えてる
0900はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/20(木) 13:52:31.60ID:w/WeLGfC
>>896
C++ はごちゃごちゃした歴史的事情を継ぎ接ぎして出来ているので
説明を整理しようとするとかえって事情がよくわからなくなる。
どう頑張ったってそんなに簡潔にはならんよ。

場当たり的に追加された変則的なルールでも
実際に挙動に絡んでくるのなら知っておくしかしょうがないし、
きちんとした説明はそれなりの分量にもなる。
おそらく >>899 が述べる「変に手加減してこない」というのはそういう意味だと思う。
0903デフォルトの名無しさん
垢版 |
2022/10/20(木) 18:47:34.03ID:sgmqUmRA
bj氏の本のダブルディスパッチの部分と、次のVisitorの部分、
どっちもよく分からなかった。
まず、前者のShape&の引数が何のためにあって、どういう役割を果たしているか
誰か教えて。
0904デフォルトの名無しさん
垢版 |
2022/10/20(木) 18:49:51.30ID:sgmqUmRA
>>903
プログラミング言語C++第四版 日本語版の
p.653, 22.3.1 ダブルディスパッチの辺りから。
bool intersect(const Shape&);
関数が無くてもこの例だと動作すると思うんだけど、
なんなん?
0906はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/20(木) 23:26:04.47ID:w/WeLGfC
今でも「ロベールの C++ 入門講座」で学ぼうとしているらしいやつを Teratail や Qiita でたまに見るぞ。

C++03 と C++11 でほとんど互換性は維持されてはいるはずなんだがちょっとは非互換もあるし、
残されている機能でも今となってはあまりお勧めできないということもあるから
なるべくなら新しい本のほうがよいとは思うんだが、
俺自身が読んだことがある本が古すぎていまどきの良い本が全然わからん。
0907はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/20(木) 23:52:16.92ID:w/WeLGfC
>>904
メンバーアクセス演算子によるメンバの選択は抽象クラスなら動的 (仮想関数テーブルを辿る) だが、
引数を元にしたオーバーロード解決は静的型 (static type) の情報が元になる。

静的型はあくまでも Shape だから一旦は Shape& で受けて
オブジェクトと引数を入れ替えてもういちど intersect を呼び出すことで両方とも動的な型でディスパッチすることになるんだよ。

普通はメンバアクセスの側だけが動的ディスパッチだから二つのオブジェクトについて動的ディスパッチをするには
こういうトリックが必要になる。 ふたつの動的ディスパッチをするからダブルディスパッチなの。
0908デフォルトの名無しさん
垢版 |
2022/10/21(金) 03:42:31.85ID:sdgXBR6P
>>907
なるほど。
Shape x, y;
x.intersect(y);
とした場合、x の方は仮想関数で振り分けられるけど、yの方はそんな機能が無いから
ということのようですね。
0909デフォルトの名無しさん
垢版 |
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 については、仮想関数では
そのような意味では振り分けできないから特殊な方法が必要になる、ということですね。
0911デフォルトの名無しさん
垢版 |
2022/10/22(土) 21:57:41.88ID:Q+2x5vm1
モジュールはヘッダファイル・ソースファイルに代わるものと聞きました
これからは今までインクルードしていたものは全てモジュールにすればよいのでしょうか
また、グローバル変数のみのヘッダファイルや、定数のみのヘッダファイルも
モジュールにした方がよいのでしょうか
ビルド時間が速くなるそうなので気になっています
0913はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/22(土) 22:47:49.35ID:+VggblGg
>>911
時期尚早だと思う。
現状の gcc ではオプションに -std=c++20 を付けるだけではモジュールは有効にならず、
明示的に -fmodules-ts を付ける必要があるようにしてあるので、普段使いするにはまだ早いという意図を感じる。
ドキュメントにはまだ完璧じゃないと書いてあるし。
(他のコンパイラの状況は知らんけど。)

それに C++20 の段階ではモジュールの基礎の基礎が決まっただけで
標準ライブラリすらモジュールとして再編できていない。 一応は C++23 でやることになってるけど
現在の C++ の規格は三年ごとに話がまとまった分を入れる、
つまり出来てない分を完成させるために期限を延長したりはせず三年後に先送りするという運用なので
C++23 がどこまで出来るものなのか全然わからん。
標準ライブラリを再編していく内にモジュール機能の問題点が発見されたりするかもしれん。

個人的に遊ぶ分には色々とやってみてわかったことはどんどん発信してほしいけど、
製品レベルのプロジェクトではやめておいたほうがいい。
0914デフォルトの名無しさん
垢版 |
2022/10/23(日) 00:24:14.37ID:Ti8rkbHi
>>913
msvc2022なら、と思いましたがこちらもモジュールはオプションで試験段階のようでした
もう少しvcの更新を経てから新規の小さいプロジェクトで試してみようと思います
0916デフォルトの名無しさん
垢版 |
2022/10/23(日) 08:32:09.89ID:lOKqFCBz
C++17のfilesystemもそうだったけど
練りきれてない未完成品を無理に入れるのやめて欲しい

バグ出ししたいんなら拡張規格かoptionalとして出してみて
標準のmandatoryにするのはしっかり固まってからにしろやって

つーかSTLもboost由来のもISO以外のところでそこそこユーザに揉まれてから来たものだろ
開拓は標準規格の役目じゃねえよ
0917はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/23(日) 10:56:19.39ID:V+VjUFIF
完璧になるまで練ってたらいつまでも進まんから三年ごとに出来た分を規格に入れるという方針に変更されたんじゃないか。
不格好でも不完全でも今使えることが大事だというのは元々の理念だし。

未完成はともかく欠陥報告を乱発するのは良くはないけどさ。
0918デフォルトの名無しさん
垢版 |
2022/10/23(日) 11:55:48.92ID:d3fh3q91
使ってる所だけ直せばいいライブラリと違って(だからって良いわけじゃないけど)
モジュール作り込んでからやっぱdefectでしたって言われたら困るからなあ
0922デフォルトの名無しさん
垢版 |
2022/10/23(日) 13:25:59.97ID:lOKqFCBz
C++17の時点ではfile_clockがなかった
0924デフォルトの名無しさん
垢版 |
2022/10/23(日) 14:45:23.56ID:lOKqFCBz
あったけど使いものにならんかった
0925デフォルトの名無しさん
垢版 |
2022/10/23(日) 14:59:53.65ID:NDMzlX+C
その昔、iostreamというのがあってだな
皆阿鼻叫喚の断末魔の雄叫びを上げたもんじゃった
0926デフォルトの名無しさん
垢版 |
2022/10/23(日) 16:01:34.86ID:lOKqFCBz
printfやscanfに毒舌三昧してる人に対して持っていた、お暇な方ですねという思いが蘇る
0927はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/23(日) 17:49:58.24ID:V+VjUFIF
ファイルシステムやらスレッドやらはシステム (OS) 側の都合があるからなぁ。
細かいことは環境依存の機能を使えという前提で
標準ライブラリを最小限にとどめるのは C の時代からの基本的な姿勢だっただろう。

環境依存だからこそ標準で吸収しておいてくれという気持ちもあるし、
現状が良いとも思わんけど…… なんというか……
C++ ってそういうもんだろと思って納得してるから不満には感じないな。
0928デフォルトの名無しさん
垢版 |
2022/10/23(日) 20:20:25.05ID:7je1ARgT
iosteamはいかにもC++初心者がやりそうな「オペレータをオーバーロードできるから
見た目イカすちょっとシャレた表記法にしようぜ!!」っていう厨二スピリット全開だったからな
でてきた時点で「あ、これはクソなやつだ」ってわかったよ
0929デフォルトの名無しさん
垢版 |
2022/10/23(日) 20:43:19.02ID:lOKqFCBz
C with classesを始めようとして
たとえばと始めたことをずいぶん後になって
鬼の首を取ったようにキリッ
0930デフォルトの名無しさん
垢版 |
2022/10/23(日) 22:04:42.81ID:d3fh3q91
演算子チェーン自体は別に悪いもんじゃない
iostreamがクソなのはそこじゃない
0932デフォルトの名無しさん
垢版 |
2022/10/23(日) 23:18:01.98ID:a4G1Se92
なにかとiostream叩かれやすいけど
よく聞いてみると大した批判ではないよね常に
聞くに値するiostream批判ってお目にかからないね
0933デフォルトの名無しさん
垢版 |
2022/10/23(日) 23:21:04.29ID:HPAI20x7
iostreamが本当にクソならイカした再実装はあるだろう?
まさかcstdioとか言わんでくれよ
0934デフォルトの名無しさん
垢版 |
2022/10/23(日) 23:23:02.52ID:d3fh3q91
まあstd::cout << foo << bar;がつい最近まで規格上未定義動作だったのは擁護のしようがないけどな
0935はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/23(日) 23:33:00.12ID:V+VjUFIF
iostream が設計された当時は I/O のための専用の言語機能が
必要という論調があって、 Bjarne Stroustrup 氏はそれに抵抗して
当時の C++ の範疇でライブラリを作ったという経緯がある。

ここで抵抗しなければ入出力用の文法が (ライブラリとしてではなく)
言語機能として導入することになっていたかもしれないと思うと
iostream にある粗くらいは許せてしまうなぁ。

少なくとも printf みたいな型チェックがガバガバなのは C++ 的に
放置できなかったし、バッファリングと書式化をまとめつつ拡張やカスタマイズが可能で
I/O 以外も含めてストリームというインターフェイスを一般化するというのは
当時としてはこれ以上考えられない素晴らしいデザインだと思う。

ひとつこれは (iostream 設計当時でも) どうにかできただろうと思うのは
書式の変更 (マニピュレータを使うなど) をしたら陽に戻すまではそのままというのが良くなかった。
スコープを抜けたらリセットできるような方法が標準で欲しかった。
(boost にあったような気がするが名前を忘れてしまった……。)
0936デフォルトの名無しさん
垢版 |
2022/10/23(日) 23:47:22.83ID:d3fh3q91
ステートはクソで出来るだけ無くすべきっていう現代の常識が当時はなかったからな
書式をストリームのステートにしてしまったのは今思えば大失敗だがあの時代は自然な設計だったんだろうな
0938デフォルトの名無しさん
垢版 |
2022/10/23(日) 23:48:47.26ID:a4G1Se92
批判する者にその資格が無いってパティーン多々あるよな
iostream批判するやつだって
じゃあどんな素晴らしい入出力ライブラリを用意したの?
実装したの?どこの誰がどれだけ使ってるの?っていう
タダ飯喰らいがかーちゃんのご飯批判してるようなこと
0940デフォルトの名無しさん
垢版 |
2022/10/23(日) 23:56:39.14ID:d3fh3q91
>>937
何だろうと未定義(C++17以前)。なぜなら一つの式の中でstd::coutを2回変更してるから
(a+=1)+=1とか++(++a)とかも同じ
この大欠陥が見つかったせいで、式の中の評価順は基本コンパイラの好き勝手にしていいというCからの伝統を一部諦める羽目になった
0942デフォルトの名無しさん
垢版 |
2022/10/24(月) 00:02:05.10ID:9tRgjj9T
>>940 (a+=1)+=1 も ++(++a) も未定義動作にはならないよ。必ず a が 2 増えて、 a への参照が得られる。
0945デフォルトの名無しさん
垢版 |
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の評価順序が決まって無いかも。
0948デフォルトの名無しさん
垢版 |
2022/10/24(月) 01:00:58.84ID:hB4gzcTK
>>945,946
なるほど言わんとしてることは分かったが
左から順に評価するのが当たり前なのでは?
つまりcout, a, bの順
0949デフォルトの名無しさん
垢版 |
2022/10/24(月) 01:15:48.16ID:g4dlefHT
>>948
実は、x86などでは、スタックが、メモリーアドレスの大きい方からから小さい方
に成長するようになっているので、引数は右側から左側に評価した方が効率が良い。
そのため、逆さまに評価する処理系があっても不思議ではない。
0950デフォルトの名無しさん
垢版 |
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|のチェーンの検討をしてるときに発覚してみんな真っ青になって慌てて評価順のルールが見直されたっていう、まあアホ臭い話でした
幸い病的な最適化コンパイラが生まれる前だったから規格文言だけの話で実害はない
0952デフォルトの名無しさん
垢版 |
2022/10/24(月) 02:10:09.65ID:JEuztk1D
9か5かってのは説明上の話で、実際は未定義で鼻から悪魔だから9でも5でも0でも-1でも42でも4394967295でもどんな可能性もあった
今の規格では必ず9になった
0954デフォルトの名無しさん
垢版 |
2022/10/24(月) 02:19:24.78ID:od8Ytdiw
operator<<が触ってるcoutのメンバ変数やグローバル変数にスカラーオブジェクトが一切含まれてなければ関係ないけど普通はそんなはずは無い
0955デフォルトの名無しさん
垢版 |
2022/10/24(月) 07:45:35.99ID:bUVy0t4Y
テキストがバラけたり変数の並び順を変えられなくてi18n対応が困難になるのがiostreamの一番の問題かな
0956デフォルトの名無しさん
垢版 |
2022/10/24(月) 08:12:37.76ID:OQANp5iI
>>950
実際どっちが正しいかは知らんが説明がよくわからん。
cout << foo << bar の例えに (a+=2)*=3 を持ってくるのは正しいのか?
0957デフォルトの名無しさん
垢版 |
2022/10/24(月) 09:31:36.65ID:9tRgjj9T
>>950
> それが「単一式で同じオブジェクトを2回変更したら未定義」というもの

C++11 より前のシーケンスポイント(副作用完了点よるルールの話だとしても関数呼び出しの前後には
シーケンスポイントが入るので cout の operator<< で未定義動作が起こるような話にはならない。
0958デフォルトの名無しさん
垢版 |
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.
0959デフォルトの名無しさん
垢版 |
2022/10/24(月) 23:16:53.41ID:Fd/xLFmz
どなたか、clangコンパイラのソースコードで、main()関数がどのソースファイル
にあるか分かりませんか?
0961デフォルトの名無しさん
垢版 |
2022/10/24(月) 23:50:22.01ID:Fd/xLFmz
>>960
もちろんgrepはしていますが、
test用のソースコードなどに大量に出てきてしまうのでどれか分からないのです。
探しているのですが、むしろ、clangコンパイラ自体のmain関数は存在して
無いのではないかと思えてしまいます。
0962デフォルトの名無しさん
垢版 |
2022/10/25(火) 00:20:05.85ID:ALWiFOZj
>>961
grepでtestっぽいのを除外していけば見つけられると思うけど、
スマホでgithub見た感じdriver/tools/driver.hppじゃね
0963デフォルトの名無しさん
垢版 |
2022/10/25(火) 00:20:30.61ID:ALWiFOZj
まちがえたdriver.cppね
0964デフォルトの名無しさん
垢版 |
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));
}
0965デフォルトの名無しさん
垢版 |
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が使えなくて、困っています。
同じような課題を諸先輩方は
どのように解決されましたか?
0968はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/25(火) 15:54:18.45ID:kIG3TWOj
>>964
参照を剥がすのを入れるのが常道じゃないかな?

template<class T>

requires std::integral<std::remove_reference_t<T>>

void func(T&&);
0969デフォルトの名無しさん
垢版 |
2022/10/25(火) 16:15:10.24ID:2SxwmPby
>>966
大変失礼しました。
アドバイスありがとうございます。
0971デフォルトの名無しさん
垢版 |
2022/10/25(火) 18:13:31.96ID:UwkZi3XT
>>962
ありがとう。関数名が main() ではなく、
clang_main()
なんですね。
cmakeすると、これがすぐ呼び出されるような main() 関数が
作られるようです。
cmakeがどういう仕組みでそうやっているのかは分かりませんが。
0972デフォルトの名無しさん
垢版 |
2022/10/25(火) 18:15:07.22ID:UwkZi3XT
>>962
古いWzEditorのgrepを使ってるんですけど、除外フォルダが指定できないんです。
何かいい方法は有りますかね。
0973デフォルトの名無しさん
垢版 |
2022/10/25(火) 20:38:52.33ID:m6AygvvN
どっちかってーと リンカで実行時のエントリポイントを細工してるんじゃないのかな?
0974デフォルトの名無しさん
垢版 |
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);
 }
0976デフォルトの名無しさん
垢版 |
2022/10/26(水) 01:09:20.17ID:AzbtQsoy
>>971
ごめん、tools/driver/driver.cppだった。321行目あたりにmainあるけどこれじゃないの?
>>972
msysとかgit bashとかwslのgrepを使う、じゃダメ?vscodeでも除外設定はできるけど
0977デフォルトの名無しさん
垢版 |
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));
・・・
}
0978デフォルトの名無しさん
垢版 |
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); }
のような一行の関数が出来ます。
0979デフォルトの名無しさん
垢版 |
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 が
生成したものと思われます。
0980デフォルトの名無しさん
垢版 |
2022/10/26(水) 09:07:24.21ID:AzbtQsoy
>>978-979
なるほどすまんかった。
たまたま古いソースをみてたからmainを見つけられたんだね。勉強になりました。
0981デフォルトの名無しさん
垢版 |
2022/10/26(水) 09:39:06.48ID:8n8wOLOb
>>968
やはりrequiresを1行足すしかないか...

template<allow_ref<std::integral> T>
void func(T&&);

とでも書きたかったけど、コンセプトを受け取るテンプレートが書けないっぽいから諦めた
0982デフォルトの名無しさん
垢版 |
2022/10/27(木) 02:01:40.47ID:XIiqnbUh
clangのソースで、CPUのマシン語を生成している場所を調べていて、
X86AsmPrinter クラスや X86MCInstLower クラスがそれに強く関与していることが分かって
きました。
X86AsmPrinter クラスや X86MCInstLower クラスは、お互いに参照されてますが、
この2つのクラスは、いずれも「作られている場所」が見つかりません。
「作られている」とは、new X86AsmPrinter や、X86AsmPrinter a;、
new X86MCInstLower や X86MCInstLower b; のようにしている場所です。
どなたか分かりませんか?
0983デフォルトの名無しさん
垢版 |
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;
}
・・・
};
0985デフォルトの名無しさん
垢版 |
2022/10/27(木) 02:44:18.56ID:XIiqnbUh
間違えました。
xxx.AsmPrinterCtorFn に登録しているのは、new X86AsmPrinterの
アドレスではなく、
RegisterAsmPrinter<X86AsmPrinter>::Allocator(・・・)
のアドレスのようですね。
そして、このAllocator (==関数)を呼び出すと、new X86AsmPrinter
を行なえるようです。
0986デフォルトの名無しさん
垢版 |
2022/10/27(木) 08:37:49.38ID:yP/aIJbf
関係ないけどあんまりnewせんほうがええよ
それしかないと思ってるならちょっと古い感じ
0987デフォルトの名無しさん
垢版 |
2022/10/27(木) 22:03:08.74ID:+UGgATct
あんまりデータメンバに直アクセスしないほうがええよ
あんまりグローバル変数使わんほうがええよ
あんまりSendMessageを直に使わんほうがええよ
あんまりナマポ使わんほうがええよ
あんまりアセンブラ使わんほうがええよ
あんまりC++使わんほうがええよ

ラップしろってことだろうけど
一切離れたやつはもうC++使いじゃない
0988デフォルトの名無しさん
垢版 |
2022/10/28(金) 00:40:37.68ID:sQHy7sst
>>986
イリノイ大学のclangやLLVMの開発者に言ってください。
コンパイラでは最先端かも知れませんが。
0990デフォルトの名無しさん
垢版 |
2022/10/28(金) 09:06:12.57ID:kPJo8naK
threadがあんなに使いやすくなっているのは
ひとえにtemplate-parameter-packのおかげ
0994デフォルトの名無しさん
垢版 |
2022/10/30(日) 15:52:08.41ID:zpZIwFpu
仕事ハネた後のヨレヨレ状態で見てるから
長文()を読もうとすると寝落ちしかねない
0995デフォルトの名無しさん
垢版 |
2022/10/31(月) 13:27:29.89ID:Q1JWQuIa
VC++ や GCC で <cstddef> をインクルードすると、
std の明⽰的修飾、using 宣言、using 指令がなくても
size_t が使えるのですが、これは C++ 標準の仕様ですか?
0996はちみつ餃子 ◆8X2XSCHEME
垢版 |
2022/10/31(月) 13:53:23.25ID:HpV/6ZOj
>>995
いいえ。 未規定です。
std 名前空間内で定義されることは当然に保証された動作ですが、
グローバルには定義されてもされなくてもかまいません。
逆に言えばグローバルに定義されていることはありうると想定する必要があります。
(なので自分が定義する名前がそれに衝突しないようにするべきです。)
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 162日 17時間 8分 25秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

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

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