次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part134
http://mevius.5ch.net/test/read.cgi/tech/1516406742/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/
■長いソースを貼るときはここへ。■
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++相談室 part135
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 5fcb-q1Nq)
2018/03/31(土) 20:20:06.25ID:o3PNwIlC0666デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 13:39:04.83ID:PbE4ojLD0667デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 13:41:20.71ID:QiJLTR+Nd668デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 13:42:51.66ID:QiJLTR+Nd >>666
君独自の定義とか持ち出さないでくれ
君独自の定義とか持ち出さないでくれ
669デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 13:44:31.67ID:PbE4ojLD0 >>665
> virtual関数は関数ポインタテーブルへのポインタを持ってるだけ
> 同じことは当然Cの構造体でも出来る
Cでやる場合は、関数ポインタを引数で渡すことも出来るんだよ。
(勿論C++でも出来るが、クラスを使う意味が無くなるから普通はやらない)
この場合、間接参照が抜ける分だけ速くなる。
(実際はメモリアクセス1個よりはキャッシュを壊すことの影響の方が大きいとは思うが)
> virtual関数は関数ポインタテーブルへのポインタを持ってるだけ
> 同じことは当然Cの構造体でも出来る
Cでやる場合は、関数ポインタを引数で渡すことも出来るんだよ。
(勿論C++でも出来るが、クラスを使う意味が無くなるから普通はやらない)
この場合、間接参照が抜ける分だけ速くなる。
(実際はメモリアクセス1個よりはキャッシュを壊すことの影響の方が大きいとは思うが)
670デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 13:45:03.28ID:QiJLTR+Nd C++独自の機能を使うとCより常に遅い?
それは嘘だな
それは嘘だな
671デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 13:47:32.05ID:QiJLTR+Nd672デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 13:49:15.64ID:PbE4ojLD0673デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 13:51:18.48ID:QiJLTR+Nd674デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 13:53:21.45ID:QiJLTR+Nd675デフォルトの名無しさん
2018/05/12(土) 13:53:48.97 >>658って単に32bitプログラムを64bit CPUで走らせてオーバーヘッドがーって言ってるんじゃね?
676デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:01:29.48ID:PbE4ojLD0 >>674
君は理解できてないようだから、定義を確認しておこう。
ただしこれは一般的な解釈であり、おそらくこのスレの住民は共有してる。
・テンプレート、クラス構文、スマポ等、
C++コンパイラではないと通らない機能を使ったコードを、C++のコードという。
・その他、関数ポインタ等、Cコンパイラでも通る機能のみで書かれたコードを、Cのコードという。
> 一般に、カーネルモジュールをC++で設計するやつは、以下のいずれかだ。
>
> (a) 好んで厄介事に巻き込まれたい者
> (b) 自分が書いているのは実はCだと気がついていないC++バカ
> (c) 授業でそういう課題を与えられた者
>
> (d)を付け加えるなら好きにしてくれ。
>
> Linus
> https://cpplover.blogspot.jp/2013/05/linus-torvalsc.html
君は多分(b)だね。
今の話題はC++のコードとCのコードの速度比較ということでよろしく。
>>673
> C++で最適化に行き詰まった時に
> わざわざコンパイラをCに変えて最適化する事なんてないから
そんな話は誰もしてない。
勿論その場合はCのコードに変更し、C++コンパイラを使うに決まっている。
じゃないと他の部分が通らないだろ。
君の定義は、C++コンパイラを使っていればどういう書き方であってC++ということだったのか。
なら話は噛み合わないさ。
君は理解できてないようだから、定義を確認しておこう。
ただしこれは一般的な解釈であり、おそらくこのスレの住民は共有してる。
・テンプレート、クラス構文、スマポ等、
C++コンパイラではないと通らない機能を使ったコードを、C++のコードという。
・その他、関数ポインタ等、Cコンパイラでも通る機能のみで書かれたコードを、Cのコードという。
> 一般に、カーネルモジュールをC++で設計するやつは、以下のいずれかだ。
>
> (a) 好んで厄介事に巻き込まれたい者
> (b) 自分が書いているのは実はCだと気がついていないC++バカ
> (c) 授業でそういう課題を与えられた者
>
> (d)を付け加えるなら好きにしてくれ。
>
> Linus
> https://cpplover.blogspot.jp/2013/05/linus-torvalsc.html
君は多分(b)だね。
今の話題はC++のコードとCのコードの速度比較ということでよろしく。
>>673
> C++で最適化に行き詰まった時に
> わざわざコンパイラをCに変えて最適化する事なんてないから
そんな話は誰もしてない。
勿論その場合はCのコードに変更し、C++コンパイラを使うに決まっている。
じゃないと他の部分が通らないだろ。
君の定義は、C++コンパイラを使っていればどういう書き方であってC++ということだったのか。
なら話は噛み合わないさ。
677デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 14:05:34.23ID:D96wT16B0 #define SIZE 100000000
long long array[SIZE];
int comp(void const* lhs, void const* rhs)
{
if(*(long long*)lhs < *(long long*)rhs) return -1;
if(*(long long*)lhs > *(long long*)rhs) return +1;
return 0;
}
int main(void)
{
clock_t t0 = clock();
qsort(array, SIZE, sizeof(long long), comp);
clock_t t1 = clock();
printf("%g[sec]\n", (double)(t1 - t0) / CLOCKS_PER_SEC); //2.288[sec]
}
long long array[SIZE];
int comp(void const* lhs, void const* rhs)
{
if(*(long long*)lhs < *(long long*)rhs) return -1;
if(*(long long*)lhs > *(long long*)rhs) return +1;
return 0;
}
int main(void)
{
clock_t t0 = clock();
qsort(array, SIZE, sizeof(long long), comp);
clock_t t1 = clock();
printf("%g[sec]\n", (double)(t1 - t0) / CLOCKS_PER_SEC); //2.288[sec]
}
678デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 14:06:21.60ID:D96wT16B0 #define SIZE 100000000
long long array[SIZE];
int main(void)
{
clock_t t0 = clock();
std::sort(array, array + SIZE, std::less<long long>());
clock_t t1 = clock();
printf("%g[sec]\n", (double)(t1 - t0) / CLOCKS_PER_SEC); //8.245[sec] ・・・あれ? 何だこりゃ
}
long long array[SIZE];
int main(void)
{
clock_t t0 = clock();
std::sort(array, array + SIZE, std::less<long long>());
clock_t t1 = clock();
printf("%g[sec]\n", (double)(t1 - t0) / CLOCKS_PER_SEC); //8.245[sec] ・・・あれ? 何だこりゃ
}
679デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/12(土) 14:07:22.82ID:VFvkGYoW0680デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:14:29.71ID:PbE4ojLD0681デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/12(土) 14:14:45.58ID:VFvkGYoW0 >>676
> ・その他、関数ポインタ等、Cコンパイラでも通る機能のみで書かれたコードを、Cのコードという。
可変長配列とか使ってないならC++のコードでもある
つまりC++の範疇で書き直してるだけ
って言うのが大方の人の解釈だと思うが
> ・その他、関数ポインタ等、Cコンパイラでも通る機能のみで書かれたコードを、Cのコードという。
可変長配列とか使ってないならC++のコードでもある
つまりC++の範疇で書き直してるだけ
って言うのが大方の人の解釈だと思うが
682デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 14:18:31.88ID:D96wT16B0683デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 14:20:49.93ID:QiJLTR+Nd684デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:22:26.74ID:PbE4ojLD0685デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 14:26:21.88ID:D96wT16B0 >>676
たとえばヘッダファイルなんか、同一のファイルを
Cコンパイラに入力したり
C++コンパイラに入力したり
ってこともあるよな
内容には無関係で単に
Cコンパイラに入力したらCのコードで
C++コンパイラに入力したらC++のコードだろ
最適化の内容だってrestrictのように
CとC++で違ってくる可能性はあるしな
たとえばヘッダファイルなんか、同一のファイルを
Cコンパイラに入力したり
C++コンパイラに入力したり
ってこともあるよな
内容には無関係で単に
Cコンパイラに入力したらCのコードで
C++コンパイラに入力したらC++のコードだろ
最適化の内容だってrestrictのように
CとC++で違ってくる可能性はあるしな
686デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:27:02.49ID:PbE4ojLD0 >>682
最適化の掛け忘れでは?
Cの方はほぼ最適コードだが、(メモリアクセス減らして一時変数に取れとかその程度)
C++の方は最適化無しだとトンデモコードが出てくるが、
最適化でそれを消すからおkというノリだったと思ったぞ。
最適化無し同士の比較は意味がない。最大最適化同士の比較やってみそ。
最適化の掛け忘れでは?
Cの方はほぼ最適コードだが、(メモリアクセス減らして一時変数に取れとかその程度)
C++の方は最適化無しだとトンデモコードが出てくるが、
最適化でそれを消すからおkというノリだったと思ったぞ。
最適化無し同士の比較は意味がない。最大最適化同士の比較やってみそ。
687デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 14:27:22.97ID:QiJLTR+Nd 使うモジュールの差を言語で言うから話が紛れる
で、
君の定義であるごく一般的な記述を行った場合の話であれば
C++の方が速いこともあるしCの方が速いこともある
C++はテンプレートによって専用のコードをたくさん作る
当然汎用バイナリよりも専用バイナリの方が最適化がかかりやすいし、
変数よりも即値の方が速いことも多い
C++例外処理も有効で、
これによって処理が速くなる場合がある
で、
君の定義であるごく一般的な記述を行った場合の話であれば
C++の方が速いこともあるしCの方が速いこともある
C++はテンプレートによって専用のコードをたくさん作る
当然汎用バイナリよりも専用バイナリの方が最適化がかかりやすいし、
変数よりも即値の方が速いことも多い
C++例外処理も有効で、
これによって処理が速くなる場合がある
688デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 14:27:42.28ID:D96wT16B0 >>686
gcc unko.c -O3でやってる
gcc unko.c -O3でやってる
689デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:29:31.07ID:PbE4ojLD0690デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 14:30:30.03ID:QiJLTR+Nd691デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:35:18.35ID:PbE4ojLD0 >>687
> 君の定義であるごく一般的な記述を行った場合の話であれば
> C++の方が速いこともあるしCの方が速いこともある
ねーよ。
実例挙げてみ?
それって単なるコンパイラの適性であって、コード自体の速度ではないだろ。
C++とCの本質的な速度差ってのは絶対にひっくり返らないものであって、
例えば、スマポを使っている限り参照ポインタを管理する分だけ遅くなる、というもの。
コンパイラがどう進化しても、「0」「ADDまたはDEC命令」の差はひっくり返らないんだよ。
> C++例外処理も有効で、
> これによって処理が速くなる場合がある
ねーよ。Cは最初から全部noexceptだ。
> 君の定義であるごく一般的な記述を行った場合の話であれば
> C++の方が速いこともあるしCの方が速いこともある
ねーよ。
実例挙げてみ?
それって単なるコンパイラの適性であって、コード自体の速度ではないだろ。
C++とCの本質的な速度差ってのは絶対にひっくり返らないものであって、
例えば、スマポを使っている限り参照ポインタを管理する分だけ遅くなる、というもの。
コンパイラがどう進化しても、「0」「ADDまたはDEC命令」の差はひっくり返らないんだよ。
> C++例外処理も有効で、
> これによって処理が速くなる場合がある
ねーよ。Cは最初から全部noexceptだ。
692デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 14:35:49.71ID:QiJLTR+Nd ソートって
メモリサイズ
比較コスト
コピーコスト
キャッシュサイズ
...
こんなんで結果(時間)が大きく異なるんだよね
クイックソートだと
データの並び順でもたまたま選んだピボット値でも変わる
1個の場合を比較してもあまり意味が無いぞ
メモリサイズ
比較コスト
コピーコスト
キャッシュサイズ
...
こんなんで結果(時間)が大きく異なるんだよね
クイックソートだと
データの並び順でもたまたま選んだピボット値でも変わる
1個の場合を比較してもあまり意味が無いぞ
693デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 14:36:05.87ID:D96wT16B0694デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 14:36:46.83ID:D96wT16B0695デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:37:45.07ID:PbE4ojLD0696デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 14:37:57.15ID:D96wT16B0 >>689
ん? なんで?
ん? なんで?
697デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:44:25.97ID:PbE4ojLD0 >>693
それさ、以下の3条件でやってみ。
1) Cのコード(677)を、Cコンパイラ
2) Cのコード(677)を、C++コンパイラ ←追加
3) C++のコー(678)を、C++コンパイラ
Cコンパイラってポインタ周りは最適化をかけないから、多分、
速度差はコンパイラ起因であって、コード起因では無いと思う。
それさ、以下の3条件でやってみ。
1) Cのコード(677)を、Cコンパイラ
2) Cのコード(677)を、C++コンパイラ ←追加
3) C++のコー(678)を、C++コンパイラ
Cコンパイラってポインタ周りは最適化をかけないから、多分、
速度差はコンパイラ起因であって、コード起因では無いと思う。
698デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:45:53.71ID:PbE4ojLD0 >>696
> (b) 自分が書いているのは実はCだと気がついていないC++バカ
> https://cpplover.blogspot.jp/2013/05/linus-torvalsc.html
君の定義が正しければ、上記(b)の定義が出来なくなるだろ。
> (b) 自分が書いているのは実はCだと気がついていないC++バカ
> https://cpplover.blogspot.jp/2013/05/linus-torvalsc.html
君の定義が正しければ、上記(b)の定義が出来なくなるだろ。
699デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 14:46:34.72ID:QiJLTR+Nd >>691
C++が遅くなる例だけあげてC++が遅いって言ってもねえ
C++が速い例
double p = 1.;
int n;
for (n = 1 ; ; n++){
p *= n;
}
C++だと例外処理をつかって、いつオーバーフローするかわかるんだけど
例外を使わないとどういうコードになるかねえ?
---
Cで普通に汎用vectorを作るとすると
普通は汎用バイナリで作ることになるんで
関数ポインタを経由する事になっちゃうけど
C++のテンプレートだとだとそれぞれ専用なんで
関数コールが速いよね
アドレス計算も即値の乗算だから色々なテクニックが使える
C++が遅くなる例だけあげてC++が遅いって言ってもねえ
C++が速い例
double p = 1.;
int n;
for (n = 1 ; ; n++){
p *= n;
}
C++だと例外処理をつかって、いつオーバーフローするかわかるんだけど
例外を使わないとどういうコードになるかねえ?
---
Cで普通に汎用vectorを作るとすると
普通は汎用バイナリで作ることになるんで
関数ポインタを経由する事になっちゃうけど
C++のテンプレートだとだとそれぞれ専用なんで
関数コールが速いよね
アドレス計算も即値の乗算だから色々なテクニックが使える
700デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 14:47:13.55ID:D96wT16B0 わりい、ちょっと離席する
701デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:49:16.03ID:PbE4ojLD0702デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 14:51:30.31ID:QiJLTR+Nd C++だとコンテナを使ってまともなソートを簡単に書けるけど
Cだと面倒だからバカソート
ってのも普通にある
要素数が少なければ意図的にやったりもする
一般的なコードではCの方が速い事の方が多い
ってくらいの主張にしとけば良いものを
強い主張をしちゃうから
Cだと面倒だからバカソート
ってのも普通にある
要素数が少なければ意図的にやったりもする
一般的なコードではCの方が速い事の方が多い
ってくらいの主張にしとけば良いものを
強い主張をしちゃうから
703デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 14:53:13.25ID:QiJLTR+Nd704デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/12(土) 14:55:06.52ID:VFvkGYoW0705デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 14:56:22.02ID:PbE4ojLD0 >>699
おっとすまん、ポインタアクセスでのメモリオーバーフローと勘違いしてた。
doubleの無限大の例外って事?
俺はそっちには詳しくないが、浮動小数点例外をソフトウェアで検出するのなら同じだし、
ハードウェアでの検出なら割り込みがかかるだけで、速度的にはこれまた同じだが。
vectorについては完全に君の勘違いだぞ。
Cではそれぞれ専用の物を作るのが基本であり、それを一つにかけるようにしたのがテンプレートだ。
多分、理解の仕方が逆だ。
おっとすまん、ポインタアクセスでのメモリオーバーフローと勘違いしてた。
doubleの無限大の例外って事?
俺はそっちには詳しくないが、浮動小数点例外をソフトウェアで検出するのなら同じだし、
ハードウェアでの検出なら割り込みがかかるだけで、速度的にはこれまた同じだが。
vectorについては完全に君の勘違いだぞ。
Cではそれぞれ専用の物を作るのが基本であり、それを一つにかけるようにしたのがテンプレートだ。
多分、理解の仕方が逆だ。
706デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/12(土) 14:57:30.76ID:VFvkGYoW0707デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/12(土) 15:04:23.09ID:VFvkGYoW0 >>705
> ハードウェアでの検出なら割り込みがかかるだけで、速度的にはこれまた同じだが。
Cだと言語の範疇ではその割り込みを処理できない
なのでif文とかでオーバーフローするのを検出するとかが必要
って話だろ
> ハードウェアでの検出なら割り込みがかかるだけで、速度的にはこれまた同じだが。
Cだと言語の範疇ではその割り込みを処理できない
なのでif文とかでオーバーフローするのを検出するとかが必要
って話だろ
708デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 15:07:59.44ID:PbE4ojLD0709デフォルトの名無しさん (ワッチョイ 0550-c79c)
2018/05/12(土) 15:15:00.22ID:sI+Q43v80710デフォルトの名無しさん (ワッチョイ 0550-c79c)
2018/05/12(土) 15:16:02.69ID:sI+Q43v80 IDが変わってしまった
まあそんな事はどうでもいいか
まあそんな事はどうでもいいか
711デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 15:18:43.30ID:PbE4ojLD0 ちなみに速度比較についてはいろんな人が様々やってるけど、
俺的にまあ公平だと思えるのはこれだね。俺の体感ともだいたい一致する。
おれはC++は1.1-1.3位かと思っているけど。
> C 1.00
> C++ 1.56
> Java 1.89
> C# 3.14
> https://jaxenter.com/wp-content/uploads/2017/09/energy-efficient-languages-768x689.png
> https://jaxenter.com/energy-efficient-programming-languages-137264.html
C++の機能をバリバリに使ったら、そりゃJavaと大して変わらんだろ、ということになるし。
スマポってのは良くできたGCとコストはほぼ同じだし。(GCは全自動なだけ)
Javaは以前は3程度だったが、ゴリゴリチューニングしてきているらしい。
俺的にまあ公平だと思えるのはこれだね。俺の体感ともだいたい一致する。
おれはC++は1.1-1.3位かと思っているけど。
> C 1.00
> C++ 1.56
> Java 1.89
> C# 3.14
> https://jaxenter.com/wp-content/uploads/2017/09/energy-efficient-languages-768x689.png
> https://jaxenter.com/energy-efficient-programming-languages-137264.html
C++の機能をバリバリに使ったら、そりゃJavaと大して変わらんだろ、ということになるし。
スマポってのは良くできたGCとコストはほぼ同じだし。(GCは全自動なだけ)
Javaは以前は3程度だったが、ゴリゴリチューニングしてきているらしい。
712デフォルトの名無しさん (ワッチョイ 0550-c79c)
2018/05/12(土) 15:19:13.36ID:sI+Q43v80713デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 15:19:20.53ID:PbE4ojLD0 >>709
僕は知りません、まで読んだ。
僕は知りません、まで読んだ。
714デフォルトの名無しさん
2018/05/12(土) 15:20:34.21 >>708
なんで喧嘩腰なのかがよくわからないけど、
C言語では「n <= DBL_MAX」というif文が必要ってことだろ?
double p = 1.;
int n;
for (n = 1 ; n < DBL_MAX; n++){
p *= n;
}
なんで喧嘩腰なのかがよくわからないけど、
C言語では「n <= DBL_MAX」というif文が必要ってことだろ?
double p = 1.;
int n;
for (n = 1 ; n < DBL_MAX; n++){
p *= n;
}
715デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 15:23:37.01ID:PbE4ojLD0716デフォルトの名無しさん
2018/05/12(土) 15:33:27.39 >>715
なんでもない、忘れて><
なんでもない、忘れて><
717デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 15:48:51.69ID:PbE4ojLD0 >>716
通じたようで何より。
だからオーバーフローの検出はソフトウェアでは辛くて、通常はハードウェアのはずだ。
そしてその場合は割り込みとなり、Cの場合は割り込みハンドラにコードを書くことになる。
C++の場合は『そこから例外処理ルーチンまで引っ張ってきてくれるコード』をコンパイラが用意し、
ユーザーのcatchコードを実行する。つまり、上記『』内コードでラップされてる分だけ遅い。
(実際にはラップだけではなくスタックウォークも行うから相当遅いはずだが)
なんだが、実際俺はゼロ割例外しか見てないからオーバーフローについてはよくは知らん。
ハードウェア的には上記の動作になる。
一般的にはオーバーフロー例外は出ない環境(無限大に貼り付けるだけ)で使うのではないかと。
Cではアホみたいにゼロ割チェックやってるよ。
これはC++でも同じだと思うが、C++erはやらないのが作法なのか?
とはいえ、ゼロ割はCMP+Brachであり、通常は分岐しないから、x86ではほぼゼロコストだ。
割り込みは関数呼び出し自体が遅くなるから、結局これもCの方が速いはずだが。
通じたようで何より。
だからオーバーフローの検出はソフトウェアでは辛くて、通常はハードウェアのはずだ。
そしてその場合は割り込みとなり、Cの場合は割り込みハンドラにコードを書くことになる。
C++の場合は『そこから例外処理ルーチンまで引っ張ってきてくれるコード』をコンパイラが用意し、
ユーザーのcatchコードを実行する。つまり、上記『』内コードでラップされてる分だけ遅い。
(実際にはラップだけではなくスタックウォークも行うから相当遅いはずだが)
なんだが、実際俺はゼロ割例外しか見てないからオーバーフローについてはよくは知らん。
ハードウェア的には上記の動作になる。
一般的にはオーバーフロー例外は出ない環境(無限大に貼り付けるだけ)で使うのではないかと。
Cではアホみたいにゼロ割チェックやってるよ。
これはC++でも同じだと思うが、C++erはやらないのが作法なのか?
とはいえ、ゼロ割はCMP+Brachであり、通常は分岐しないから、x86ではほぼゼロコストだ。
割り込みは関数呼び出し自体が遅くなるから、結局これもCの方が速いはずだが。
718デフォルトの名無しさん (ドコグロ MM01-pJ79)
2018/05/12(土) 16:03:54.80ID:68o7JYmcM719デフォルトの名無しさん (ワッチョイ e3cb-/P3g)
2018/05/12(土) 16:11:14.40ID:eFTG6CfX0 overflowてexception吐くんだっけか
720デフォルトの名無しさん (ドコグロ MM01-pJ79)
2018/05/12(土) 16:35:26.68ID:68o7JYmcM722デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 17:14:24.19ID:D96wT16B0 unsigned long long array[100000000];
↑
ここに同じファイルから乱数を読み込んで比較してみた
clのオプションは /Ox /arch:AVX
gccのオプションは -O3 -mtune=sandybridge
qsort
cl 27.171[sec]
gcc 26.139[sec]
std::sort
↑
ここに同じファイルから乱数を読み込んで比較してみた
clのオプションは /Ox /arch:AVX
gccのオプションは -O3 -mtune=sandybridge
qsort
cl 27.171[sec]
gcc 26.139[sec]
std::sort
723デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 17:16:00.99ID:D96wT16B0 途中で書き込まれてしまった
unsigned long long array[100000000];
↑
ここに同じファイルから乱数を読み込んで比較してみた
clのオプションは /Ox /arch:AVX
gccのオプションは -O3 -mtune=sandybridge
qsort
cl 27.171[sec]
gcc 26.139[sec]
std::sort
cl 13.456[sec]
gcc 9.103[sec]
おまけ
std::sortにstd::execution::parを指定してみた
cl 3.288[sec]
gcc 未実装
unsigned long long array[100000000];
↑
ここに同じファイルから乱数を読み込んで比較してみた
clのオプションは /Ox /arch:AVX
gccのオプションは -O3 -mtune=sandybridge
qsort
cl 27.171[sec]
gcc 26.139[sec]
std::sort
cl 13.456[sec]
gcc 9.103[sec]
おまけ
std::sortにstd::execution::parを指定してみた
cl 3.288[sec]
gcc 未実装
724デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 17:16:40.49ID:D96wT16B0 >>690が正解だったね
725デフォルトの名無しさん (ワッチョイ e358-k37M)
2018/05/12(土) 17:49:15.49ID:D96wT16B0726デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/12(土) 18:15:21.20ID:VFvkGYoW0728デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 18:40:33.53ID:PbE4ojLD0729デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/12(土) 18:42:16.14ID:VFvkGYoW0 >>729
inf も NaN も浮動小数点表現の中にあるので「オーバーフロー」と呼びにくい、と思っています、まあ人それぞれ
inf も NaN も浮動小数点表現の中にあるので「オーバーフロー」と呼びにくい、と思っています、まあ人それぞれ
731デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/12(土) 19:04:56.38ID:VFvkGYoW0732デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/12(土) 19:24:22.69ID:yANyZ1HYd733デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/12(土) 19:29:38.17ID:VFvkGYoW0 >>728
お前の変な世間はどうでもいい
お前の変な世間はどうでもいい
734デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 19:48:04.17ID:PbE4ojLD0 >>732
> C++は元々上位互換を目標に作られた物だ
そうだ。そしてだからこそ、スタイルで区別されるんだよ。
元々C++はCの完全上位互換だった。
だから君らの定義なら、C++が登場したときから全てのCは消滅し、C++になっているはずだろ。
実際はそうじゃない。
「○○のコードはCで書かれています」
「○○のコードはC++で書かれています」というのは、
世間では俺の言った定義(>>676)で使われてる。
その後、CとC++が仕様的に分離してしまったから、
今現在はCコンパイラで通るコードがC++コンパイラで通らないケースが存在する。
だから今は明確に「どちらのコンパイラを使うか」を想定しておく必要があるが、
それもコーナーケースで、
大半の「Cのコード」はC++コンパイラでもそのまま通る。
お前らがC++信者でC++の範囲を広く取りたいのは分かるが、世間はそうじゃない。
C++がCの仕様を全て取り込んだら、
お前らにとってはCは消滅、全てはC++になり、お前らは幸せになれるだろうさ。
ただ、その後も世間はCとC++を引き続き区別するだろうよ。
> C++は元々上位互換を目標に作られた物だ
そうだ。そしてだからこそ、スタイルで区別されるんだよ。
元々C++はCの完全上位互換だった。
だから君らの定義なら、C++が登場したときから全てのCは消滅し、C++になっているはずだろ。
実際はそうじゃない。
「○○のコードはCで書かれています」
「○○のコードはC++で書かれています」というのは、
世間では俺の言った定義(>>676)で使われてる。
その後、CとC++が仕様的に分離してしまったから、
今現在はCコンパイラで通るコードがC++コンパイラで通らないケースが存在する。
だから今は明確に「どちらのコンパイラを使うか」を想定しておく必要があるが、
それもコーナーケースで、
大半の「Cのコード」はC++コンパイラでもそのまま通る。
お前らがC++信者でC++の範囲を広く取りたいのは分かるが、世間はそうじゃない。
C++がCの仕様を全て取り込んだら、
お前らにとってはCは消滅、全てはC++になり、お前らは幸せになれるだろうさ。
ただ、その後も世間はCとC++を引き続き区別するだろうよ。
735デフォルトの名無しさん (ワッチョイ 0550-c79c)
2018/05/12(土) 20:09:12.78ID:sI+Q43v80 お前用語の定義の説明とかどうでもいい
スタイルの意味ならスタイルと書け
スタイルの意味ならスタイルと書け
736デフォルトの名無しさん (スップ Sd03-lXkA)
2018/05/12(土) 20:09:24.63ID:D4Rf+0xLd >>734
それは嘘だなぁ
extern "C"が無いとCライクに見えるオブジェクトを吐かない事が常となっているC++(コンパイラ)について、いくらpure Cライクなコードを書いてもpure Cでないextern "C"を書かないとCライクに見えるオブジェクトは吐けないってそれはもうC++でしょう
他の内容にも誤りがあって君の世間ではCライクなコードであればCで書いたと宣言していいらしいけど、少しでも世間のOSSのコードを見て回れば良いよ
Cで書かれているのはCだから
それは嘘だなぁ
extern "C"が無いとCライクに見えるオブジェクトを吐かない事が常となっているC++(コンパイラ)について、いくらpure Cライクなコードを書いてもpure Cでないextern "C"を書かないとCライクに見えるオブジェクトは吐けないってそれはもうC++でしょう
他の内容にも誤りがあって君の世間ではCライクなコードであればCで書いたと宣言していいらしいけど、少しでも世間のOSSのコードを見て回れば良いよ
Cで書かれているのはCだから
737デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 20:30:38.36ID:PbE4ojLD0 お前らが誤解したままでいるのはお前らの自由だが、
お前らの定義だと、CとObjective-Cを区別できないだろ。
あれはCの完全上位互換で、Cコードそのまま食えるらしいからね。
お前らも少し考えれば自分で矛盾に気づけるはずだが。
お前らの定義だと、CとObjective-Cを区別できないだろ。
あれはCの完全上位互換で、Cコードそのまま食えるらしいからね。
お前らも少し考えれば自分で矛盾に気づけるはずだが。
738デフォルトの名無しさん (ブーイモ MM49-ZhOv)
2018/05/12(土) 20:58:42.38ID:cTj25fOrM739デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 21:57:33.16ID:PbE4ojLD0 ならもうちょっと分かりやすい説明をしてやる。
>>677-678について、お前らの定義では『コード』について議論できないだろ。
俺の定義では、677は「Cのコード」で、678は「C++のコード」だ。コンパイラに依らない。
お前らの定義では、678は明確に「C++のコード」だが、677については、
「Cコンパイラを通した場合、677はCのコード」
「C++コンパイラを通した場合、677はC++のコード」
になってしまうだろ。
それだと、CとC++の『コード』の速度比較自体が定義できないだろ。
677をCコンパイラを通した場合とC++コンパイラを通した場合の速度差は、
「コードの差」ではなく、「コンパイラの差」なんだよ。
当たり前だろ。
というか、C++erもここまでレベルが落ちたのか。世も末だな。
>>677-678について、お前らの定義では『コード』について議論できないだろ。
俺の定義では、677は「Cのコード」で、678は「C++のコード」だ。コンパイラに依らない。
お前らの定義では、678は明確に「C++のコード」だが、677については、
「Cコンパイラを通した場合、677はCのコード」
「C++コンパイラを通した場合、677はC++のコード」
になってしまうだろ。
それだと、CとC++の『コード』の速度比較自体が定義できないだろ。
677をCコンパイラを通した場合とC++コンパイラを通した場合の速度差は、
「コードの差」ではなく、「コンパイラの差」なんだよ。
当たり前だろ。
というか、C++erもここまでレベルが落ちたのか。世も末だな。
740デフォルトの名無しさん (ワイモマー MM43-uCqk)
2018/05/12(土) 22:16:57.78ID:DXsEIRbfM std::filesystemで片方のスレッドでファイルを出力し
もう片方のスレッドでファイルが存在していたら読み込むというプログラムを書いた場合
出力中に存在すると判定されて読み込んでしまいそうですが、
そんなことないでしょうか?
もし読み込んでしまう場合、自力でフラグ管理かMutexを使うなどして
判定する以外の方法はあるでしょうか?
もう片方のスレッドでファイルが存在していたら読み込むというプログラムを書いた場合
出力中に存在すると判定されて読み込んでしまいそうですが、
そんなことないでしょうか?
もし読み込んでしまう場合、自力でフラグ管理かMutexを使うなどして
判定する以外の方法はあるでしょうか?
741デフォルトの名無しさん (ワッチョイ 0550-c79c)
2018/05/12(土) 23:29:24.63ID:sI+Q43v80 >>739
お前が考えた定義とかどうでも良いって言ってるの
お前が考えた定義とかどうでも良いって言ってるの
742デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/12(土) 23:53:40.44ID:PbE4ojLD0 というか何でお前らそんなに必死なんだ?
俺の言ってる定義が世間一般の定義だよ。
そうじゃなきゃ『コード』の善し悪しの議論が出来ないだろ。自明だと思うが。
繰り返すが、C++がCよりも遅いのは事実で、それもググレばいくらでも出てくるだろ。
ただこれはC++そのものよりもオブジェクト指向の弊害だが。
http://chrismdp.com/2015/04/how-i-doubled-the-speed-of-my-game-by-giving-up-on-c-plus-plus/
https://www.quora.com/Why-is-object-oriented-programming-OOP-slower-than-procedural
逆に言えば、C++の機能をふんだんに使ったとして、Javaに対する速度優位がどれだけあると思ってるの?
C++で世界が再統一されることは、今のC++の仕様/方向性ではあり得ない。C++ではCを殺しきれない。
だからRustが生まれた。
>>711の表を信じるなら、RustはCの代替としてはC++以上に上手く行ってる。
俺の言ってる定義が世間一般の定義だよ。
そうじゃなきゃ『コード』の善し悪しの議論が出来ないだろ。自明だと思うが。
繰り返すが、C++がCよりも遅いのは事実で、それもググレばいくらでも出てくるだろ。
ただこれはC++そのものよりもオブジェクト指向の弊害だが。
http://chrismdp.com/2015/04/how-i-doubled-the-speed-of-my-game-by-giving-up-on-c-plus-plus/
https://www.quora.com/Why-is-object-oriented-programming-OOP-slower-than-procedural
逆に言えば、C++の機能をふんだんに使ったとして、Javaに対する速度優位がどれだけあると思ってるの?
C++で世界が再統一されることは、今のC++の仕様/方向性ではあり得ない。C++ではCを殺しきれない。
だからRustが生まれた。
>>711の表を信じるなら、RustはCの代替としてはC++以上に上手く行ってる。
743デフォルトの名無しさん (ワッチョイ 0550-c79c)
2018/05/12(土) 23:56:27.27ID:sI+Q43v80 お前の定義じゃないと議論が出来ないのは
おまえがアホだから
おまえがアホだから
744デフォルトの名無しさん (ワッチョイ 0550-c79c)
2018/05/13(日) 00:02:56.89ID:VV8A9gRv0 定義の布教なんかより技術的な会話をしろよ
745デフォルトの名無しさん (ブーイモ MM19-ZhOv)
2018/05/13(日) 00:03:10.09ID:C4Q8t1mmM 必死なのはどちらなんだろう…
746デフォルトの名無しさん (アウアウウー Sa89-bFqk)
2018/05/13(日) 00:20:47.86ID:OjngaL1la C++スレらしい流れだと思うよ
面白くていいじゃないですかぁ…
ここで linus メールをコピペ(省略)
ここで linus メールをコピペ(省略)
749デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/13(日) 08:12:09.87ID:pAG2qz7m0750デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/13(日) 08:18:26.86ID:pAG2qz7m0 >>740
> 出力中に存在すると判定されて読み込んでしまいそうですが、
> そんなことないでしょうか?
そりゃ普通にそんなことあるだろ
> もし読み込んでしまう場合、自力でフラグ管理かMutexを使うなどして
> 判定する以外の方法はあるでしょうか?
そもそも何をしたいのよ?
出力完了してから読みたいだけなら出力完了してから読み込む側のスレッド起動するとかする方法もあるだろうし
> 出力中に存在すると判定されて読み込んでしまいそうですが、
> そんなことないでしょうか?
そりゃ普通にそんなことあるだろ
> もし読み込んでしまう場合、自力でフラグ管理かMutexを使うなどして
> 判定する以外の方法はあるでしょうか?
そもそも何をしたいのよ?
出力完了してから読みたいだけなら出力完了してから読み込む側のスレッド起動するとかする方法もあるだろうし
751デフォルトの名無しさん (ワッチョイ 059f-YHaA)
2018/05/13(日) 09:30:39.74ID:tSRcUD9w0 >>749
お前がIDコロコロしてまでも定義にこだわる理由が分からん。
お前の定義なら、仮に全面インラインアセンブラで記述してあっても、
Cコンパイラを通したらそれは「Cのコード」であり、
C++コンパイラを通したらそれは「C++のコード」になり、
Objective-Cコンパイラを通したらそれは「Objective-Cのコード」と言うんだろ。
そんな定義の奴はいない。それは「アセンブラ」と言うんだよ。
ただこの定義はもういい。
君は間違いを認めないようだし、仮に俺が間違っていたとしても、
お互いの認識のズレは確認できたのだからそれでいいだろ。
そして>>638は最初からそう言っているだけだ。
お前は「コンパイル単位」でしか言語を規定できないからおかしな事になっている。
世間は「コード単位」でも言語を規定する。だから、お前が
> f2()がボトルネックだからC++からCの範囲で動くようなコードに書き換え
と言うのを、世間では「f2()をCコードに書き換え」と言うんだよ。
仮にお前の定義が正しくても、これを日常的にやるようなら、じきに略されて
俺(世間)の言い方に落ち着くのも分かるだろ。
だから>>638は最初から、お前の言葉で言う、
> f2()がボトルネックだからC++からCの範囲で動くようなコードに書き換える
「f2()がボトルネックだからC++からアセンブラの範囲で動くようなコードに書き換える」事を
> もっと速くしたい所をCやasmで書く
と表現している。元々「コンパイル」単位ではなく、「コード」単位なんだよ。
その「コード」について議論するのに、「コンパイル」単位を持ち出すのはおかしいだろ。
「速くしたい『所』」ってのは一部限定って事を明示してるだろ。
お前はどうしても認めないようだが。
お前は根本的に考え方がおかしい。それではまともな議論が成立しないだろ。
議論している粒度に合わせた言葉を使え。
お前がIDコロコロしてまでも定義にこだわる理由が分からん。
お前の定義なら、仮に全面インラインアセンブラで記述してあっても、
Cコンパイラを通したらそれは「Cのコード」であり、
C++コンパイラを通したらそれは「C++のコード」になり、
Objective-Cコンパイラを通したらそれは「Objective-Cのコード」と言うんだろ。
そんな定義の奴はいない。それは「アセンブラ」と言うんだよ。
ただこの定義はもういい。
君は間違いを認めないようだし、仮に俺が間違っていたとしても、
お互いの認識のズレは確認できたのだからそれでいいだろ。
そして>>638は最初からそう言っているだけだ。
お前は「コンパイル単位」でしか言語を規定できないからおかしな事になっている。
世間は「コード単位」でも言語を規定する。だから、お前が
> f2()がボトルネックだからC++からCの範囲で動くようなコードに書き換え
と言うのを、世間では「f2()をCコードに書き換え」と言うんだよ。
仮にお前の定義が正しくても、これを日常的にやるようなら、じきに略されて
俺(世間)の言い方に落ち着くのも分かるだろ。
だから>>638は最初から、お前の言葉で言う、
> f2()がボトルネックだからC++からCの範囲で動くようなコードに書き換える
「f2()がボトルネックだからC++からアセンブラの範囲で動くようなコードに書き換える」事を
> もっと速くしたい所をCやasmで書く
と表現している。元々「コンパイル」単位ではなく、「コード」単位なんだよ。
その「コード」について議論するのに、「コンパイル」単位を持ち出すのはおかしいだろ。
「速くしたい『所』」ってのは一部限定って事を明示してるだろ。
お前はどうしても認めないようだが。
お前は根本的に考え方がおかしい。それではまともな議論が成立しないだろ。
議論している粒度に合わせた言葉を使え。
752デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/13(日) 09:51:06.22ID:pAG2qz7m0 >>751
> ただこの定義はもういい。
> 君は間違いを認めないようだし、仮に俺が間違っていたとしても、
> お互いの認識のズレは確認できたのだからそれでいいだろ。
いきなり弱気になってて笑うわ w
> ただこの定義はもういい。
> 君は間違いを認めないようだし、仮に俺が間違っていたとしても、
> お互いの認識のズレは確認できたのだからそれでいいだろ。
いきなり弱気になってて笑うわ w
753740 (マクド FF91-uCqk)
2018/05/13(日) 10:01:51.37ID:ntCzq/+YF 自己解決しました。
仮の名前でファイルを書き出してからリネームすれば書き込み中か書き込み済みか
判定する処理をなくせるみたいでした。
仮の名前でファイルを書き出してからリネームすれば書き込み中か書き込み済みか
判定する処理をなくせるみたいでした。
754デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/13(日) 11:07:48.71ID:Q3HZm9Uhd >>751
コンパイラが変わらない単なる最適化で
C++からCにする
なんて言わないから普通
少なくともエンジニアの会話では無い
簡単にいう場合は「最適化」「チューニング」だし
詳しくいう場合は中身を具体的に言う
頭の悪い文系を騙すのには使えるのかもしれないけど
コンパイラが変わらない単なる最適化で
C++からCにする
なんて言わないから普通
少なくともエンジニアの会話では無い
簡単にいう場合は「最適化」「チューニング」だし
詳しくいう場合は中身を具体的に言う
頭の悪い文系を騙すのには使えるのかもしれないけど
755デフォルトの名無しさん (スップ Sd03-c79c)
2018/05/13(日) 11:09:34.85ID:Q3HZm9Uhd C言語風なコード
と
C言語のコード
全く意味が違う
と
C言語のコード
全く意味が違う
756638 (ワッチョイ 1be7-1eaZ)
2018/05/13(日) 11:24:15.00ID:YEhpfoS10 「C++で書く」→カジュアルにSTLとか使って読みやすく書く
「Cやasmで書く」→キャッシュやSIMDとか低級に考慮してガリガリ最適化する
くらいの軽い気持ちで書いただけなのに紛糾しすぎててワイ将困惑
「Cやasmで書く」→キャッシュやSIMDとか低級に考慮してガリガリ最適化する
くらいの軽い気持ちで書いただけなのに紛糾しすぎててワイ将困惑
757デフォルトの名無しさん (スプッッ Sd03-Je+M)
2018/05/13(日) 12:17:41.91ID:oMdj20B0d 話が長い上にどうでもよすぎる
758デフォルトの名無しさん (ワッチョイ 1b7f-y4OE)
2018/05/13(日) 12:26:54.36ID:yds9udeH0 またいつものキチガイか
759デフォルトの名無しさん (ワッチョイ 4bf0-k37M)
2018/05/13(日) 12:43:30.13ID:AL0mRZz+0 >>756
おまえさんの頭がC++03のまま更新が止まってしまっていることはわかった
おまえさんの頭がC++03のまま更新が止まってしまっていることはわかった
>>759
そう判断した理由は?
そう判断した理由は?
761デフォルトの名無しさん (ワッチョイ 4bf0-k37M)
2018/05/13(日) 12:51:49.36ID:AL0mRZz+0 C++11以後の「低級」を知らんだろ
762デフォルトの名無しさん (ワッチョイ 2368-bFqk)
2018/05/13(日) 13:01:15.34ID:DrlMjc+O0 C++xx
この末尾のへんなナンバリングが施されるようになったのっていつ頃から?
この末尾のへんなナンバリングが施されるようになったのっていつ頃から?
763デフォルトの名無しさん (ワッチョイ 23b3-pJ79)
2018/05/13(日) 14:22:28.62ID:pAG2qz7m0 >>762
元々はC++09を狙ってたらしいから2008年頃じゃね?
元々はC++09を狙ってたらしいから2008年頃じゃね?
>>761
具体的に
具体的に
765デフォルトの名無しさん (ワッチョイ 4bf0-k37M)
2018/05/13(日) 15:27:50.96ID:AL0mRZz+0 >>764
人に聞くのは知らないからだな
人に聞くのは知らないからだな
■ このスレッドは過去ログ倉庫に格納されています
