次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137
http://mevius.5ch.net/test/read.cgi/tech/1531558382/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1530384293/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
C++相談室 part138
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (スフッ Sd9f-fGne)
2018/08/05(日) 18:02:36.57ID:DigzqJtZd38デフォルトの名無しさん (ワッチョイ 7ab3-M35H)
2018/09/12(水) 07:56:44.62ID:i0PJPGg/0 ダメだこりゃ
39デフォルトの名無しさん (ワッチョイ 13f2-7GfT)
2018/09/12(水) 07:58:47.30ID:OXipbDDC0 傍から見ていると、メソッドチェーン自体なにが嬉しいんだろう、と思ってしまう。
40デフォルトの名無しさん (ワンミングク MMaa-qEbW)
2018/09/12(水) 08:09:18.12ID:RAfcgte1M 一票だなぁ
41デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/12(水) 09:10:52.74ID:A4EXsm7N0 >>38-40
そりゃ君らが老害だからだよ。
老害ってのは肉体的な年齢のことではない。
好奇心/興味を失った結果、新しい価値観を認めないから老害となる。
新しい言語を見てみろ。全てメソッドチェーン出来るだろ。
最初は戸惑うかもしれないが、慣れれば相当便利なんだよ。簡単に凝集度を上げていける。
もう1行に1個ずつ処理を書いていていい時代じゃなくなりつつあるのさ。
とはいえ、クラスも当初は無駄だと言われていたのだろうし、今ならラムダやLINQが該当するのだろうけど。
そりゃ君らが老害だからだよ。
老害ってのは肉体的な年齢のことではない。
好奇心/興味を失った結果、新しい価値観を認めないから老害となる。
新しい言語を見てみろ。全てメソッドチェーン出来るだろ。
最初は戸惑うかもしれないが、慣れれば相当便利なんだよ。簡単に凝集度を上げていける。
もう1行に1個ずつ処理を書いていていい時代じゃなくなりつつあるのさ。
とはいえ、クラスも当初は無駄だと言われていたのだろうし、今ならラムダやLINQが該当するのだろうけど。
42デフォルトの名無しさん (ブーイモ MMaf-M35H)
2018/09/12(水) 09:15:17.48ID:UK8G0nmCM thisポインタ返すメソッドチェーンってクソだろw
perl脳と同じ
perl脳と同じ
43デフォルトの名無しさん (ワンミングク MMaa-qEbW)
2018/09/12(水) 12:50:06.51ID:RAfcgte1M おかしな主張を生暖かく見守っていたのに、そんなストレートな御意見を
44デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/12(水) 20:01:18.65ID:A4EXsm7N0 さて、続き。
C++で『デストラクタありの』オブジェクトを返すとき、お前らどうしてる?
α: しない。上位関数でオブジェクトポインタを渡して上書き。(Cスタイル)
β: スマポで渡す。(スマポ教)(=CLIスタイル)
γ: reinterpret_cast。 ← とりあえず今の実装
Δ: 他に何かある?
非常に当たり前だが、
戻り値として一時オブジェクトを用意すると、それのデストラクタが実行されてしまうことに気づいた。
(今更なのだが、これまではVC++/CLIでCまたはCLI(managed)スタイルで書いていて、
C++(unmanagedまたはネイティブ)スタイルはほぼ使っていなかったから気づかなかった)
これでは困ったことに、関数呼び出しで初期化がやりにくい。
具体的に、駄目なコードは以下。
C++で『デストラクタありの』オブジェクトを返すとき、お前らどうしてる?
α: しない。上位関数でオブジェクトポインタを渡して上書き。(Cスタイル)
β: スマポで渡す。(スマポ教)(=CLIスタイル)
γ: reinterpret_cast。 ← とりあえず今の実装
Δ: 他に何かある?
非常に当たり前だが、
戻り値として一時オブジェクトを用意すると、それのデストラクタが実行されてしまうことに気づいた。
(今更なのだが、これまではVC++/CLIでCまたはCLI(managed)スタイルで書いていて、
C++(unmanagedまたはネイティブ)スタイルはほぼ使っていなかったから気づかなかった)
これでは困ったことに、関数呼び出しで初期化がやりにくい。
具体的に、駄目なコードは以下。
45デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/12(水) 20:02:11.37ID:A4EXsm7N0 template<typename T> struct M { // メソッド群
T* ptr;
int length;
T& operator[](int idx){return ptr[idx];}
M(int length, T* ptr) : length(length), ptr(ptr){}
M& from( ... ){ ... ; return *this;}
M& sort(){ ... ; return *this;}
// M& alloc(int length){ ... ; return *this;} // --- (α)
// M(int length) : length(length), ptr((T*)malloc(sizeof(T)*length)) {} // --- (γ)
};
template<typename T> struct C : M<T> {
C(int length) : M(length, (T*)malloc(sizeof(T)*length)) {} // heap上に確保
~C(){free(this->ptr);}
};
C<double> calc_result_vals( ... ){ // --- (γ)
calc_result( ... ); // in-placeで結果が計算される。
return (C<double>&)C<double>( ... ).from( ... ).sort(); // 結果をコピーしてソートして返す
} // <----ここでCのデストラクタが実行される
void test(int num){
MyContainer<C<double>> vals(num); // アロケーションのみ --- (β)
for (int i=0;i<num;i++) vals[i] = calc_result_vals( ... ); // 初期化 --- (α)(γ)
}
T* ptr;
int length;
T& operator[](int idx){return ptr[idx];}
M(int length, T* ptr) : length(length), ptr(ptr){}
M& from( ... ){ ... ; return *this;}
M& sort(){ ... ; return *this;}
// M& alloc(int length){ ... ; return *this;} // --- (α)
// M(int length) : length(length), ptr((T*)malloc(sizeof(T)*length)) {} // --- (γ)
};
template<typename T> struct C : M<T> {
C(int length) : M(length, (T*)malloc(sizeof(T)*length)) {} // heap上に確保
~C(){free(this->ptr);}
};
C<double> calc_result_vals( ... ){ // --- (γ)
calc_result( ... ); // in-placeで結果が計算される。
return (C<double>&)C<double>( ... ).from( ... ).sort(); // 結果をコピーしてソートして返す
} // <----ここでCのデストラクタが実行される
void test(int num){
MyContainer<C<double>> vals(num); // アロケーションのみ --- (β)
for (int i=0;i<num;i++) vals[i] = calc_result_vals( ... ); // 初期化 --- (α)(γ)
}
46デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/12(水) 20:02:43.71ID:A4EXsm7N0 内容はこれまで通りだが、再度説明する。
Mはメソッド群を持つベースクラスであり、メンバ変数はポインタと長さのみ。
つまりshared_ptrと同様のヘッダであり、データは別区画にある。
Cのコンストラクタでデータエリアをheap上に確保する。
testではコンテナを用意し、各インスタンスを calc_resut_vals() によって初期化する。
Cはヘッダなのでコピーでいい。(32bit環境なら8Bytes)
というノリだったのだが、GC言語ではこれでいいが、C++では前述の通り動かない。
calc_result_vals 終了後に戻り値Cのデストラクタが実行され、データエリアが開放されてしまうからだ。
(ヘッダ自体はコピーされるが、中身が無効アドレスを指した状態になる)
このとき、お前らどうしてる?
まず思いつくのはCスタイル(α)だ。
test内の初期化を、戻り値ではなくポインタで渡し、子関数で上書きさせる。
for (int i=0;i<num;i++) calc_result_vals(&vals[i], ... ); // --- (α)
しかしやっぱ代入形式で書きたいのと、
一時オブジェクトを作らない為には、
Containerでmallocではなく各インスタンスをnewして空として初期化し、(ここまではまあいいが)
そこに上書きでポインタを初期化するというおかしな操作(allocメソッド)が必要となる。
これが流れ的にイマイチ。
スマポ教団なら全てスマポで対応しろ、か?つまりtest内のコンテナを
MyContainer<shared_ptr<C<double>>> vals(num); // --- (β)
とし、calc_result_valsはshared_ptrを返すというもの。
しかしこれは無駄にスマポを介している分ウザイし、速度も遅い。
とはいえ型には矛盾が無く、フローとしては綺麗ではある。
(GC言語は実質的に全てこれ)
Mはメソッド群を持つベースクラスであり、メンバ変数はポインタと長さのみ。
つまりshared_ptrと同様のヘッダであり、データは別区画にある。
Cのコンストラクタでデータエリアをheap上に確保する。
testではコンテナを用意し、各インスタンスを calc_resut_vals() によって初期化する。
Cはヘッダなのでコピーでいい。(32bit環境なら8Bytes)
というノリだったのだが、GC言語ではこれでいいが、C++では前述の通り動かない。
calc_result_vals 終了後に戻り値Cのデストラクタが実行され、データエリアが開放されてしまうからだ。
(ヘッダ自体はコピーされるが、中身が無効アドレスを指した状態になる)
このとき、お前らどうしてる?
まず思いつくのはCスタイル(α)だ。
test内の初期化を、戻り値ではなくポインタで渡し、子関数で上書きさせる。
for (int i=0;i<num;i++) calc_result_vals(&vals[i], ... ); // --- (α)
しかしやっぱ代入形式で書きたいのと、
一時オブジェクトを作らない為には、
Containerでmallocではなく各インスタンスをnewして空として初期化し、(ここまではまあいいが)
そこに上書きでポインタを初期化するというおかしな操作(allocメソッド)が必要となる。
これが流れ的にイマイチ。
スマポ教団なら全てスマポで対応しろ、か?つまりtest内のコンテナを
MyContainer<shared_ptr<C<double>>> vals(num); // --- (β)
とし、calc_result_valsはshared_ptrを返すというもの。
しかしこれは無駄にスマポを介している分ウザイし、速度も遅い。
とはいえ型には矛盾が無く、フローとしては綺麗ではある。
(GC言語は実質的に全てこれ)
47デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/12(水) 20:04:07.13ID:A4EXsm7N0 型なんて飾りですよ、なら、MにC同様のmallocするコンストラクタを用意し、
calc_result_vals上で作る一時オブジェクトはCではなくMとし、(デストラクタが空)
代入時にキャストして強引に突っ込む、とも出来る。
M/Cの区別は「heap上に新規作成するか」ではなく、「寿命を管理するか」に変わる。
M<double> calc_result_vals( ... ){
calc_result( ... );
return M<double>( ... ).from( ... ).sort(); // Mを一時的に作り、Mを返す
} // デストラクタは空なのでheapは解放されない
for (int i=0;i<num;i++) *(M*)&vals[i] = calc_result_vals( ... ); // キャストして強引に突っ込む(γ)
代入形式で書けるし、最速コードはこれだが、強引過ぎか?
ただC++でこれやったら最適化によっては死んだような…
お前らどうしてるよ?
他の方法(Δ)が有れば是非。
なお、「Cを継承したDを作り、Dのコンストラクタ内でcalc_result_valsを呼んで初期化」は
無意味に結合が増えそうなので却下。
calc_result_vals上で作る一時オブジェクトはCではなくMとし、(デストラクタが空)
代入時にキャストして強引に突っ込む、とも出来る。
M/Cの区別は「heap上に新規作成するか」ではなく、「寿命を管理するか」に変わる。
M<double> calc_result_vals( ... ){
calc_result( ... );
return M<double>( ... ).from( ... ).sort(); // Mを一時的に作り、Mを返す
} // デストラクタは空なのでheapは解放されない
for (int i=0;i<num;i++) *(M*)&vals[i] = calc_result_vals( ... ); // キャストして強引に突っ込む(γ)
代入形式で書けるし、最速コードはこれだが、強引過ぎか?
ただC++でこれやったら最適化によっては死んだような…
お前らどうしてるよ?
他の方法(Δ)が有れば是非。
なお、「Cを継承したDを作り、Dのコンストラクタ内でcalc_result_valsを呼んで初期化」は
無意味に結合が増えそうなので却下。
48デフォルトの名無しさん (ワッチョイ 13f2-7GfT)
2018/09/12(水) 20:18:03.00ID:OXipbDDC049デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/12(水) 20:40:38.92ID:A4EXsm7N0 >>48
意味不明。そもそも俺は「パイプライン」知らんし。
以下見る限り、データをメソッドで処理するのではなく、
データをメソッド配列(メソッド関数ポインタ配列)にくぐらせる感じか?
> https://postd.cc/an-introduction-to-functional-programming/
しかし今回は演算結果をコピーしてソートして返すだけだから、どっちでも変わらん気もするが。
callが使えればパイプラインも生きるのかもしれんが。
意味不明。そもそも俺は「パイプライン」知らんし。
以下見る限り、データをメソッドで処理するのではなく、
データをメソッド配列(メソッド関数ポインタ配列)にくぐらせる感じか?
> https://postd.cc/an-introduction-to-functional-programming/
しかし今回は演算結果をコピーしてソートして返すだけだから、どっちでも変わらん気もするが。
callが使えればパイプラインも生きるのかもしれんが。
50デフォルトの名無しさん (ワッチョイ faa2-7GfT)
2018/09/12(水) 20:45:18.33ID:o4qXNCW50 >>44
スマポかムーブ
スマポかムーブ
51デフォルトの名無しさん (ワッチョイ 0b9b-gQ39)
2018/09/12(水) 20:46:38.82ID:QYuOWqMW0 α':参照渡し
Δ:move (デストラクタは動くけどコストは低くなる)
Δ:move (デストラクタは動くけどコストは低くなる)
52デフォルトの名無しさん (ブーイモ MMaf-M35H)
2018/09/12(水) 20:54:36.70ID:UK8G0nmCM お前らどうしてる?で吹いたわ
53デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/12(水) 21:09:17.36ID:A4EXsm7N054デフォルトの名無しさん (ワッチョイ 57b3-IhZi)
2018/09/13(木) 10:15:51.60ID:d4HLHzfO0 class C : public Mのときに
c.chain().chain.chain()で戻り値がCの型のオブジェクト指向の静的型付き言語を知らないんだけどあるの?
少なくともc++、c#、java、kotlin、swiftはできない
c.chain().chain.chain()で戻り値がCの型のオブジェクト指向の静的型付き言語を知らないんだけどあるの?
少なくともc++、c#、java、kotlin、swiftはできない
55デフォルトの名無しさん (ブーイモ MMcf-nprU)
2018/09/13(木) 16:01:41.96ID:DcLW2mimM ダウンキャスト推論しろとかね
タイプセーフを何だと思ってんでしょ
タイプセーフを何だと思ってんでしょ
56デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/14(金) 00:03:28.50ID:XcO59d500 一応報告。
色々調べた結果、placement new を使えばαの時の「未初期化のthisを使う」気持ち悪さは無くなることが分かった。
これとムーブを比べると、以下。
Cスタイル(α):
× 代入形式で書けない。
◎ 最初から最速コードが出る。(costructのみ)
ムーブ:(俺の環境では)
◎ 代入形式で書ける。
△ダウンキャストを書く必要がある。
× return (C<double>&)C<double>( ... ).from( ... ).sort();だと全く最適化されず、
construct/copy/destruct/move/destructとなる。
△ C<double> retval(pat->num); retval.from((double*)pat->result).sort(); return retval; とベタに切ると、
NRVOが一つだけかかり、construct/move/destruct となる。
(opereator=のオーバーロードが最適化に影響しているかも試したが、関係なかった)
いまいちソースは美しくないが、速ければいいだけならCなのはいつも通り。
(NRVOの最適化済みソースを手動で書くのだから当然)
ムーブにするか、いっそのこと代入/コピー禁止でunique_ptrの機能も持たせるか考え中。
色々調べた結果、placement new を使えばαの時の「未初期化のthisを使う」気持ち悪さは無くなることが分かった。
これとムーブを比べると、以下。
Cスタイル(α):
× 代入形式で書けない。
◎ 最初から最速コードが出る。(costructのみ)
ムーブ:(俺の環境では)
◎ 代入形式で書ける。
△ダウンキャストを書く必要がある。
× return (C<double>&)C<double>( ... ).from( ... ).sort();だと全く最適化されず、
construct/copy/destruct/move/destructとなる。
△ C<double> retval(pat->num); retval.from((double*)pat->result).sort(); return retval; とベタに切ると、
NRVOが一つだけかかり、construct/move/destruct となる。
(opereator=のオーバーロードが最適化に影響しているかも試したが、関係なかった)
いまいちソースは美しくないが、速ければいいだけならCなのはいつも通り。
(NRVOの最適化済みソースを手動で書くのだから当然)
ムーブにするか、いっそのこと代入/コピー禁止でunique_ptrの機能も持たせるか考え中。
57デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/18(火) 22:37:48.65ID:9yuSYzSe0 コンテナを自作しようとしているのだが、デストラクタの書き方が分からない。
教えてもらえないだろうか。
(自信は持てないが)
俺の理解では、コンテナのデストラクタは中身のデストラクタをキックする必要があって、
今は以下のように書いていて、それなりに動いているように見える。
~MyContainer(){
for (int i=0;i<length;i++) ptr[i].~T();
}
要するに中身のデストラクタを一つずつ直接呼び出している。
ところが、例えばGNUのvectorのデストラクタは空だ。
> 00126 ~vector() { }
> https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a01115_source.html
これはどういう事なのだろうか?
他に参考になるソースでもいいから教えてもらえれば助かる。
なお、以下では俺と似たようなことをやっている。
> ~Stack () throw()
> {
> std::for_each(array_, array_ + top_, destroy<T>);
> ::operator delete(array_); // グローバルスコープの delete 演算子
> }
> https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E6%B1%8E%E7%94%A8%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%BD%9C%E6%88%90%E7%94%A8%E3%82%A4%E3%83%87%E3%82%A3%E3%82%AA%E3%83%A0(Generic_Container_Idioms)
教えてもらえないだろうか。
(自信は持てないが)
俺の理解では、コンテナのデストラクタは中身のデストラクタをキックする必要があって、
今は以下のように書いていて、それなりに動いているように見える。
~MyContainer(){
for (int i=0;i<length;i++) ptr[i].~T();
}
要するに中身のデストラクタを一つずつ直接呼び出している。
ところが、例えばGNUのvectorのデストラクタは空だ。
> 00126 ~vector() { }
> https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a01115_source.html
これはどういう事なのだろうか?
他に参考になるソースでもいいから教えてもらえれば助かる。
なお、以下では俺と似たようなことをやっている。
> ~Stack () throw()
> {
> std::for_each(array_, array_ + top_, destroy<T>);
> ::operator delete(array_); // グローバルスコープの delete 演算子
> }
> https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E6%B1%8E%E7%94%A8%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E4%BD%9C%E6%88%90%E7%94%A8%E3%82%A4%E3%83%87%E3%82%A3%E3%82%AA%E3%83%A0(Generic_Container_Idioms)
58デフォルトの名無しさん (ワッチョイ 979b-BSn2)
2018/09/18(火) 22:45:35.90ID:FdtAwQli059デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/18(火) 23:09:28.88ID:9yuSYzSe0 >>58
なるほど。
ではそのアロケータのdeallocateメンバ関数は誰がキックするんだ?
俺はそれが vector のデストラクタに書かれているのかと思っていたんだが。
以下参考。
> C++11では、std::allocator_traitsというアロケータアクセスの中間インタフェースが用意されたおかげで、
> 自作アロケータに必要な実装がだいぶ減りました。
>
> 自作アロケータに必要な最小コードは、以下のようになります。
>
> 要素型value_type
> 特殊関数(デフォルトコンストラクタ、コピーコンストラクタ、ムーブコンストラクタ)
> 別な要素型のアロケータを受け取るコンストラクタ
> allocate()メンバ関数。(hintパラメータはあってもなくてもいい)
> deallocate()メンバ関数
> operator==とoperator!=
> https://faithandbrave.hateblo.jp/entry/2014/02/14/160506
なるほど。
ではそのアロケータのdeallocateメンバ関数は誰がキックするんだ?
俺はそれが vector のデストラクタに書かれているのかと思っていたんだが。
以下参考。
> C++11では、std::allocator_traitsというアロケータアクセスの中間インタフェースが用意されたおかげで、
> 自作アロケータに必要な実装がだいぶ減りました。
>
> 自作アロケータに必要な最小コードは、以下のようになります。
>
> 要素型value_type
> 特殊関数(デフォルトコンストラクタ、コピーコンストラクタ、ムーブコンストラクタ)
> 別な要素型のアロケータを受け取るコンストラクタ
> allocate()メンバ関数。(hintパラメータはあってもなくてもいい)
> deallocate()メンバ関数
> operator==とoperator!=
> https://faithandbrave.hateblo.jp/entry/2014/02/14/160506
60デフォルトの名無しさん (ワッチョイ 979b-BSn2)
2018/09/18(火) 23:21:59.24ID:FdtAwQli0 >>59
アロケータのデストラクタじゃね?
アロケータのデストラクタじゃね?
61デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/18(火) 23:34:08.49ID:9yuSYzSe0 >>60
vector内部にallocatorを持っている場合、
allocatorのデストラクタはvectorのデストラクタが呼び出してやらないと連鎖しなくね?
なお、以下ではやはり自分のデストラクタででfreeを呼び出し、その中でalloc.deallocateされてる。
> StrVec::~StrVec() { free(); }
> https://books.google.co.jp/books?id=P1D5DAAAQBAJ&pg=PT746&lpg=PT746&dq=deallocate+%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97&source=bl&ots=1rmEQsOAY0&sig=
NRKyLHuLVtPQK5Yb2Nk_YU_pTNs&hl=en&sa=X&ved=2ahUKEwjCwe_q3sTdAhUNQd4KHc2FDi0Q6AEwA3oECAcQAQ#v=onepage&q=deallocate%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97&f=false
vector内部にallocatorを持っている場合、
allocatorのデストラクタはvectorのデストラクタが呼び出してやらないと連鎖しなくね?
なお、以下ではやはり自分のデストラクタででfreeを呼び出し、その中でalloc.deallocateされてる。
> StrVec::~StrVec() { free(); }
> https://books.google.co.jp/books?id=P1D5DAAAQBAJ&pg=PT746&lpg=PT746&dq=deallocate+%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97&source=bl&ots=1rmEQsOAY0&sig=
NRKyLHuLVtPQK5Yb2Nk_YU_pTNs&hl=en&sa=X&ved=2ahUKEwjCwe_q3sTdAhUNQd4KHc2FDi0Q6AEwA3oECAcQAQ#v=onepage&q=deallocate%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97&f=false
62デフォルトの名無しさん (ワッチョイ 9780-9b2l)
2018/09/18(火) 23:39:15.31ID:oE0uJFU60 いろいろと間違ってる
> for (int i=0;i<length;i++) ptr[i].~T();
> 要するに中身のデストラクタを一つずつ直接呼び出している。
こんなことする必要ない
デストラクタはインスタンスが消滅するまえに自動的に呼ばれる
↓コレはdebug用 みるソースが適切じゃない
> https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a01115_source.html
00078 #ifdef _GLIBCXX_DEBUG
00079 # include <debug/vector> ← コレをみてる
00080 #endif
↓こっちみなさい
https://gcc.gnu.org/onlinedocs/libstdc%2B%2B/libstdc%2B%2B-html-USERS-3.4/stl__vector_8h-source.html
00268 ~vector()
00269 { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish); }
> for (int i=0;i<length;i++) ptr[i].~T();
> 要するに中身のデストラクタを一つずつ直接呼び出している。
こんなことする必要ない
デストラクタはインスタンスが消滅するまえに自動的に呼ばれる
↓コレはdebug用 みるソースが適切じゃない
> https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a01115_source.html
00078 #ifdef _GLIBCXX_DEBUG
00079 # include <debug/vector> ← コレをみてる
00080 #endif
↓こっちみなさい
https://gcc.gnu.org/onlinedocs/libstdc%2B%2B/libstdc%2B%2B-html-USERS-3.4/stl__vector_8h-source.html
00268 ~vector()
00269 { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish); }
63デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/18(火) 23:48:11.97ID:9yuSYzSe064デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/18(火) 23:49:51.14ID:9yuSYzSe0 × デストラクタの連鎖の開始をキック
○ デストラクタの連鎖をキープ
開始のキックはコンパイラによってされるが、連鎖は手動でキープしてやらないと次に続かない。
コンテナの場合はこれが必要なはず。
○ デストラクタの連鎖をキープ
開始のキックはコンパイラによってされるが、連鎖は手動でキープしてやらないと次に続かない。
コンテナの場合はこれが必要なはず。
65デフォルトの名無しさん (ブーイモ MMbf-nprU)
2018/09/19(水) 10:04:26.05ID:x2iiusAWM newはどうしてるんだい?
placement new?
それなら自分でデストラクタ呼ぶので正解
普通のnewなら、普通にdelete
placement new?
それなら自分でデストラクタ呼ぶので正解
普通のnewなら、普通にdelete
66デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/19(水) 12:58:39.27ID:GJOADTEF0 >>65
ああ、目の付け所はそこで合ってる。
先に言っておこうかとも思ったが、話が無駄にずれるので止めておいた。
わざわざコンテナを作ったのは、コンテナ領域をallocaで確保したかったから。
そこに結果的に placement new して、ヒープ領域にデータ領域を持ったオブジェクトを配置してる。
だからそれらを解放してくれないと不味い。
そのデストラクタをコンテナのデストラクタからキックしている。
(というか、これをやらせる為に簡易コンテナにした。
単にallocaで可変長配列を確保してその中に入れただけでは、
デストラクタを起動するコードが『自前で、上位側に』必要であり、これがC++の思想と反するから)
要するに alloca をもっと使ってみようというテストなのだが、
「コンストラクタで領域を確保出来ない」(関数呼び出しでは初期化出来ない)のが地味に使えない。
C++は何故か forceinline までも「無視していい」という仕様にしているようだし。
(inlineは無視してもよく、forceinlineは無視しては駄目、という仕様に普通はするだろ)
ただ、自作アロケータを既存のコンテナにはめ込めるのなら、その方がいい。
この解があるなら alloca がいらない子扱いなのも道理だ。
ああ、目の付け所はそこで合ってる。
先に言っておこうかとも思ったが、話が無駄にずれるので止めておいた。
わざわざコンテナを作ったのは、コンテナ領域をallocaで確保したかったから。
そこに結果的に placement new して、ヒープ領域にデータ領域を持ったオブジェクトを配置してる。
だからそれらを解放してくれないと不味い。
そのデストラクタをコンテナのデストラクタからキックしている。
(というか、これをやらせる為に簡易コンテナにした。
単にallocaで可変長配列を確保してその中に入れただけでは、
デストラクタを起動するコードが『自前で、上位側に』必要であり、これがC++の思想と反するから)
要するに alloca をもっと使ってみようというテストなのだが、
「コンストラクタで領域を確保出来ない」(関数呼び出しでは初期化出来ない)のが地味に使えない。
C++は何故か forceinline までも「無視していい」という仕様にしているようだし。
(inlineは無視してもよく、forceinlineは無視しては駄目、という仕様に普通はするだろ)
ただ、自作アロケータを既存のコンテナにはめ込めるのなら、その方がいい。
この解があるなら alloca がいらない子扱いなのも道理だ。
67デフォルトの名無しさん (ワッチョイ 57b3-BPXD)
2018/09/19(水) 13:07:07.58ID:C3/7PZtd068デフォルトの名無しさん (ブーイモ MMbf-nprU)
2018/09/19(水) 18:44:36.07ID:x2iiusAWM69デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/19(水) 18:54:14.05ID:GJOADTEF0 >>67
駄目だな。
仮想関数にしないといけないのと、
それは子が子のままでいられるだけであって、子が親のメソッドを使った後も子で居続けられるわけでない。
> 実際に取得する型が親クラスに引っ張られないメリットを享受できる
> 自分自身の型を返す関数を定義する時など、親クラス固定だと、受け取った側でのキャストが面倒ですしね。
> http://cpp.aquariuscode.com/covariant-type
やはり既知の問題ではないか。
(C++しか使ったことがないなら意味が分からないと思うが)
JavaScriptの場合はクラス階層とインスタンス階層が分離しており、
各インスタンスはクラス階層を派生させてを作る。
だから元々親階層のメソッドから子階層のメンバ変数を参照出来るし、それがデフォの使い方だ。
クラス階層とインスタンス階層は文法的には違いが無く、クラスも継承出来るが、インスタンスも継承出来る。
これを上手く使えば、メモリを大幅に節約することが出来る。
C++にはこの記述能力がない。
理由はクラスとインスタンスが明確に分離しているからだ。
JavaScriptの挙動をC++用語で言えば、
thisが常に仮想thisであり、メンバ変数は全部仮想メンバ変数となっている。
だから親のメソッドを使っても派生型のままであり続け、自由にメソッドチェーンが出来る。
ただしここら辺はやや宗教的でもある。
親クラスの関数が派生クラスの変数を操作することを「仮想this」で実現するなら、
型安全ではなくなってしまう。
ただし実装は、単一継承の時には単に型チェックを外すだけと、極めて簡単であり、やる気だけの問題だ。
(ただしC++の場合には多重継承があるので若干問題がある)
なお、型安全を取りたいなら、仮想thisではなく、仮想メンバ変数で実現する事になる。
こちらはC++でも問題はない。(ただし動作速度が遅くなるが)
駄目だな。
仮想関数にしないといけないのと、
それは子が子のままでいられるだけであって、子が親のメソッドを使った後も子で居続けられるわけでない。
> 実際に取得する型が親クラスに引っ張られないメリットを享受できる
> 自分自身の型を返す関数を定義する時など、親クラス固定だと、受け取った側でのキャストが面倒ですしね。
> http://cpp.aquariuscode.com/covariant-type
やはり既知の問題ではないか。
(C++しか使ったことがないなら意味が分からないと思うが)
JavaScriptの場合はクラス階層とインスタンス階層が分離しており、
各インスタンスはクラス階層を派生させてを作る。
だから元々親階層のメソッドから子階層のメンバ変数を参照出来るし、それがデフォの使い方だ。
クラス階層とインスタンス階層は文法的には違いが無く、クラスも継承出来るが、インスタンスも継承出来る。
これを上手く使えば、メモリを大幅に節約することが出来る。
C++にはこの記述能力がない。
理由はクラスとインスタンスが明確に分離しているからだ。
JavaScriptの挙動をC++用語で言えば、
thisが常に仮想thisであり、メンバ変数は全部仮想メンバ変数となっている。
だから親のメソッドを使っても派生型のままであり続け、自由にメソッドチェーンが出来る。
ただしここら辺はやや宗教的でもある。
親クラスの関数が派生クラスの変数を操作することを「仮想this」で実現するなら、
型安全ではなくなってしまう。
ただし実装は、単一継承の時には単に型チェックを外すだけと、極めて簡単であり、やる気だけの問題だ。
(ただしC++の場合には多重継承があるので若干問題がある)
なお、型安全を取りたいなら、仮想thisではなく、仮想メンバ変数で実現する事になる。
こちらはC++でも問題はない。(ただし動作速度が遅くなるが)
70デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/19(水) 19:13:17.80ID:GJOADTEF0 >>68
当初は delete &ptr[i]; と記述していたのだが、これは
1. ptr[i].~T(); (各エレメントのデストラクタのキック)
2. free(ptr[i]); (メモリ区画の解放)
の2つを実行するらしくて、駄目だった。
今の各エレメントはallocaで確保した区画に placement new しているので。
> 不思議なもん作ってんのなw
今回は事前に全部計算してalloca出来るが、
コンテナ長だけ親で確定、中身の長さは子でしか確定出来ないことも普通にあるだろ。
例えば、LGBT共のおかげでFacebookには56種類の性別があるらしいが、
これに対して、無作為に10,000人の性別を調査するとして、
コンテナ長は56で親で決まるが、
各性別人リスト長は子関数で調査しないと決まらないだろ。そこをheapに取ってる。
勿論、親も含めてheapに取り、ジャグvectorとするのがC++流であり、だからC比でいちいち遅くなる。
そこら辺を改善出来ないかのテストだ。
当初は delete &ptr[i]; と記述していたのだが、これは
1. ptr[i].~T(); (各エレメントのデストラクタのキック)
2. free(ptr[i]); (メモリ区画の解放)
の2つを実行するらしくて、駄目だった。
今の各エレメントはallocaで確保した区画に placement new しているので。
> 不思議なもん作ってんのなw
今回は事前に全部計算してalloca出来るが、
コンテナ長だけ親で確定、中身の長さは子でしか確定出来ないことも普通にあるだろ。
例えば、LGBT共のおかげでFacebookには56種類の性別があるらしいが、
これに対して、無作為に10,000人の性別を調査するとして、
コンテナ長は56で親で決まるが、
各性別人リスト長は子関数で調査しないと決まらないだろ。そこをheapに取ってる。
勿論、親も含めてheapに取り、ジャグvectorとするのがC++流であり、だからC比でいちいち遅くなる。
そこら辺を改善出来ないかのテストだ。
71デフォルトの名無しさん (ワッチョイ 57b3-okpm)
2018/09/19(水) 19:58:56.93ID:BNZGTvPz0 ああ、いつぞやのJS厨か・・・相手にするんじゃなかった
72デフォルトの名無しさん (ブーイモ MMbf-nprU)
2018/09/19(水) 22:41:00.05ID:x2iiusAWM >>70
何を悩んでんのかよくわからんが
普通にヒープから取ったんならdeleteだし
スタックをplacement newしたんなら自分でデストラクタ
それだけの話
というかね、はっきり言ってでかいデータをスタックに置く発想がセンスないぞ
何を悩んでんのかよくわからんが
普通にヒープから取ったんならdeleteだし
スタックをplacement newしたんなら自分でデストラクタ
それだけの話
というかね、はっきり言ってでかいデータをスタックに置く発想がセンスないぞ
73デフォルトの名無しさん (ワッチョイ 9780-9b2l)
2018/09/19(水) 22:56:01.63ID:xLP4ypV20 アホやな
スタック関係ない
アホは連続した一枚の板みたいなヒープに
ポインタの列ではなくオブジェクトインスタンスのメモリイメージの列をシリアルに並べてる
ホントな、アホしかいいないわ
スタック関係ない
アホは連続した一枚の板みたいなヒープに
ポインタの列ではなくオブジェクトインスタンスのメモリイメージの列をシリアルに並べてる
ホントな、アホしかいいないわ
74デフォルトの名無しさん (ワッチョイ 979b-BSn2)
2018/09/19(水) 23:06:52.77ID:DfgwCwkm0 俺JavaScriptもやってるけどこいつの言ってることはよくわからんよ
75デフォルトの名無しさん (ワッチョイ 9780-9b2l)
2018/09/19(水) 23:10:27.91ID:xLP4ypV20 たとえば64byteのメモリが必要なクラスがあったとする
アホが作ったコンテナでは例えば要素が5個なら
こんな感じになるとアホはいってるワケ
[0][64byte]
[1][64byte]
[2][64byte]
[3][64byte]
[4][64byte]
メモリの板に64*5のメモリイメージが配置される
要素が1つ増えるたびに64byte必要になることになる
ポインタなら(仮に32bitなら)こうなる
[0][4byte] ← [64byte]
[1][4byte] ← [64byte]
[2][4byte] ← [64byte]
[3][4byte] ← [64byte]
[4][4byte] ← [64byte]
メモリの板に4*5のメモリイメージが配置される
さらに64byteのバラバラのメモリが5個できる
つまりメモリフラグメンテーションがおきることになる
アホが作ったコンテナでは例えば要素が5個なら
こんな感じになるとアホはいってるワケ
[0][64byte]
[1][64byte]
[2][64byte]
[3][64byte]
[4][64byte]
メモリの板に64*5のメモリイメージが配置される
要素が1つ増えるたびに64byte必要になることになる
ポインタなら(仮に32bitなら)こうなる
[0][4byte] ← [64byte]
[1][4byte] ← [64byte]
[2][4byte] ← [64byte]
[3][4byte] ← [64byte]
[4][4byte] ← [64byte]
メモリの板に4*5のメモリイメージが配置される
さらに64byteのバラバラのメモリが5個できる
つまりメモリフラグメンテーションがおきることになる
76デフォルトの名無しさん (ブーイモ MMbf-nprU)
2018/09/19(水) 23:14:17.43ID:x2iiusAWM77デフォルトの名無しさん (ワッチョイ 9780-9b2l)
2018/09/19(水) 23:17:16.10ID:xLP4ypV20 そもそもスタックとかいってるオマエも
相当頭悪いという自覚が必要
相当頭悪いという自覚が必要
78デフォルトの名無しさん (ブーイモ MMbf-nprU)
2018/09/19(水) 23:22:42.98ID:x2iiusAWM allocaって書いてあんだけど
79デフォルトの名無しさん (ワッチョイ 9780-9b2l)
2018/09/19(水) 23:28:50.52ID:xLP4ypV20 さよか
80デフォルトの名無しさん (ワッチョイ 174f-9b2l)
2018/09/19(水) 23:50:52.77ID:GJOADTEF0 >>71
お前が、というより最近の奴が何故
「俺の知ってる言語の『優位性』」に固執するのか甚だ疑問ではある。
ただ、お前は>>37も理解出来てないのだから、まずは「オブジェクト指向」を理解した方がいいぞ。
>>74
JavaScripterはそれ以前で、オブジェクト指向そのものを知らない奴が多いし、
他言語から来た奴は無理に「クラスベース」として捉えようとして誤解し、
しかもそれを垂れ流して間違いを再生産し、どうしようもない状況になってる。
JavaScripterには馬鹿しかいない。これは断言出来る。
>>76
俺はもう動けばいいだけなら普通に作れるんだよ。
その上で、C++の動作速度が遅く、記述がかったるいのを何とかしようと試してる。
先に言っておくが、俺はC比同速程度を目指している。
スマポ(キリッなC++なんてJavaよりちょっと速い程度しか出ないし、それなら俺はCLIを使うからそれでいい。
ただしC流の書き方は見た目分かりにくいから、
C比で遅くならない、或いは多少程度でもうちょっとましに書けないか試している。
今回のにしたって、最速はC流の「頭で全部分確保、ポインタで細切れにして渡す」に決まっている。
ただこれは見た目何をやっているのか分かりにくいし、関数に分割もしづらい。
クラスにしたって、仮想関数なしなら速度もメモリもオーバーヘッドはない。なら使わない手はない。
そういう、C比オーバーヘッド無し(或いは僅か)程度で、どこまで分かりやすい見た目になるかを試してる。
楽に書きたいだけなら、JavaScriptが現状最強だ。
C比5倍程度であの楽さ、他の言語なんてやってられない。
速ければいいだけならCだ。ただし記述が見た目分かりにくいのは否めない。
それでC++でどこまでCを改善出来るかを試している。メソッドチェーンもそれの一環だ。
お前が、というより最近の奴が何故
「俺の知ってる言語の『優位性』」に固執するのか甚だ疑問ではある。
ただ、お前は>>37も理解出来てないのだから、まずは「オブジェクト指向」を理解した方がいいぞ。
>>74
JavaScripterはそれ以前で、オブジェクト指向そのものを知らない奴が多いし、
他言語から来た奴は無理に「クラスベース」として捉えようとして誤解し、
しかもそれを垂れ流して間違いを再生産し、どうしようもない状況になってる。
JavaScripterには馬鹿しかいない。これは断言出来る。
>>76
俺はもう動けばいいだけなら普通に作れるんだよ。
その上で、C++の動作速度が遅く、記述がかったるいのを何とかしようと試してる。
先に言っておくが、俺はC比同速程度を目指している。
スマポ(キリッなC++なんてJavaよりちょっと速い程度しか出ないし、それなら俺はCLIを使うからそれでいい。
ただしC流の書き方は見た目分かりにくいから、
C比で遅くならない、或いは多少程度でもうちょっとましに書けないか試している。
今回のにしたって、最速はC流の「頭で全部分確保、ポインタで細切れにして渡す」に決まっている。
ただこれは見た目何をやっているのか分かりにくいし、関数に分割もしづらい。
クラスにしたって、仮想関数なしなら速度もメモリもオーバーヘッドはない。なら使わない手はない。
そういう、C比オーバーヘッド無し(或いは僅か)程度で、どこまで分かりやすい見た目になるかを試してる。
楽に書きたいだけなら、JavaScriptが現状最強だ。
C比5倍程度であの楽さ、他の言語なんてやってられない。
速ければいいだけならCだ。ただし記述が見た目分かりにくいのは否めない。
それでC++でどこまでCを改善出来るかを試している。メソッドチェーンもそれの一環だ。
81デフォルトの名無しさん (ワッチョイ c980-yqSl)
2018/09/20(木) 00:06:31.99ID:zLqp8E230 だったらふつうにPODの配列でいいわけだからな
82デフォルトの名無しさん (ワッチョイ c980-yqSl)
2018/09/20(木) 00:08:31.80ID:zLqp8E230 Cでわかりにくいコードを書くには
頭悪いという才能がいる
頭悪いという才能がいる
83デフォルトの名無しさん (ワッチョイ c104-Om/S)
2018/09/20(木) 00:15:44.01ID:QHRJIO3f0 allocaの寿命大丈夫?ちょっと気になった、。
8471=67 (ワッチョイ 01b3-coYL)
2018/09/20(木) 00:27:41.21ID:CPfoYuVJ0 >>80
携帯とPCで書いたから同一人物とわからんかったかな
何か実現したいことがあって
>・derived等、継承で親のメソッドを使ったときにも「呼び出し側の型」を返す為のキーワードの整備
と書いてたんだと思って、解決策になるかもしれない情報を教えてあげようと思ったら
感謝もせんとC++に対するヘイトを垂れ流すだけだったから「ああ、あいつか・・・」となったんだが
>「俺の知ってる言語の『優位性』」に固執する
どこをどう読んだらそうなるのかわからん。というか鏡見ろ
携帯とPCで書いたから同一人物とわからんかったかな
何か実現したいことがあって
>・derived等、継承で親のメソッドを使ったときにも「呼び出し側の型」を返す為のキーワードの整備
と書いてたんだと思って、解決策になるかもしれない情報を教えてあげようと思ったら
感謝もせんとC++に対するヘイトを垂れ流すだけだったから「ああ、あいつか・・・」となったんだが
>「俺の知ってる言語の『優位性』」に固執する
どこをどう読んだらそうなるのかわからん。というか鏡見ろ
85デフォルトの名無しさん (ワッチョイ c980-yqSl)
2018/09/20(木) 00:31:01.70ID:zLqp8E230 遅いのはオマエのウンココードのアルゴリズムのせいだからな
気にする必要ないほどのオーバーヘッドが問題じゃない
気にする必要ないほどのオーバーヘッドが問題じゃない
86デフォルトの名無しさん (ワッチョイ f94f-yqSl)
2018/09/20(木) 00:50:45.72ID:Yonx2vGH0 >>72
> スタックをplacement newしたんなら自分でデストラクタ
自分でデストラクタを書かなくて済むようにコンテナを用意してるんだよ。
というか、そもそもC++の思想はそうではないか?
ある意味、クラス外のコードでデストラクタを書いたら負けだろ。
そしてコンテナを用意するだけでこれを回避出来る。
それだけの話だ。
「書けばいい」の発想もいいが、俺はもうそれは十分出来るので、
書かなくて済む物を如何に増やすか、それを試してる。
結局、スクリプト言語が楽なのはここだし。
>>83
もう動作はしてるし、結果も比較して問題ないのを確認済み。
まあ、 alloca は相当使いづらいことも分かった。
>>84
いや、ワッチョイが同一だから同一人物だと認識してる。
> 解決策になるかもしれない情報を教えてあげようと思ったら
解決策になってないし、お前はそれが間違いだとも認識出来てない。
お前の情報は何の役にも立ってない。
馬鹿が間違ったことを言ってきて「間違ってるぞ」と言ったら「それでも感謝しろ」と言われた状況だ。
そういう考え方もありだが、俺はここではそれをしないし、する必要も無いし、するべきでもないと思ってる。
ここでは、間違ったことを言った奴は叩かれるべきだ。
そうでないと馬鹿がどんどん寄ってきて、結果、レベルが下がり、誰にとっても利益が無くなる。
間違ったことを言っても感謝されたいなら、少なくともIDやコテハンが付いてる場所へ行け。
そういうところが好きなら、そういう場所を盛り上げるべきであって、ここで文句を言うべきではない。
> スタックをplacement newしたんなら自分でデストラクタ
自分でデストラクタを書かなくて済むようにコンテナを用意してるんだよ。
というか、そもそもC++の思想はそうではないか?
ある意味、クラス外のコードでデストラクタを書いたら負けだろ。
そしてコンテナを用意するだけでこれを回避出来る。
それだけの話だ。
「書けばいい」の発想もいいが、俺はもうそれは十分出来るので、
書かなくて済む物を如何に増やすか、それを試してる。
結局、スクリプト言語が楽なのはここだし。
>>83
もう動作はしてるし、結果も比較して問題ないのを確認済み。
まあ、 alloca は相当使いづらいことも分かった。
>>84
いや、ワッチョイが同一だから同一人物だと認識してる。
> 解決策になるかもしれない情報を教えてあげようと思ったら
解決策になってないし、お前はそれが間違いだとも認識出来てない。
お前の情報は何の役にも立ってない。
馬鹿が間違ったことを言ってきて「間違ってるぞ」と言ったら「それでも感謝しろ」と言われた状況だ。
そういう考え方もありだが、俺はここではそれをしないし、する必要も無いし、するべきでもないと思ってる。
ここでは、間違ったことを言った奴は叩かれるべきだ。
そうでないと馬鹿がどんどん寄ってきて、結果、レベルが下がり、誰にとっても利益が無くなる。
間違ったことを言っても感謝されたいなら、少なくともIDやコテハンが付いてる場所へ行け。
そういうところが好きなら、そういう場所を盛り上げるべきであって、ここで文句を言うべきではない。
87デフォルトの名無しさん (ワッチョイ 82b3-coYL)
2018/09/20(木) 00:55:35.41ID:GN4jSvWj0 まぁまぁ御託はいいからお前のコードを全部さらせよ
添削してやっから
あとベンチマークの結果も書いとけ
添削してやっから
あとベンチマークの結果も書いとけ
88デフォルトの名無しさん (ワッチョイ 499b-9lLk)
2018/09/20(木) 01:01:28.49ID:tucHfSy60 それが一番やな
89デフォルトの名無しさん (ワッチョイ 82d8-jhFb)
2018/09/20(木) 04:25:13.14ID:gyMuKR+I0 IntelのC++ Composerってサポート期限切れのシリアルでも使用可能なバージョンがあるのね
知らなかったよ
2017 update7
>This update can be installed even if your support service has expired using your existing Serial Number.
知らなかったよ
2017 update7
>This update can be installed even if your support service has expired using your existing Serial Number.
90デフォルトの名無しさん (ワッチョイ 42a1-UYTc)
2018/09/20(木) 22:36:33.27ID:sE8+iEgQ0 はじめまして
ゼミの課題でc++でバカラのプログラムかいてこいって言われたんですけど
簡単ですか?
ゼミの課題でc++でバカラのプログラムかいてこいって言われたんですけど
簡単ですか?
91デフォルトの名無しさん (ブーイモ MMb6-WirJ)
2018/09/20(木) 22:39:33.57ID:COenw0G8M はい特定
92デフォルトの名無しさん (ワッチョイ c980-yqSl)
2018/09/20(木) 22:41:55.13ID:zLqp8E230 まずサイコロの運動をシミュレーションするところから
93デフォルトの名無しさん (ワッチョイ c104-Om/S)
2018/09/20(木) 22:46:32.99ID:QHRJIO3f094デフォルトの名無しさん (ワッチョイ c980-yqSl)
2018/09/20(木) 22:48:19.01ID:zLqp8E230 待ち行列で客が待つのもポアソン分布使ってシミュレーションする必要がある
95デフォルトの名無しさん (ワッチョイ 8a3a-73bl)
2018/12/04(火) 23:43:54.89ID:U8JiD/qF0 devirtualizationはまだclangだけ?
97デフォルトの名無しさん (ワッチョイ ffab-vS77)
2019/02/04(月) 14:39:50.96ID:BGg5R2c70 Win10で、でかいメモリを使おうとすると0xc0000017で落ちるんだけど
制限を解除する方法あったっけ?
制限を解除する方法あったっけ?
98デフォルトの名無しさん (ワッチョイ df7b-Z3mi)
2019/02/04(月) 15:45:55.20ID:01AVniBC0 「64bitのコードでコンパイルするよう指定」するやつだっけ?
「デカいメモリ」「エラーコード〜でブルースクリーン」ていう
キーワードで、記憶に引っかかる感じ。
「デカいメモリ」「エラーコード〜でブルースクリーン」ていう
キーワードで、記憶に引っかかる感じ。
99デフォルトの名無しさん (ワッチョイ aeab-feI+)
2019/02/11(月) 08:41:29.58ID:NAZP4pfo0 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0551r3.pdf
C++20で、std空間内で宣言されたテンプレートをユーザが特殊化するのを
禁止しようって提案が出てるみたいなんだけど、どうよ?
俺はhashが特殊化できないのは困ると思うんだが
C++20で、std空間内で宣言されたテンプレートをユーザが特殊化するのを
禁止しようって提案が出てるみたいなんだけど、どうよ?
俺はhashが特殊化できないのは困ると思うんだが
100デフォルトの名無しさん (ワッチョイ 254e-feI+)
2019/02/11(月) 15:16:43.87ID:cjWMt0nf0 ちょっとありえない気がする。大量のコードの互換性が失われるよね。
ostream/wostreamも存在意義を真っ向から否定するような変更では?
ostream/wostreamも存在意義を真っ向から否定するような変更では?
101デフォルトの名無しさん (ワッチョイ d97b-l1YC)
2019/02/13(水) 10:03:42.66ID:SbDYRWkR0 >>99
pdfは読んでいないが妥当だろう。生産性は上がる。
特殊化したければオレオレ名前空間でstdを継承し、それを使え、でいい。
stdを直接変更している糞コードなんてどこかの時点で切り捨てる必要がある。
それがそろそろだという判断だろうし、実際、妥当だと思う。
pdfは読んでいないが妥当だろう。生産性は上がる。
特殊化したければオレオレ名前空間でstdを継承し、それを使え、でいい。
stdを直接変更している糞コードなんてどこかの時点で切り捨てる必要がある。
それがそろそろだという判断だろうし、実際、妥当だと思う。
102デフォルトの名無しさん (ワッチョイ ae82-feI+)
2019/02/13(水) 11:42:38.93ID:oF8nMyvD0103デフォルトの名無しさん (ワッチョイ 8701-Qg7j)
2019/02/19(火) 02:22:21.41ID:yWMNMYfE0 別の名前空間で特殊化とか出来たっけ??
104デフォルトの名無しさん (ワッチョイ a6ca-rusg)
2019/02/21(木) 07:05:37.62ID:0ZBMuCH70 しかもstdという空間名だけ、言語が特別扱いとかおかしいだろ
105デフォルトの名無しさん (ワッチョイ 9eef-upo5)
2019/02/22(金) 04:02:38.57ID:dY5D0a5T0 c#よりC++のほうがいいんですか?
106デフォルトの名無しさん (ワッチョイ 3a32-rusg)
2019/02/22(金) 04:05:58.60ID:15zpzt8/0 どっちでもいい
107デフォルトの名無しさん (ワッチョイ 9f2f-W5e4)
2019/03/04(月) 10:10:34.95ID:kNFhD2SD0 エラー出るんだけどさ
mt19937 en;
int ep[en.state_size];
random_device rd;
generate(begin(ep), end(ep), rd); //C2280
このラムダみたいなことをやってくれる標準の何かない?
generate(begin(ep), end(ep), [&rd]{ return rd(); });
mt19937 en;
int ep[en.state_size];
random_device rd;
generate(begin(ep), end(ep), rd); //C2280
このラムダみたいなことをやってくれる標準の何かない?
generate(begin(ep), end(ep), [&rd]{ return rd(); });
109デフォルトの名無しさん (ワッチョイ d77d-3oSp)
2019/03/04(月) 11:42:55.83ID:oS3uKTCY0 generate(begin(ep), end(ep), en)
は?
は?
110デフォルトの名無しさん (ワッチョイ 9f2f-W5e4)
2019/03/04(月) 15:42:52.84ID:kNFhD2SD0 >>109
このあと、en.seek(begin(ep), end(ep)); とやりたいわけで。。。
このあと、en.seek(begin(ep), end(ep)); とやりたいわけで。。。
111デフォルトの名無しさん (ワッチョイ 9ff7-3oSp)
2019/03/04(月) 19:55:50.41ID:nY1Z2C3a0 >>107
generate(begin(ep), end(ep), ref(rd));
generate(begin(ep), end(ep), ref(rd));
112デフォルトの名無しさん (ワッチョイ 9f2f-W5e4)
2019/03/04(月) 21:30:57.13ID:kNFhD2SD0113デフォルトの名無しさん (ワッチョイ e3d4-KxX0)
2019/04/29(月) 06:55:11.19ID:rwrhSar80114デフォルトの名無しさん (ワッチョイ 7b7c-TO5r)
2019/05/07(火) 18:55:08.99ID:kySkQDUz0 そもそもP0551R3で禁止されるのは関数テンプレートの特殊化についてであって
std::hashなんかのクラステンプレートの特殊化は特に禁止されないのでは?
クラステンプレートの特殊化まで禁止されるとstd::tuple_sizeみたいなユーザによる特殊化ありきの機能が軒並み消滅する事になると思うんだが
std::hashなんかのクラステンプレートの特殊化は特に禁止されないのでは?
クラステンプレートの特殊化まで禁止されるとstd::tuple_sizeみたいなユーザによる特殊化ありきの機能が軒並み消滅する事になると思うんだが
115デフォルトの名無しさん (ワッチョイ 9b6d-ahOC)
2019/05/08(水) 10:03:00.99ID:LqpjdKM80 あ、そうなんだ
悪りい、そこまで読んでなかった
悪りい、そこまで読んでなかった
116デフォルトの名無しさん (ワキゲー MM4f-Pc47)
2019/05/09(木) 13:43:19.58ID:OHS2EL3gM >>102
>>101じゃない&亀レスですまんけど、
普通にHasher関数オブジェクトを自作して、std::unordered_setのテンプレート第二引数として渡せばいいんじゃないか?
わざわざC2280の解決のためにstd::hashを特殊化するのはナンセンスだと思われる
example:
https://wandbox.org/permlink/mSO96qJDavoK1jqI
>>101じゃない&亀レスですまんけど、
普通にHasher関数オブジェクトを自作して、std::unordered_setのテンプレート第二引数として渡せばいいんじゃないか?
わざわざC2280の解決のためにstd::hashを特殊化するのはナンセンスだと思われる
example:
https://wandbox.org/permlink/mSO96qJDavoK1jqI
117デフォルトの名無しさん (アウアウウー Sa1b-Ck8H)
2019/05/09(木) 13:59:47.44ID:aE0sIHzaa >>116
ちなみにlambda式も渡せる?
ちなみにlambda式も渡せる?
118デフォルトの名無しさん (ワキゲー MM4f-Pc47)
2019/05/09(木) 15:01:22.74ID:OHS2EL3gM >>117
テンプレートへの渡し方が微妙だけど可能
autoでラムダ受け取っておいてdecltypeで渡すか、std::functionを受け皿にするかだな
example:
https://wandbox.org/permlink/qDm0vA6MWDrIksih
テンプレートへの渡し方が微妙だけど可能
autoでラムダ受け取っておいてdecltypeで渡すか、std::functionを受け皿にするかだな
example:
https://wandbox.org/permlink/qDm0vA6MWDrIksih
119デフォルトの名無しさん (ワッチョイ d7f6-y0Vo)
2019/05/09(木) 22:06:08.12ID:3+FGd20y0120デフォルトの名無しさん (ワッチョイ d7f6-y0Vo)
2019/05/09(木) 22:07:16.61ID:3+FGd20y0 ごめ、ありえない変換ミス()しちまった
-それやはやだな
+それはやだな
俺、純血の日本人だよ
信じて
-それやはやだな
+それはやだな
俺、純血の日本人だよ
信じて
121デフォルトの名無しさん (ワッチョイ 571f-dVT0)
2019/05/09(木) 22:09:28.48ID:4ka/9Zuh0 ウソつけ絶対大陸人だゾ
122デフォルトの名無しさん (アウアウウー Sa1b-tfUF)
2019/05/09(木) 23:15:47.91ID:X/G5tafaa >>120
純潔(童貞)の日本人だろ、信じるよ。
純潔(童貞)の日本人だろ、信じるよ。
123デフォルトの名無しさん (アウアウウー Sad3-ihfx)
2019/07/23(火) 17:48:26.74ID:/+gBwcB6a C++じゃないとできないすごいこと教えて
124デフォルトの名無しさん (ワッチョイ 0ff6-0ngu)
2019/07/23(火) 17:55:03.98ID:4sm3RNn+0 作れるものと作れないものは同じだ
文法的に「すごい」のというと、たとえばラムダ式とか構造化束縛、raw-string-literalあたり
型推定もCで頭固くなっちまった人にはそこそこカルチャーショックだよ
文法的に「すごい」のというと、たとえばラムダ式とか構造化束縛、raw-string-literalあたり
型推定もCで頭固くなっちまった人にはそこそこカルチャーショックだよ
125デフォルトの名無しさん (ワッチョイ 3f40-fYy3)
2019/07/23(火) 21:08:02.46ID:SF7VhVJD0 >>123
ゲームだろ。
ゲームだろ。
126デフォルトの名無しさん (ワッチョイ 4f5f-X8/T)
2019/07/23(火) 22:22:13.57ID:dbImuYuB0 >>123
競プロ
競プロ
127デフォルトの名無しさん (ワッチョイ 3f5c-ihfx)
2019/07/24(水) 01:36:46.76ID:crK8vf170 やっぱりC++ってすごくないんだ
128デフォルトの名無しさん (ドコグロ MMbf-TsWF)
2019/07/24(水) 07:35:18.89ID:4NAru7RoM >>124
型推論は他の言語でもあるからそんなに驚きはないけどraw string literalはやり過ぎだろ
型推論は他の言語でもあるからそんなに驚きはないけどraw string literalはやり過ぎだろ
129デフォルトの名無しさん (ワッチョイ 7f7c-CMz4)
2019/07/24(水) 10:35:13.16ID:N8NvLFq20 >>123
世界征服
世界征服
130デフォルトの名無しさん (ワッチョイ 0a61-5Ye2)
2019/07/25(木) 00:54:02.58ID:tRj/Vr/s0 >>123
・例えばAIライブラリは速度面からC++で組まれることが普通。
・言語コンパイラもコンパイル速度を重視すればC++が最適。
・AndroidOSそのものもC/C++で組まれる。
・Java Virtual Machineも、PC EmulatorもC/C++で組まれる。
・同程度の性能のデバイスでAndoidとiOSを比べたとき、前者が遅いといわれるのは
全社はJava(仮想コードにコンパイルされる)、後者はSwing(native binaryにコンパイルされる)
からが大きいと考えられる。
・例えばAIライブラリは速度面からC++で組まれることが普通。
・言語コンパイラもコンパイル速度を重視すればC++が最適。
・AndroidOSそのものもC/C++で組まれる。
・Java Virtual Machineも、PC EmulatorもC/C++で組まれる。
・同程度の性能のデバイスでAndoidとiOSを比べたとき、前者が遅いといわれるのは
全社はJava(仮想コードにコンパイルされる)、後者はSwing(native binaryにコンパイルされる)
からが大きいと考えられる。
>>130
では Java で記述されたコードをコンパイルした成果物が native binary であればいいのですね、これは商機があるかもしれませんね
では Java で記述されたコードをコンパイルした成果物が native binary であればいいのですね、これは商機があるかもしれませんね
132デフォルトの名無しさん (ワッチョイ fa32-/0C9)
2019/07/26(金) 00:27:28.49ID:6P+xswxu0 それ30億のデバイスで走る?
133デフォルトの名無しさん (ワッチョイ 7bf6-ZVB1)
2019/07/26(金) 07:00:05.65ID:klJ/NeRW0 甘いな
native binaryでありさえすればいいってもんじゃない
上手いマシン語と下手なマシン語がある
native binaryでありさえすればいいってもんじゃない
上手いマシン語と下手なマシン語がある
134デフォルトの名無しさん (ワッチョイ 1f61-5Ye2)
2019/07/26(金) 07:12:48.67ID:4yTQHcMn0 >>131
実は、>>133が指摘してる通り JavaやC#は言語仕様そのものが native binary
に直してもC++ほどの速度にはなりにくい。例えば遅くなる理由として
1. GC(Garbage Collection)によって自動的にfreeやdeleteさせようとする仕様。
2. 標準的にはポインタを使わない仕様。
3. オブジェクトが構造体やスタックに埋め込まれずにheapからnewされ易い仕様。
4. 二次元以上の配列がJaggyタイプに成り易い仕様。
5. バッファオーバーランの防止のため、配列の境界チェックが行われやすい仕様。
6. ライブラリが巨大なため起動時に大量のコードがディスクから読み出されるため、
起動が遅く成り易いこと。巨大になる理由の一つはリフレクションや型に
#includeによる静的コンパイルをせずにすますためののクラスの型情報などが
(Javaの場合は*.classや*.jarなどの)ライブラリに入っているためだろうか。
例えば、C#も予めnative binaryに直してしまう方法も有るが、それでも起動速度は
余り早くならないらしい。起動後も1.〜5.の理由のためC++程の速度にはなりにくい。
実は、>>133が指摘してる通り JavaやC#は言語仕様そのものが native binary
に直してもC++ほどの速度にはなりにくい。例えば遅くなる理由として
1. GC(Garbage Collection)によって自動的にfreeやdeleteさせようとする仕様。
2. 標準的にはポインタを使わない仕様。
3. オブジェクトが構造体やスタックに埋め込まれずにheapからnewされ易い仕様。
4. 二次元以上の配列がJaggyタイプに成り易い仕様。
5. バッファオーバーランの防止のため、配列の境界チェックが行われやすい仕様。
6. ライブラリが巨大なため起動時に大量のコードがディスクから読み出されるため、
起動が遅く成り易いこと。巨大になる理由の一つはリフレクションや型に
#includeによる静的コンパイルをせずにすますためののクラスの型情報などが
(Javaの場合は*.classや*.jarなどの)ライブラリに入っているためだろうか。
例えば、C#も予めnative binaryに直してしまう方法も有るが、それでも起動速度は
余り早くならないらしい。起動後も1.〜5.の理由のためC++程の速度にはなりにくい。
135デフォルトの名無しさん (ワッチョイ 1f61-5Ye2)
2019/07/26(金) 07:28:28.01ID:4yTQHcMn0 >>134
7. C#のリンクリストの場合、要素を削除する場合、文字列などの要素の中身か、
要素番号を指定する必要が有る。要素Bを有る要素Aの後ろに追加する場合、
Aの要素番号を指定する必要が有る。これが遅くなる。C/C++本来のリンクリストは
削除や追加の場所の指定をポインタ(アドレス)で指定できることが速度上の大きな
優位性であったのにそれが出来ない。なお、詳しくはないがC++のSTLのstd::listの場合は、
同様の「不具合」があるためリンクリストの本来の性能が出ないかもしれない。
しかし、それはSTLがC/C++の昔から使われていた本来のリンクリストの実装の仕方を
していないからであると思われる。
7. C#のリンクリストの場合、要素を削除する場合、文字列などの要素の中身か、
要素番号を指定する必要が有る。要素Bを有る要素Aの後ろに追加する場合、
Aの要素番号を指定する必要が有る。これが遅くなる。C/C++本来のリンクリストは
削除や追加の場所の指定をポインタ(アドレス)で指定できることが速度上の大きな
優位性であったのにそれが出来ない。なお、詳しくはないがC++のSTLのstd::listの場合は、
同様の「不具合」があるためリンクリストの本来の性能が出ないかもしれない。
しかし、それはSTLがC/C++の昔から使われていた本来のリンクリストの実装の仕方を
していないからであると思われる。
136デフォルトの名無しさん (ワッチョイ abe8-BZpS)
2019/07/26(金) 12:04:17.56ID:2lr5ek+30 Javaってランタイムがプリミティブなってるクラスを実行することがあったと思うけど、
ネーティブではそのプリミティブ型のクラスを分解してマシン語にしないといけなかった気がする。
ネーティブではそのプリミティブ型のクラスを分解してマシン語にしないといけなかった気がする。
137デフォルトの名無しさん (ワッチョイ 7bf6-ZVB1)
2019/07/26(金) 12:42:19.26ID:klJ/NeRW0 vs2019なんだけどさ
void f(path&& pt)
{
auto date = last_write_time(pt);
auto val = decltype(date)::clock::to_time_t(date); //C2039
}
これどうやってtime_tもらうの?
void f(path&& pt)
{
auto date = last_write_time(pt);
auto val = decltype(date)::clock::to_time_t(date); //C2039
}
これどうやってtime_tもらうの?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★4 [Hitzeschleier★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 自民・麻生太郎副総裁 石破政権の1年は「どよーん」 高市政権発足で「何となく明るくなった」「世の中のことが決まり動いている」★2 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- ボーナスで何買うか迷っている
- 刃牙でチンコでかそうなキャラといえば
- コウメ太夫のネタ考えたから評価してくれ
- トランプ、G7に代わるcore 5を発表 [805596214]
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
