https://mevius.5ch.net/test/read.cgi/tech/1589424805/
※前スレ
C++相談室 part152
https://mevius.5ch.net/test/read.cgi/tech/1594528940/
テンプレおしまい
C++相談室 part153
レス数が900を超えています。1000を超えると表示できなくなるよ。
2020/10/10(土) 23:18:20.00ID:i4F+i14Y
825デフォルトの名無しさん
2020/12/21(月) 12:52:20.80ID:XzTX0Cyb SVDとかするなら自前実装なんか無駄だからeigen使う。それ以外なら>>822 の通りだな。
826デフォルトの名無しさん
2020/12/21(月) 19:14:50.06ID:5SN4/ItM みなさんありがとうございます
主に多次元の常微分方程式を解く目的でFortranからc++へ移行しようと考えていたのですが、ベクトル和やスカラーベクトル積等の計算がFortranほど簡単ではなさそうに感じて質問しました
eigen等を活用しつつ頑張ってみます
主に多次元の常微分方程式を解く目的でFortranからc++へ移行しようと考えていたのですが、ベクトル和やスカラーベクトル積等の計算がFortranほど簡単ではなさそうに感じて質問しました
eigen等を活用しつつ頑張ってみます
827デフォルトの名無しさん
2020/12/21(月) 20:22:43.20ID:94n2fENi そりゃそうだろな
汎用機の時点で科学計算と銀行計算の両方ができる
だから科学専用に作られているFortranと汎用のC言語は根本的に用途が違う
そもそもFortranの後に作られたのがC言語だし、時期も近いし、
だからFortranで出来ることをわざわざC言語でやったりはしない、
用途での住み分けがそのころからある
後発の方が簡単に出来るというのは幻想
汎用機の時点で科学計算と銀行計算の両方ができる
だから科学専用に作られているFortranと汎用のC言語は根本的に用途が違う
そもそもFortranの後に作られたのがC言語だし、時期も近いし、
だからFortranで出来ることをわざわざC言語でやったりはしない、
用途での住み分けがそのころからある
後発の方が簡単に出来るというのは幻想
828デフォルトの名無しさん
2020/12/21(月) 21:07:13.89ID:HyYYfsZ0 簡単なことは簡単に言え
既成のソフトを使い慣れているならそれを使え
不満があるときに自分の理想との違いを埋めるのに
打って出る手段の1つにプログラミングがある
それはC++に限らない
たまたまC++を選んだのなら自らの名誉に恥じぬ努力をせいや
これまたC++に限ったことではないがな
あれ使えばいいやー、これ使えばいいやー
自分なんか物事を考えるだけ無駄なんだー
↑
こういうスタンスのやつ、俺は反吐が出るほど大大大大大嫌い
既成のソフトを使い慣れているならそれを使え
不満があるときに自分の理想との違いを埋めるのに
打って出る手段の1つにプログラミングがある
それはC++に限らない
たまたまC++を選んだのなら自らの名誉に恥じぬ努力をせいや
これまたC++に限ったことではないがな
あれ使えばいいやー、これ使えばいいやー
自分なんか物事を考えるだけ無駄なんだー
↑
こういうスタンスのやつ、俺は反吐が出るほど大大大大大嫌い
829デフォルトの名無しさん
2020/12/21(月) 23:35:19.34ID:5SN4/ItM ヘッダファイルに
double hoge = 1.0/3.0;
みたいに書いてた場合、除算はどのタイミングで行われるんですか?初回呼び出し時のみですよね?
double hoge = 1.0/3.0;
みたいに書いてた場合、除算はどのタイミングで行われるんですか?初回呼び出し時のみですよね?
830デフォルトの名無しさん
2020/12/21(月) 23:51:47.03ID:3sOyVj6l 大昔(40年ぐらい前?)とかもんのすごい特殊な環境用のコンパイラはしらんが
今の普通のコンパイラではそれはコンパイル時に計算される
今の普通のコンパイラではそれはコンパイル時に計算される
831デフォルトの名無しさん
2020/12/22(火) 00:34:06.43ID:M/dL4DYR >>829
コンパイル時に解決されてると思います
コンパイル時に解決されてると思います
832デフォルトの名無しさん
2020/12/22(火) 00:35:40.93ID:M/dL4DYR すみません、830で回答されてましたね
畳み込み、とかで検索してみては
畳み込み、とかで検索してみては
833デフォルトの名無しさん
2020/12/22(火) 02:07:17.74ID:bzbnZ90n >>826
Fortranでも基本的にblasとかlapackに投げるだけじゃないの?
しかもC/C++からFortranルーチン呼べるし
「FortranではやりやすかったがC/C++ではやりにくかったこと」って非常に興味あるから具体的にどういうものか教えてほしい
Fortranでも基本的にblasとかlapackに投げるだけじゃないの?
しかもC/C++からFortranルーチン呼べるし
「FortranではやりやすかったがC/C++ではやりにくかったこと」って非常に興味あるから具体的にどういうものか教えてほしい
834デフォルトの名無しさん
2020/12/22(火) 06:36:52.20ID:GAvzsgv/ blasとかlapackがfortanで記述されてるからね
中身いじるような人がどれほどいるかはわからんけど
中身いじるような人がどれほどいるかはわからんけど
835デフォルトの名無しさん
2020/12/22(火) 08:38:11.38ID:+a9RX7vJ836デフォルトの名無しさん
2020/12/22(火) 09:08:43.07ID:z2CQLL3J 翻訳(interpret)ですか?
C++はコンパイル言語ではないのですか?
C++はコンパイル言語ではないのですか?
837デフォルトの名無しさん
2020/12/22(火) 09:23:29.08ID:Yt10VcGs 翻訳(translate)でしょ。
838デフォルトの名無しさん
2020/12/22(火) 09:26:00.82ID:AY4u6Qzg コンパイラと構文解析とオートマトンって大学の授業でやったなぁ
839デフォルトの名無しさん
2020/12/22(火) 10:18:51.71ID:hq0fof4K Cコンパイラ作ったよね。
840デフォルトの名無しさん
2020/12/22(火) 12:04:28.60ID:GAvzsgv/ constexprとか中身がどうなってるのかもうわけわからん
841デフォルトの名無しさん
2020/12/22(火) 16:28:31.76ID:cQdMNR1v >>834
中身いじるような人がいないからこそ、fortranで(blasやlapack)でできる線形代数計算はC/C++でもできるだろうと思うのだが
中身いじるような人がいないからこそ、fortranで(blasやlapack)でできる線形代数計算はC/C++でもできるだろうと思うのだが
842デフォルトの名無しさん
2020/12/22(火) 23:28:55.02ID:cWduRySe constexprともなるとどこまでコンパイル時計算してくれるかは
処理系依存と聞く…!
関数が絡んだ場合だけかもしれんが
処理系依存と聞く…!
関数が絡んだ場合だけかもしれんが
843デフォルトの名無しさん
2020/12/22(火) 23:41:36.57ID:Yt10VcGs844デフォルトの名無しさん
2020/12/23(水) 00:29:07.29ID:0vtm2rCB constexpr指定したものはコンパイル計算でしょう?
845デフォルトの名無しさん
2020/12/23(水) 01:06:37.35ID:BffjS4vY >>844
コンパイル時評価可能(コンパイル時に評価するとは言っていない)
コンパイル時評価可能(コンパイル時に評価するとは言っていない)
846はちみつ餃子 ◆8X2XSCHEME
2020/12/23(水) 02:19:42.25ID:wEQUKH0P >>844
constexpr 指定が付いた関数は定数式が要求される文脈において
与えられる引数も定数 (定数式) である場合に限りその関数呼出しは
定数式という扱いになる。
定数式が要求される文脈で入力が定数でないならエラーになるし、
定数式が要求されていない文脈であれば実行時計算だよ。
実行時計算にはならない (実行時計算が必要な文脈だとエラーにする) 指定として consteval が導入されたのは、
constexpr の文脈依存な挙動が面倒だと思ったやつがいたからだと思うよ。
constexpr 指定が付いた関数は定数式が要求される文脈において
与えられる引数も定数 (定数式) である場合に限りその関数呼出しは
定数式という扱いになる。
定数式が要求される文脈で入力が定数でないならエラーになるし、
定数式が要求されていない文脈であれば実行時計算だよ。
実行時計算にはならない (実行時計算が必要な文脈だとエラーにする) 指定として consteval が導入されたのは、
constexpr の文脈依存な挙動が面倒だと思ったやつがいたからだと思うよ。
847デフォルトの名無しさん
2020/12/23(水) 06:16:15.13ID:ZPrNOuha C++はまだ色々と足し続けてるのか
constexprはともかくconstinit, constevalて...
constexprはともかくconstinit, constevalて...
848デフォルトの名無しさん
2020/12/23(水) 06:17:06.41ID:ZPrNOuha まるで言語開発屋のおもちゃじゃねえか
849デフォルトの名無しさん
2020/12/23(水) 08:41:53.85ID:iOQdV6uo 今頃気づいたのw
850はちみつ餃子 ◆8X2XSCHEME
2020/12/23(水) 09:20:18.63ID:wEQUKH0P 自動で呼び分けて欲しいと思うこともあれば
コンパイル時に限って欲しいことだってあるだろう。
コンパイル時に限って欲しいことだってあるだろう。
851デフォルトの名無しさん
2020/12/23(水) 19:37:56.48ID:lj5PdyQr 1秒間に1万回くらい数値判定の計算をしてるのですが
Xが3桁の時のみTrueを返すようなコードで一番速いのってどんなコードですかね?
愚直にif(1000>X>=100)でやるのと
if(10>X/100>=1)ではどっちが速いんでしょうか
Xが3桁の時のみTrueを返すようなコードで一番速いのってどんなコードですかね?
愚直にif(1000>X>=100)でやるのと
if(10>X/100>=1)ではどっちが速いんでしょうか
852デフォルトの名無しさん
2020/12/23(水) 19:39:04.22ID:PgZc4XsV 前者
853デフォルトの名無しさん
2020/12/23(水) 19:43:53.01ID:PgZc4XsV 多くのコンパイラは以下に変形しそうな気がする
if (X-100u<900u)
後者をコンパイラが最適化するかどうかはコンパイラ次第
if (X-100u<900u)
後者をコンパイラが最適化するかどうかはコンパイラ次第
854デフォルトの名無しさん
2020/12/23(水) 19:47:49.74ID:PgZc4XsV PCなら1秒に1万回程度なら気にしなくて良い
8bitマイコンだとこの判定だけでも10個以上の命令になったり
8bitマイコンだとこの判定だけでも10個以上の命令になったり
855デフォルトの名無しさん
2020/12/23(水) 20:03:20.62ID:rWjdGSAm 長さ数十億のbool型配列用意すれば早いんじゃね
isDigit3[x] だけで出るじゃん
isDigit3[x] だけで出るじゃん
856デフォルトの名無しさん
2020/12/23(水) 20:04:42.24ID:psZzhFw3 >>851
それ条件式が間違ってるだろ
それ条件式が間違ってるだろ
857デフォルトの名無しさん
2020/12/23(水) 21:04:06.12ID:oO0RWe4j 根本的には、速度って環境依存の性質だから、本当に重要な話なら実測で確かめるしかない。
一般論としては、現代のコンパイラはそこらの人間より賢いから、やりたいことを素直に書いて最適化を任せるのがいい。
わかってない人が余計なことをやると、かえって遅くなる可能性が高い。
計算量のオーダーを変えるような、アルゴリズムレベルの最適化なら意味があるんだけど。
小手先のテクニックは通用しないと思っていい。
一般論としては、現代のコンパイラはそこらの人間より賢いから、やりたいことを素直に書いて最適化を任せるのがいい。
わかってない人が余計なことをやると、かえって遅くなる可能性が高い。
計算量のオーダーを変えるような、アルゴリズムレベルの最適化なら意味があるんだけど。
小手先のテクニックは通用しないと思っていい。
858デフォルトの名無しさん
2020/12/23(水) 22:00:42.78ID:p3n5tJou859デフォルトの名無しさん
2020/12/23(水) 22:21:55.80ID:JqE6cd4a 最適化にも限界はあるから、どういうコードの書き方ならコンパイラが最適化しやすいか、
ってのを知るのは必要なんやろうね
データアクセスの局所化とか偽の依存関係の除去とか
ってのを知るのは必要なんやろうね
データアクセスの局所化とか偽の依存関係の除去とか
860デフォルトの名無しさん
2020/12/23(水) 23:11:04.90ID:pgaSoeQc typedefで二重定義になった場合さぁ…同じ型だとコンパイルエラーにはならないんだよ…
なんか気持ち悪いので…typedefだけのヘッダーを呼ぶようにしたけど…同じ型だとOKなん?
なんか気持ち悪いので…typedefだけのヘッダーを呼ぶようにしたけど…同じ型だとOKなん?
861デフォルトの名無しさん
2020/12/23(水) 23:12:13.58ID:pgaSoeQc ヘッダーに渡しても同じことか…相互参照してるんだった…
862デフォルトの名無しさん
2020/12/23(水) 23:13:21.42ID:pgaSoeQc 一応…間違えないように…ヘッダーに集約しておく…
863デフォルトの名無しさん
2020/12/23(水) 23:13:34.29ID:KqYWGLnc Ruby VM では、1秒間に、100万回ループすると、
Ruby中間言語を、JIT で機械語にコンパイルして、
1秒間に、1,000万回ループ出来るようになる
Ruby中間言語を、JIT で機械語にコンパイルして、
1秒間に、1,000万回ループ出来るようになる
864デフォルトの名無しさん
2020/12/23(水) 23:43:55.33ID:iOQdV6uo いや指定した数だけループしろよ
何勝手に回数10倍に増やしとんじゃい
何勝手に回数10倍に増やしとんじゃい
865デフォルトの名無しさん
2020/12/24(木) 06:19:28.22ID:TzdYJrci サムソンを守るためのHuawei潰しという側面もある。
866デフォルトの名無しさん
2020/12/24(木) 06:55:00.49ID:fOK7nTKz んあ?
867デフォルトの名無しさん
2020/12/24(木) 06:58:51.74ID:TzdYJrci 文大統領がトランプ大統領に、Huaweiを潰すよう勧めたそうです。
868デフォルトの名無しさん
2020/12/24(木) 07:53:25.30ID:X8ie3AzF >>863
C++ならはじめから秒2000万回ループできるコードになる
C++ならはじめから秒2000万回ループできるコードになる
869デフォルトの名無しさん
2020/12/24(木) 08:12:44.86ID:TzdYJrci このプログラムは応答していないためシステムによって閉じられますって出るんじゃないの。
870はちみつ餃子 ◆8X2XSCHEME
2020/12/24(木) 10:18:24.14ID:ys2W6z1g871デフォルトの名無しさん
2020/12/24(木) 11:16:41.02ID:h4Gph9I0 >>854
手元の32bitマイコン(除算器なし)だと
uint16_t v; に値入ってたとして、
if(v >= 100 && v < 1000) よりは ((v >= 100) & (v < 100p
手元の32bitマイコン(除算器なし)だと
uint16_t v; に値入ってたとして、
if(v >= 100 && v < 1000) よりは ((v >= 100) & (v < 100p
872デフォルトの名無しさん
2020/12/24(木) 11:27:11.76ID:h4Gph9I0 >>871
途中で送ってもうたorz
((v >= 100) && (v < 1000))のが気休め速い感じだったな。
あとLUTもほぼ変わらん。LUTはもう少し複雑な計算で、
かつキャッシュにテーブルが入ってくると鬼速だろうけど。
単純な比較のみだからあまり速い方法ないのかもね〜
ダメ元で掛け算とビットシフトで/100する処理も試したけど
ちょっと遅くなったorz
つか、32bitマイコンだと100us周期程度の割り込みハンドラで
この水準まで自分は気にしないだす。
あとC++ならinline化とかその辺をまずチェックでしょうさ。
途中で送ってもうたorz
((v >= 100) && (v < 1000))のが気休め速い感じだったな。
あとLUTもほぼ変わらん。LUTはもう少し複雑な計算で、
かつキャッシュにテーブルが入ってくると鬼速だろうけど。
単純な比較のみだからあまり速い方法ないのかもね〜
ダメ元で掛け算とビットシフトで/100する処理も試したけど
ちょっと遅くなったorz
つか、32bitマイコンだと100us周期程度の割り込みハンドラで
この水準まで自分は気にしないだす。
あとC++ならinline化とかその辺をまずチェックでしょうさ。
873デフォルトの名無しさん
2020/12/24(木) 17:12:04.54ID:tg7gMCA8874デフォルトの名無しさん
2020/12/24(木) 19:53:19.25ID:9+0irhfK if ((unsigned)v - 100u < 900u)
こういうのは減算とコンペア(実質減算)の2回の演算が常に走るから必ずしも速くないんじゃないかな。
&&で繋ぐ方がショートサーキットが働いて1回で済む場合がある。
演算で0との比較に落とせるなら別だけど。
こういうのは減算とコンペア(実質減算)の2回の演算が常に走るから必ずしも速くないんじゃないかな。
&&で繋ぐ方がショートサーキットが働いて1回で済む場合がある。
演算で0との比較に落とせるなら別だけど。
875デフォルトの名無しさん
2020/12/24(木) 19:56:18.95ID:VQIKvM0h そのくらいなら最適化に任せた方がいい気がするが……
876デフォルトの名無しさん
2020/12/24(木) 21:38:01.43ID:B83YCBUh 比較がボトルネックってのは本当だろうかとは思わなくもない
まあ、データ転送とか切り詰めまくって残すは比較のみ、ってのもありうるけど
まあ、データ転送とか切り詰めまくって残すは比較のみ、ってのもありうるけど
877デフォルトの名無しさん
2020/12/24(木) 21:38:20.67ID:X8ie3AzF878デフォルトの名無しさん
2020/12/24(木) 21:41:03.65ID:X8ie3AzF コード的には普通に
if (100 <= x && x < 1000)
と書いておけば良い
コンパイラが最適化するから
x/100を比較するのは
意味的にも意味不明だし
速くなることもない
if (100 <= x && x < 1000)
と書いておけば良い
コンパイラが最適化するから
x/100を比較するのは
意味的にも意味不明だし
速くなることもない
879デフォルトの名無しさん
2020/12/24(木) 21:51:18.77ID:X8ie3AzF ISRの最適化なら
レジスタを節約して待避する数を減らすとか
レジスタバンクを使ってレジスタを切り替えるとか
RAM上で実行するとか
割り込みを許可せずに高速化とか(MIPSの場合)
まあ色々とチューニング出来る余地がある
小規模DSPなんかだと
いまだにISRをアセンブラで書いたりする
レジスタを節約して待避する数を減らすとか
レジスタバンクを使ってレジスタを切り替えるとか
RAM上で実行するとか
割り込みを許可せずに高速化とか(MIPSの場合)
まあ色々とチューニング出来る余地がある
小規模DSPなんかだと
いまだにISRをアセンブラで書いたりする
880デフォルトの名無しさん
2020/12/25(金) 14:04:51.84ID:L6KY61Ck バンク切り替えテクニックですか。
むかしのインターフェース誌っぽいですね。
むかしのインターフェース誌っぽいですね。
881デフォルトの名無しさん
2020/12/25(金) 17:40:14.36ID:j6GWo/XP 昔のテクニックが今でも有効
882デフォルトの名無しさん
2020/12/25(金) 20:23:57.32ID:KGl9PDWX template<size_t A, size_t B>
class tmp{};
template<size_t N>
void test(tmp<N, N>&){
std::cout << “A”;
}
template<size_t A, size_t B>
void test(tmp<A, B>&){
std::cout << “B”;
}
上のような関数があったときにtest(tmp<1,1>{});がどちらを呼ぶか規格で決まってる?
class tmp{};
template<size_t N>
void test(tmp<N, N>&){
std::cout << “A”;
}
template<size_t A, size_t B>
void test(tmp<A, B>&){
std::cout << “B”;
}
上のような関数があったときにtest(tmp<1,1>{});がどちらを呼ぶか規格で決まってる?
883デフォルトの名無しさん
2020/12/25(金) 22:18:37.12ID:9Tm+xBHp テンプレート引数が少ないtmp<N, N>の勝ち
884デフォルトの名無しさん
2020/12/26(土) 00:14:55.00ID:biNpl0R5 using FunctorType = std::function<void()>;
struct RecursiveMapperType;
using InternalMapperType = std::map<std::string, RecursiveMapperType>;
struct RecursiveMapperType : public InternalMapperType
{
RecursiveMapperType(){}
};
こういうコードをネットで見かけたんだけど
RecursiveMapperTypeを前方宣言してInternalMapperTypeを宣言
RecursiveMapperTypeをInternalMapperTypeを継承して作成していることのメリットがよくわからない。
struct RecursiveMapperType : public InternalMapperType
{
RecursiveMapperType(){}
};
using RecursiveMap = std::map<std::string, RecursiveMapperType>
だとだめなのだろうか?
誰か教えて下しあ
struct RecursiveMapperType;
using InternalMapperType = std::map<std::string, RecursiveMapperType>;
struct RecursiveMapperType : public InternalMapperType
{
RecursiveMapperType(){}
};
こういうコードをネットで見かけたんだけど
RecursiveMapperTypeを前方宣言してInternalMapperTypeを宣言
RecursiveMapperTypeをInternalMapperTypeを継承して作成していることのメリットがよくわからない。
struct RecursiveMapperType : public InternalMapperType
{
RecursiveMapperType(){}
};
using RecursiveMap = std::map<std::string, RecursiveMapperType>
だとだめなのだろうか?
誰か教えて下しあ
885デフォルトの名無しさん
2020/12/26(土) 00:40:10.65ID:3VlCU3bq >>884
上のコードと下のコードの RecursiveMapperType の定義はまったく同じに見えるんだけど、何が違うの?
上のコードと下のコードの RecursiveMapperType の定義はまったく同じに見えるんだけど、何が違うの?
886デフォルトの名無しさん
2020/12/26(土) 00:50:04.37ID:biNpl0R5 >>885 さん
すみません。
下の方のRecursiveMapperTypeですが継承元消し忘れてました。
下のようなkたちです
struct RecursiveMapperType
{
RecursiveMapperType(){}
};
using RecursiveMap = std::map<std::string, RecursiveMapperType>
すみません。
下の方のRecursiveMapperTypeですが継承元消し忘れてました。
下のようなkたちです
struct RecursiveMapperType
{
RecursiveMapperType(){}
};
using RecursiveMap = std::map<std::string, RecursiveMapperType>
887デフォルトの名無しさん
2020/12/26(土) 03:46:58.69ID:fBIAR6pR ttps://ideone.com/Ou2BZq
888デフォルトの名無しさん
2020/12/26(土) 15:10:58.71ID:3VlCU3bq889デフォルトの名無しさん
2020/12/26(土) 16:40:20.18ID:vGzfsLf/ 再帰的な構造を定義したくて自分自身の型を含めたものを継承してるわけで
それを実現するには前方宣言するしかない
というね
それを実現するには前方宣言するしかない
というね
890デフォルトの名無しさん
2020/12/26(土) 17:13:57.40ID:UNoc468U 再帰的なコンテナは、フィールドが出来た時点で破綻するのでは?
891デフォルトの名無しさん
2020/12/26(土) 18:07:48.30ID:TLGOuMOF892デフォルトの名無しさん
2020/12/27(日) 06:31:05.42ID:QkMmRpj8 C++23に持ち越された契約は何が変わるんだろね。
893デフォルトの名無しさん
2020/12/27(日) 17:59:23.18ID:wQ5c+q6H ありがとうございます。なんとなくイメージできました。
コードの設計ってまだよくわからないのですが、
再帰処理のためにこうするのって比較的普通なことなんですか?
コードの設計ってまだよくわからないのですが、
再帰処理のためにこうするのって比較的普通なことなんですか?
894デフォルトの名無しさん
2020/12/27(日) 18:23:25.49ID:tp3tetyk895デフォルトの名無しさん
2020/12/27(日) 18:33:52.26ID:7Rx7y5wp896デフォルトの名無しさん
2020/12/27(日) 18:47:54.32ID:7Rx7y5wp 設計を学ぶならデザパタはひと通り見ておいて損はないぞ
897デフォルトの名無しさん
2020/12/27(日) 18:49:43.74ID:QkMmRpj8 ヘネパタ、パタヘネ、デザパタ。
898デフォルトの名無しさん
2020/12/27(日) 22:11:00.35ID:QkMmRpj8 newのコストは気にされますが、deleteのコストは見逃されがちです。
899デフォルトの名無しさん
2020/12/28(月) 02:23:23.12ID:ibU6N4ur あるクラスのコンストラクタのデフォルト引数を変更するときってどうしたらいいの?
オーバーロードすれば良い?
オーバーロードすれば良い?
900デフォルトの名無しさん
2020/12/28(月) 07:27:12.64ID:7Z4wU2qk 単純に変更じゃダメな理由は?
他のライブラリ?
他のライブラリ?
901デフォルトの名無しさん
2020/12/28(月) 07:33:40.98ID:pesKZps1 stlコンテナを継承するのはアウトだろ。
うまくやらないとデストラクタが呼ばれなくなっちゃうぞ
うまくやらないとデストラクタが呼ばれなくなっちゃうぞ
902デフォルトの名無しさん
2020/12/28(月) 09:00:44.26ID:i4NtF28F じゃあうまくやりましょうや。
903デフォルトの名無しさん
2020/12/28(月) 09:44:51.94ID:bVWPeYFg そもそもC++ではデストラクタを仮想にしてないってことは「継承すんなよ」って宣言だからなぁ
904デフォルトの名無しさん
2020/12/28(月) 09:55:45.06ID:W/k+iOkV なんで継承しないようにしたか意見表明文みたいなモンはどっかにあるのか?
905デフォルトの名無しさん
2020/12/28(月) 10:20:49.88ID:ErVwTltE 仮想関数化するとしない場合に比べて余分なコストがかかるから、必要な理由がない限り基本的にそれは避けるということじゃないかな
906デフォルトの名無しさん
2020/12/28(月) 10:32:20.80ID:4OiRlqvR C++は1クロックでも速く動作させるために非仮想関数をデフォルトにしたのは理解できる
Javaは動作速度よりもオブジェクト指向の継承動作の一貫性を重視してすべて仮想関数にした、これも時代を考えれば理解できる
C#もJavaと同じくデフォルトを仮想関数にしておいて欲しかったのだが、C#はC++を尊重してデフォルト非仮想関数なんだよね
これはちょっと残念
Javaは動作速度よりもオブジェクト指向の継承動作の一貫性を重視してすべて仮想関数にした、これも時代を考えれば理解できる
C#もJavaと同じくデフォルトを仮想関数にしておいて欲しかったのだが、C#はC++を尊重してデフォルト非仮想関数なんだよね
これはちょっと残念
907デフォルトの名無しさん
2020/12/28(月) 11:33:10.90ID:s2RdB6EU 継承して機能追加っていうのがオブジェクト指向的にもどうかと思うね
908デフォルトの名無しさん
2020/12/28(月) 12:34:23.27ID:QmdcnH/3 finalキーワードがこの時代にあれば間違いなく付けただろうな
文句言ってる奴はガイジ
文句言ってる奴はガイジ
909デフォルトの名無しさん
2020/12/28(月) 12:42:44.62ID:UEnoPUHl910はちみつ餃子 ◆8X2XSCHEME
2020/12/28(月) 13:19:25.85ID:N6A7dpOQ デストラクタが仮想ではないものを継承したときの具体的な問題は
スライシングが起こりうるということと、
起こってもコンパイラが (少なくともコンパイル時には) 捕捉できないことが多いということにあって、
スライシングが起こらないように使う分には問題はない。
設計的に綺麗かどうかはまた別の話だけど。
shared_ptr が (デストラクタが仮想でなくても) 元の型のデストラクタを呼んでくれたりするんで、
場合によってはそういう設計もアリということなんだと思う。
スライシングが起こりうるということと、
起こってもコンパイラが (少なくともコンパイル時には) 捕捉できないことが多いということにあって、
スライシングが起こらないように使う分には問題はない。
設計的に綺麗かどうかはまた別の話だけど。
shared_ptr が (デストラクタが仮想でなくても) 元の型のデストラクタを呼んでくれたりするんで、
場合によってはそういう設計もアリということなんだと思う。
911デフォルトの名無しさん
2020/12/28(月) 14:12:57.70ID:02+J4aSB >>910
デストラクタが仮想なものを継承してもスライシングは起こりうるよね?そこは関係なくね?
https://en.wikipedia.org/wiki/Object_slicing
> In C++ programming, object slicing occurs when an object of a subclass type
> is copied to an object of superclass type: the superclass copy will not have
> any of the member variables defined in the subclass. ...
デストラクタが仮想なものを継承してもスライシングは起こりうるよね?そこは関係なくね?
https://en.wikipedia.org/wiki/Object_slicing
> In C++ programming, object slicing occurs when an object of a subclass type
> is copied to an object of superclass type: the superclass copy will not have
> any of the member variables defined in the subclass. ...
912デフォルトの名無しさん
2020/12/28(月) 17:31:09.93ID:V+A6vVBD C++自由すぎてしんどいな
後方互換性と引き換えに払った代償か
後方互換性と引き換えに払った代償か
913はちみつ餃子 ◆8X2XSCHEME
2020/12/28(月) 17:46:19.93ID:N6A7dpOQ >>911
スライシング自体は起こるけど、それで予想外のことやメモリ管理の矛盾は起こり難い。
スライシング自体は起こるけど、それで予想外のことやメモリ管理の矛盾は起こり難い。
914デフォルトの名無しさん
2020/12/28(月) 17:50:37.04ID:i4NtF28F 自由に羽ばたける翼。
915デフォルトの名無しさん
2020/12/28(月) 18:06:08.49ID:V+A6vVBD 自由すぎて困る部分はLinterを併用することで勝手に回避しろってことかな
916デフォルトの名無しさん
2020/12/28(月) 18:37:15.29ID:v+s+VlFU だってCの設計思想が「人間を信用する」だもん
セキュリティが重視される現代的な言語のベースとしては致命的に合ってないんだよね
セキュリティが重視される現代的な言語のベースとしては致命的に合ってないんだよね
917デフォルトの名無しさん
2020/12/28(月) 18:40:02.12ID:02+J4aSB918デフォルトの名無しさん
2020/12/28(月) 18:40:41.01ID:02+J4aSB s/見えてもらえない?/見せてもらえない?/
919デフォルトの名無しさん
2020/12/28(月) 19:07:39.46ID:bVWPeYFg A <|- B, C みたいなときにB, CをnewしてA*として管理しようとすると破棄の時にAのデストラクタしか呼ばれない
920デフォルトの名無しさん
2020/12/28(月) 19:09:58.26ID:UEnoPUHl >>911
仮想でないデストラクタが話題のスコープなのに、スライシングにスコープを移したら議論にならないでしょ。
911) デストラクタが仮想なものを継承する→スライシングになるものが存在する
という命題は
910) デストラクタが仮想ではないものを継承する→スライシングになるものが存在する
という命題と矛盾するわけではない(両立する)ので、その議論はあんまり意味がない。
仮想でないデストラクタが話題のスコープなのに、スライシングにスコープを移したら議論にならないでしょ。
911) デストラクタが仮想なものを継承する→スライシングになるものが存在する
という命題は
910) デストラクタが仮想ではないものを継承する→スライシングになるものが存在する
という命題と矛盾するわけではない(両立する)ので、その議論はあんまり意味がない。
921デフォルトの名無しさん
2020/12/28(月) 19:14:08.97ID:i4NtF28F スライシング・オプティマイザーとかどうよ?
922デフォルトの名無しさん
2020/12/28(月) 19:36:49.42ID:02+J4aSB >>910
> スライシングが起こらないように使う分には問題はない。
ここもおかしいんだよね。
デストラクタが仮想ではないものを継承して派生クラスのオブジェクトを new で作って
基底クラスのポインタを通して delete したら未定義動作になるわけだけど、
これはスライシングを起こしていなくても問題になる。
「派生クラスのオブジェクトを new で作って基底クラスのポインタを通して delete」のことを
「スライシング」と呼んでる気配もあるんだけど、それは明らかに誤りだろうし。
> スライシングが起こらないように使う分には問題はない。
ここもおかしいんだよね。
デストラクタが仮想ではないものを継承して派生クラスのオブジェクトを new で作って
基底クラスのポインタを通して delete したら未定義動作になるわけだけど、
これはスライシングを起こしていなくても問題になる。
「派生クラスのオブジェクトを new で作って基底クラスのポインタを通して delete」のことを
「スライシング」と呼んでる気配もあるんだけど、それは明らかに誤りだろうし。
923デフォルトの名無しさん
2020/12/28(月) 19:43:43.44ID:592FfNkQ924デフォルトの名無しさん
2020/12/28(月) 19:51:33.62ID:7Z4wU2qk >>923
make関数作るのはダメなん?
make関数作るのはダメなん?
レス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★7 [蚤の市★]
- 最新版Z級クソ映画ランキングが決定! [牛丼★]
- 【STARTO ENTERTAINMENT】SUPER EIGHTの横山裕、フジ『ドッキリGP』ロケで全治2ヶ月の重傷 [Ailuropoda melanoleuca★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 ★2 [蚤の市★]
- 公用車カーナビのNHK受信料「全額免除を」 千葉市議会、国に制度創設求める意見書可決 [少考さん★]
- 【食】「シャウエッセンは焼くべからず」暗黙のルールを破り売上高過去最高…日本ハム社員たちが「夜味」にかけた情熱 [ぐれ★]
- なんか歯磨きしたのに口から歯の味がする
- 俺と一緒に寝ろ
- 【朗報】南鳥島のレアアース、中国産の「20倍の純度」青山繁晴氏「日本は資源大国」日本復活のファンファーレが鳴り響く! [673057929]
- 👊😅👊三☁😶‍🌫三⛅🏡
- コーヒー、来年3月から30パーセント値上げへ [709039863]
- 日本って中国と戦争したら絶対負けるのに何でイキってんの?
