[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 06/17 22:51 / Filesize : 282 KB / Number-of Response : 1031
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part135



1 名前:デフォルトの名無しさん mailto:sage [2018/03/31(土) 20:20:06.25 ID:o3PNwIlC0.net]
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part134
mevius.5ch.net/test/read.cgi/tech/1516406742/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
mevius.5ch.net/test/read.cgi/tech/1509780815/

■長いソースを貼るときはここへ。■
 codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

669 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 12:31:23.28 ID:My8LWy2ka.net]
-1

670 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 12:40:45.91 ID:QiJLTR+Nd.net]
汎用バイナリ < 汎用コード専用バイナリ < 専用コード

速度的にはこう

速度が非常に重要であれば
CだろうがC++だろうが専用コードを書くのが一番

671 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 12:42:10.49 ID:PbE4ojLD0.net]
>>643
間接参照を抜ける場合とかだろ。
逆にCよりもC++の方が速くなるコードの方があり得ないと思うが。
実際にC++はCより遅いってのは事実だし。

>>645
お前が値配列と参照配列の区別が付いてないだけだろ。

672 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 12:44:50.30 ID:D96wT16B0.net]
>>653
アンカーミスったか?
qsortとstd::sortはどちらも値であろうが参照(ポインタ)であろうが使えるぞ

673 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 12:49:50.14 ID:QiJLTR+Nd.net]
>>653
>>641

674 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 12:50:14.86 ID:VFvkGYoW0.net]
>>653
> 間接参照を抜ける場合とかだろ。
それC++のまま書き換えればいいだけ

> 逆にCよりもC++の方が速くなるコードの方があり得ないと思うが。
そんな主張はしてない

> 実際にC++はCより遅いってのは事実だし。
だからどんなケースなんだよ
STLとか使いまくって遅いとかなら使わないように書き換えればいいだけだろ

675 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 12:58:57.32 ID:QiJLTR+Nd.net]
厳密に言うと

C11の可変長配列はC++には無い
C++では例外処理を実現するために関数コールに微妙なオーバーヘッドがある場合がある

って感じでCの方が有利な事がある

どちらもガシガシに最適化した場合の話

676 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:05:00.64 ID:QiJLTR+Nd.net]
x86-32
例外処理を有効にすると
関数コールに微妙なオーバーヘッドが加わる

x86-64
例外処理の為のオーバーヘッドは無い
その代わり例外発生時の処理は非常に遅い

Cの可変長配列のような、スタックに可変長サイズを確保する手段はC++には無い
当然ダイナミックなメモリアロケートよりはスタックに確保した方が速い
ただし実際にはあまり使われていないと思われる

677 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:09:56.56 ID:PbE4ojLD0.net]
>>654
ミスってないぞ。

>>656
Cの場合は抽象化してくれないんだから、関数を直接呼ぶしかないんだよ。
だから動的解決をしている場合はC++の方が遅く、静的解決の場合は同速になる。
CのほうがC++より遅いケース出してみろ。ないから。

C++は機能的にはCをラップしてるんだよ。
例外とか、クラスの動的解決とか、スマポ(キリッとか。その分管理が楽だが、速度は遅くなる。
Cの場合はC++のラッパ抜きで直接呼ぶことになるから、その分速い。それだけ。



678 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:11:52.26 ID:PbE4ojLD0.net]
>>658
> x86-64
> 例外処理の為のオーバーヘッドは無い
> その代わり例外発生時の処理は非常に遅い
これマジ?
煽りじゃなくて仕組みを知りたいから、キーワードかURLくれ。
こちらでググって確認する。

679 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:28:22.55 ID:QiJLTR+Nd.net]
自分でディスアセンブルしたり
バイナリ比較したり実測してわかったことで
仕組みがまとめて書いてあるような所は知らない

680 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:31:21.41 ID:PbE4ojLD0.net]
>>656
> だからどんなケースなんだよ
探してやったぞ。
> 実験によれば 6-13% の実行時間が単なる関数のディスパッチに用いられ、オーバーヘッドは場合によって 50% に達する[1]。
> https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB

C++は動的な型の変更はなしなので、コンパイル時に対象関数は確定するだろ。それが仮想関数であってもね。
だからvtblを用いた実装自体がコンパイラの単純さを採って、実行速度を捨ててる。
JavaScriptみたいに、実行時に型を変更してしまえる言語ではないのだから、
型毎にテーブルを持つこと自体が冗長で、
テンプレートみたいに、仮想関数が上書きされた毎時点で平面的に展開し、直接それを呼ぶ実装も出来るんだよ。
勿論オブジェクトコードは膨らむが。

Cの場合は、どちらでやるにしても「自前で」実装するしかない。だから当然、選べる。
C++の場合は、選べないでしょ。一般的にvtblの実装になる。(コンパイラの都合だが)

681 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:35:45.30 ID:QiJLTR+Nd.net]
C/C++で基本同じ結果となるコードが書ける
同じ結果となるコードを書けば結果は同じ

ってだけで
当然違う結果となるコードを比べれば違う結果になる

当たり前

682 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:36:37.92 ID:PbE4ojLD0.net]
>>66

683 名前:1
ちなみに計測したときのOSは何?
なおその兆候が正しいなら、x64の場合はハードウェアで対応していることになる。
[]
[ここ壊れてます]

684 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:38:15.87 ID:QiJLTR+Nd.net]
クラス関数はthisを第一パラメータとして渡してるだけで、これは構造体でも同じことが出来る

virtual関数は関数ポインタテーブルへのポインタを持ってるだけ
同じことは当然Cの構造体でも出来る

テンプレートは型ごとにコードを書くのと同じ

685 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:39:04.83 ID:PbE4ojLD0.net]
>>663
だから、いわゆるC++の機能を使ったら、管理が楽になる分だけ遅くなる、というだけ。
C++の機能を全く使わないコードはCと言うんだよ。
だから、C++はCより常に遅い。それだけ。

686 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:41:20.71 ID:QiJLTR+Nd.net]
>>664
そういえば、
例外発生時のスタックにあるリターンアドレスを検索するとかどこかでみたような

どこかに仕組みが書いてあった気がしてきた

687 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:42:51.66 ID:QiJLTR+Nd.net]
>>666
君独自の定義とか持ち出さないでくれ



688 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:44:31.67 ID:PbE4ojLD0.net]
>>665
> virtual関数は関数ポインタテーブルへのポインタを持ってるだけ
> 同じことは当然Cの構造体でも出来る
Cでやる場合は、関数ポインタを引数で渡すことも出来るんだよ。
(勿論C++でも出来るが、クラスを使う意味が無くなるから普通はやらない)

この場合、間接参照が抜ける分だけ速くなる。
(実際はメモリアクセス1個よりはキャッシュを壊すことの影響の方が大きいとは思うが)

689 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:45:03.28 ID:QiJLTR+Nd.net]
C++独自の機能を使うとCより常に遅い?
それは嘘だな

690 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:47:32.05 ID:QiJLTR+Nd.net]
>>669
C++にだけ独自の縛りを設けてCのが速い?
強引に主張を通したいのはわかるが
そろそろ痛いぞおまえ

691 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:49:15.64 ID:PbE4ojLD0.net]
>>667
それはスタックウォークという、従来の例外実装方法だ。
君の場合なら、x86がそれになってる。

>>670
ならC++の機能を使って、Cよりも速くなるケースを挙げてみろ。
ないから。

692 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:51:18.48 ID:QiJLTR+Nd.net]
もとは>>638

C++で最適化に行き詰まった時に
わざわざコンパイラをCに変えて最適化する事なんてないから

Cっぽい記述とかアセンブラっぽい記述とかなら
そりゃいくらでも

693 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 13:53:21.45 ID:QiJLTR+Nd.net]
>>672 前半
自分で調べろ

>>672 後半
ええと、...
「C++独自の機能を使うとCより常に遅い」
の否定はわかるかな?

694 名前:デフォルトの名無しさん [2018/05/12(土) 13:53:48.97 .net]
>>658って単に32bitプログラムを64bit CPUで走らせてオーバーヘッドがーって言ってるんじゃね?

695 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:01:29.48 ID:PbE4ojLD0.net]
>>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++ということだったのか。
なら話は噛み合わないさ。

696 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:05:34.23 ID:D96wT16B0.net]
#

697 名前: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]
}
[]
[ここ壊れてます]



698 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:06:21.60 ID:D96wT16B0.net]
#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] ・・・あれ? 何だこりゃ
}

699 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:07:22.82 ID:VFvkGYoW0.net]
>>657-658
そういやスタックにとる可変長配列はC++にないんだな
まあメジャーな環境でalloca( )使えないものはないと思うが
例外は使わないようにすればいいだけかと

700 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:14:29.71 ID:PbE4ojLD0.net]
>>678
一応、基本的確認をするが…データは同じなんだよな?

俺の予測では同速。多分そちらの期待も同じだと思うが。

701 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:14:45.58 ID:VFvkGYoW0.net]
>>676
> ・その他、関数ポインタ等、Cコンパイラでも通る機能のみで書かれたコードを、Cのコードという。
可変長配列とか使ってないならC++のコードでもある
つまりC++の範疇で書き直してるだけ
って言うのが大方の人の解釈だと思うが

702 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:18:31.88 ID:D96wT16B0.net]
>>680
うん
だってグローバルだからオール0

703 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:20:49.93 ID:QiJLTR+Nd.net]
>>676
それは単なる君の定義
100歩譲っても5chで一般的なだけ

普通C言語, C++と言えば、
その規格や規格に準拠したコードを表す

704 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:22:26.74 ID:PbE4ojLD0.net]
>>681
それは君の勘違いだね。
その定義ならC/C++を区別する理由がないし、多分LinuxもC++になってしまうだろ。

705 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:26:21.88 ID:D96wT16B0.net]
>>676
たとえばヘッダファイルなんか、同一のファイルを
Cコンパイラに入力したり
C++コンパイラに入力したり
ってこともあるよな

内容には無関係で単に
Cコンパイラに入力したらCのコードで
C++コンパイラに入力したらC++のコードだろ

最適化の内容だってrestrictのように
CとC++で違ってくる可能性はあるしな

706 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:27:02.49 ID:PbE4ojLD0.net]
>>682
最適化の掛け忘れでは?

Cの方はほぼ最適コードだが、(メモリアクセス減らして一時変数に取れとかその程度)
C++の方は最適化無しだとトンデモコードが出てくるが、
最適化でそれを消すからおkというノリだったと思ったぞ。

最適化無し同士の比較は意味がない。最大最適化同士の比較やってみそ。

707 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:27:22.97 ID:QiJLTR+Nd.net]
使うモジュールの差を言語で言うから話が紛れる

で、
君の定義であるごく一般的な記述を行った場合の話であれば

C++の方が速いこともあるしCの方が速いこともある

C++はテンプレートによって専用のコードをたくさん作る
当然汎用バイナリよりも専用バイナリの方が最適化がかかりやすいし、
変数よりも即値の方が速いことも多い

C++例外処理も有効で、
これによって処理が速くなる場合がある



708 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:27:42.28 ID:D96wT16B0.net]
>>686
gcc unko.c -O3でやってる

709 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:29:31.07 ID:PbE4ojLD0.net]
>>685
> 内容には無関係で単に
Linus全否定かよ。

710 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:30:30.03 ID:QiJLTR+Nd.net]
>>682
オールゼロでクイックソート?
それは...

711 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:35:18.35 ID:PbE4ojLD0.net]
>>687
> 君の定義であるごく一般的な記述を行った場合の話であれば
> C++の方が速いこともあるしCの方が速いこともある
ねーよ。
実例挙げてみ?
それって単なるコンパイラの適性であって、コード自体の速度ではないだろ。

C++とCの本質的な速度差ってのは絶対にひっくり返らないものであって、
例えば、スマポを使っている限り参照ポインタを管理する分だけ遅くなる、というもの。
コンパイラがどう進化しても、「0」「ADDまたはDEC命令」の差はひっくり返らないんだよ。

> C++例外処理も有効で、
> これによって処理が速くなる場合がある
ねーよ。C

712 名前:は最初から全部noexceptだ。 []
[ここ壊れてます]

713 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:35:49.71 ID:QiJLTR+Nd.net]
ソートって

メモリサイズ
比較コスト
コピーコスト
キャッシュサイズ
...

こんなんで結果(時間)が大きく異なるんだよね
クイックソートだと
データの並び順でもたまたま選んだピボット値でも変わる

1個の場合を比較してもあまり意味が無いぞ

714 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:36:05.87 ID:D96wT16B0.net]
clでやってみたら期待どおりの結果になった
>>677 1.789[sec]
>>678 0.623[sec]

最適化は/Ox

715 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:36:46.83 ID:D96wT16B0.net]
>>690
ああ、それは確かに
テストデータをまじめに作るか。。。

716 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:37:45.07 ID:PbE4ojLD0.net]
>>688
となるとアセンブラを確認するしかないね。
(いいサイトはあったはずだが、普段使わんから忘れた)

717 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:37:57.15 ID:D96wT16B0.net]
>>689
ん? なんで?



718 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:44:25.97 ID:PbE4ojLD0.net]
>>693
それさ、以下の3条件でやってみ。

1) Cのコード(677)を、Cコンパイラ
2) Cのコード(677)を、C++コンパイラ ←追加
3) C++のコー(678)を、C++コンパイラ

Cコンパイラってポインタ周りは最適化をかけないから、多分、
速度差はコンパイラ起因であって、コード起因では無いと思う。

719 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:45:53.71 ID:PbE4ojLD0.net]
>>696
> (b) 自分が書いているのは実はCだと気がついていないC++バカ
> https://cpplover.blogspot.jp/2013/05/linus-torvalsc.html
君の定義が正しければ、上記(b)の定義が出来なくなるだろ。

720 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:46:34.72 ID:QiJLTR+Nd.net]
>>691
C++が遅くなる例だけあげてC++が遅いって言ってもねえ

C++が速い例

double p = 1.;
int n;
for (n = 1 ; ; n++){
p *= n;
}

C++だと例外処理をつかって、いつオーバーフローするかわかるんだけど
例外を使わないとどういうコードになるかねえ?

---
Cで普通に汎用vectorを作るとすると
普通は汎用バイナリで作ることになるんで
関数ポインタを経由する事になっちゃうけど
C++のテンプレートだとだとそれぞれ専用なんで
関数コールが速いよね
アドレス計算も即値の乗算だから色々なテクニックが使える

721 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:47:13.55 ID:D96wT16B0.net]
わりい、ちょっと離席する

722 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:49:16.03 ID:PbE4ojLD0.net]
>>699
> C++が速い例
Java出身か?死ね

723 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:51:30.31 ID:QiJLTR+Nd.net]
C++だとコンテナを使ってまともなソートを簡単に書けるけど
Cだと面倒だからバカソート
ってのも普通にある
要素数が少なければ意図的にやったりもする

一般的なコードではCの方が速い事の方が多い
ってくらいの主張にしとけば良いものを
強い主張をしちゃうから

724 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:53:13.25 ID:QiJLTR+Nd.net]
>>701
ん?
良くわからんが負け宣言てことでいいのかな?

725 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:55:06.52 ID:VFvkGYoW0.net]
>>684
何を言ってるのか意味不明すぎる
よほど感覚が独自なんだろうな w

726 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:56:22.02 ID:PbE4ojLD0.net]
>>699
おっとすまん、ポインタアクセスでのメモリオーバーフローと勘違いしてた。

doubleの無限大の例外って事?
俺はそっちには詳しくないが、浮動小数点例外をソフトウェアで検出するのなら同じだし、
ハードウェアでの検出なら割り込みがかかるだけで、速度的にはこれまた同じだが。

vectorについては完全に君の勘違いだぞ。
Cではそれぞれ専用の物を作るのが基本であり、それを一つにかけるようにしたのがテンプレートだ。
多分、理解の仕方が逆だ。

727 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 14:57:30.76 ID:VFvkGYoW0.net]
>>699
> Cで普通に汎用vectorを作るとすると
> 普通は汎用バイナリで作ることになるんで
速度云々議論してるところでそんなことする奴はバカって言われてもしょうがないと思う



728 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:04:23.09 ID:VFvkGYoW0.net]
>>705
> ハードウェアでの検出なら割り込みがかかるだけで、速度的にはこれまた同じだが。
Cだと言語の範疇ではその割り込みを処理できない
なのでif文とかでオーバーフローするのを検出するとかが必要
って話だろ

729 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:07:59.44 ID:PbE4ojLD0.net]
>>707
> if文とかでオーバーフローするのを検出するとかが必要
ほう。ならその

730 名前:コードを書いてみ。
そしたらそのコードの中でオーバーフローするから無限ループだね。
そんな言語が実用だったとでも?
[]
[ここ壊れてます]

731 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:15:00.22 ID:sI+Q43v80.net]
>>705
例外については「お前は頭が悪すぎて会話にならん」とだけ

コンテナは
「C++の方が遅い例だけ扱って、速い例は自分の想定と違う」
という主張を続けるならお前と会話しても無意味だ

732 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:16:02.69 ID:sI+Q43v80.net]
IDが変わってしまった
まあそんな事はどうでもいいか

733 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:18:43.30 ID:PbE4ojLD0.net]
ちなみに速度比較についてはいろんな人が様々やってるけど、
俺的にまあ公平だと思えるのはこれだね。俺の体感ともだいたい一致する。
おれは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程度だったが、ゴリゴリチューニングしてきているらしい。

734 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:19:13.36 ID:sI+Q43v80.net]
>>706
速度優先のコード前提ってことなら
保護されまくった高機能汎用コンテナを使うこと自体アホってことになるねえ

さらに条件を加えちゃってもう

735 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:19:20.53 ID:PbE4ojLD0.net]
>>709
僕は知りません、まで読んだ。

736 名前:デフォルトの名無しさん [2018/05/12(土) 15:20:34.21 .net]
>>708
なんで喧嘩腰なのかがよくわからないけど、
C言語では「n <= DBL_MAX」というif文が必要ってことだろ?

double p = 1.;
int n;
for (n = 1 ; n < DBL_MAX; n++){
p *= n;
}

737 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:23:37.01 ID:PbE4ojLD0.net]
>>714
いやオーバーフローするのは p だろ。

と思ったが、もしかして n の方なのか?



738 名前:デフォルトの名無しさん [2018/05/12(土) 15:33:27.39 .net]
>>715
なんでもない、忘れて><

739 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:48:51.69 ID:PbE4ojLD0.net]
>>716
通じたようで何より。

だからオーバーフローの検出はソフトウェアでは辛くて、通常はハードウェアのはずだ。
そしてその場合は割り込みとなり、Cの場合は割り込みハンドラにコードを書くことになる。
C++の場合は『そこから例外処理ルーチンまで引っ張ってきてくれるコード』をコンパイラが用意し、
ユーザーのcatchコードを実行する。つまり、上記『』内コードでラップされてる分だけ遅い。
(実際にはラップだけではなくスタックウォークも行うから相当遅いはずだが)

なんだが、実際俺はゼロ割例外しか見てないからオーバーフローについてはよくは知らん。
ハードウェア的には上記の動作になる。
一般的にはオーバーフロー例外は出ない環境(無限大に貼り付けるだけ)で使うのではないかと。

Cではアホみたいにゼロ割チェックやってるよ。
これはC++でも同じだと思うが、C++erはやらないのが作法なのか?
とはいえ、ゼロ割はCMP+Brachであり、通常は分岐しないから、x86ではほぼゼロコストだ。
割り込みは関数呼び出し自体が遅くなるから、結局これもCの方が速いはずだが。

740 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 16:03:54.80 ID:68o7JYmcM.net]
>>712
お前話の流れが読めてないだろ w
>>638から読み直せ、バカ

741 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 16:11:14.40 ID:eFTG6CfX0.net]
overflowてexception吐くんだっけか

742 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 16:35:26.68 ID:68o7JYmcM.net]
>>708
バカはこれだから w
isfinite( ) マクロとかも知らんのかよ

743 名前: mailto:sage [2018/05/12(土) 16:40:25.40 ID:HeMwMf3D0.net]
>>717
オー

744 名前:oーフローで例外や割り込みが起動することはないのでは?
普通、無符号ならキャリー、符号有りならオーバーフローのどっちかのフラグで判定するかと
[]
[ここ壊れてます]

745 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 17:14:24.19 ID:D96wT16B0.net]
unsigned long long array[100000000];

ここに同じファイルから乱数を読み込んで比較してみた

clのオプションは /Ox /arch:AVX
gccのオプションは -O3 -mtune=sandybridge

qsort
cl 27.171[sec]
gcc 26.139[sec]

std::sort

746 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 17:16:00.99 ID:D96wT16B0.net]
途中で書き込まれてしまった
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 未実装

747 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 17:16:40.49 ID:D96wT16B0.net]
>>690が正解だったね



748 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 17:49:15.49 ID:D96wT16B0.net]
>>698
そこの2通目に箇条書きしてある部分は
1992年当時に俺が思っていたことに近い

・例外がクソ
うん、マジクソだ
C++11以後マシになったが下痢が治ったという程度

・newいらねー
演算子newを初めて聞いた瞬間、
mallocの設計理念が大声でわめき立てた
C++11以後ブーイングが更にエスカレートした

・キーワードclassいらねー
禿自身が認めやがった

・・・しかし、それがなぜ>>685への反駁に引用されるのかがわからん

749 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 18:15:21.20 ID:VFvkGYoW0.net]
>>721
大抵のプロセッサの浮動小数点ユニットにはオーバーフローしたら例外を発生させる機能がある
それを有効にしてるかどうかは環境による
あとC言語の話で割込ハンドラーとか言ってる>>717は単なる知ったかなのでスルーした方がいい

750 名前: mailto:sage [2018/05/12(土) 18:29:10.59 ID:HeMwMf3D0.net]
>>726
>大抵のプロセッサの浮動小数点ユニットには
「浮動小数点ユニット」なんですね、ここで確認しておきます。

>オーバーフローしたら例外を発生させる
演算結果が ±inf になることを「オーバーフロー」と言うのですか?ちょっと耳慣れないですね

>>726
>C言語の話で割込ハンドラー
lsi-c ver3, MS-C ver6 あたりでは、そういうのもあったと記憶してます、 matherr() ですね
だから >>717 はあながち間違いとはいいきれない面もあります

751 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 18:40:33.53 ID:PbE4ojLD0.net]
>>725
世間では「どちらのコンパイラを使うか」ではなく、
「どちらのスタイルで書いているか」でCとC++を区別してるんだよ。

752 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 18:42:16.14 ID:VFvkGYoW0.net]
>>727
> 演算結果が ±inf になることを「オーバーフロー」と言うのですか?ちょっと耳慣れないですね
それ反対、オーバーフローしたら結果をinfにしてるだけ

753 名前: mailto:sage [2018/05/12(土) 18:49:16.74 ID:HeMwMf3D0.net]
>>729
inf も NaN も浮動小数点表現の中にあるので「オーバーフロー」と呼びにくい、と思っています、まあ人それぞれ

754 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 19:04:56.38 ID:VFvkGYoW0.net]
>>730
だから誰もinfがオーバーフローとは言ってないだろ
オーバーフローしたらそれっぽい値としてinfを入れてるだけ

755 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 19:24:22.69 ID:yANyZ1HYd.net]
>>728
それなら
Cスタイル、C++スタイル
と言えば良い

CかC++かは当然コンパイラで決まる
C++は元々上位互換を目標に作られた物だ

756 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 19:29:38.17 ID:VFvkGYoW0.net]
>>728
お前の変な世間はどうでもいい

757 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 19:48:04.17 ID:PbE4ojLD0.net]
>>732
> C++は元々上位互換を目標に作られた物だ
そうだ。そしてだからこそ、スタイルで区別されるんだよ。

元々C++はCの完全上位互換だった。
だから君らの定義なら、C++が登場したときから全てのCは消滅し、C++になっているはずだろ。
実際はそうじゃない。
「○○のコードはCで書かれています」
「○○のコードはC++で書かれています」というのは、
世間では俺の言った定義(>>676)で使われてる。

その後、CとC++が仕様的に分離してしまったから、
今現



758 名前:在はCコンパイラで通るコードがC++コンパイラで通らないケースが存在する。
だから今は明確に「どちらのコンパイラを使うか」を想定しておく必要があるが、
それもコーナーケースで、
大半の「Cのコード」はC++コンパイラでもそのまま通る。

お前らがC++信者でC++の範囲を広く取りたいのは分かるが、世間はそうじゃない。

C++がCの仕様を全て取り込んだら、
お前らにとってはCは消滅、全てはC++になり、お前らは幸せになれるだろうさ。
ただ、その後も世間はCとC++を引き続き区別するだろうよ。
[]
[ここ壊れてます]

759 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 20:09:12.78 ID:sI+Q43v80.net]
お前用語の定義の説明とかどうでもいい
スタイルの意味ならスタイルと書け

760 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 20:09:24.63 ID:D4Rf+0xLd.net]
>>734
それは嘘だなぁ
extern "C"が無いとCライクに見えるオブジェクトを吐かない事が常となっているC++(コンパイラ)について、いくらpure Cライクなコードを書いてもpure Cでないextern "C"を書かないとCライクに見えるオブジェクトは吐けないってそれはもうC++でしょう

他の内容にも誤りがあって君の世間ではCライクなコードであればCで書いたと宣言していいらしいけど、少しでも世間のOSSのコードを見て回れば良いよ
Cで書かれているのはCだから

761 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 20:30:38.36 ID:PbE4ojLD0.net]
お前らが誤解したままでいるのはお前らの自由だが、
お前らの定義だと、CとObjective-Cを区別できないだろ。
あれはCの完全上位互換で、Cコードそのまま食えるらしいからね。

お前らも少し考えれば自分で矛盾に気づけるはずだが。

762 名前:デフォルトの名無しさん [2018/05/12(土) 20:58:42.38 ID:cTj25fOrM.net]
>>734
それは言い過ぎでしょ。
流石にそれは、世間を知らなすぎ、と言われても仕方ない意見にみえてきたなあ。。。

763 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 21:57:33.16 ID:PbE4ojLD0.net]
ならもうちょっと分かりやすい説明をしてやる。

>>677-678について、お前らの定義では『コード』について議論できないだろ。

俺の定義では、677は「Cのコード」で、678は「C++のコード」だ。コンパイラに依らない。
お前らの定義では、678は明確に「C++のコード」だが、677については、
「Cコンパイラを通した場合、677はCのコード」
「C++コンパイラを通した場合、677はC++のコード」
になってしまうだろ。
それだと、CとC++の『コード』の速度比較自体が定義できないだろ。

677をCコンパイラを通した場合とC++コンパイラを通した場合の速度差は、
「コードの差」ではなく、「コンパイラの差」なんだよ。
当たり前だろ。

というか、C++erもここまでレベルが落ちたのか。世も末だな。

764 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 22:16:57.78 ID:DXsEIRbfM.net]
std::filesystemで片方のスレッドでファイルを出力し
もう片方のスレッドでファイルが存在していたら読み込むというプログラムを書いた場合
出力中に存在すると判定されて読み込んでしまいそうですが、
そんなことないでしょうか?
もし読み込んでしまう場合、自力でフラグ管理かMutexを使うなどして
判定する以外の方法はあるでしょうか?

765 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 23:29:24.63 ID:sI+Q43v80.net]
>>739
お前が考えた定義とかどうでも良いって言ってるの

766 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 23:53:40.44 ID:PbE4ojLD0.net]
というか何でお前らそんなに必死なんだ?
俺の言ってる定義が世間一般の定義だよ。
そうじゃなきゃ『コード』の善し悪しの議論が出来ないだろ。自明だと思うが。

繰り返すが、C++がCよりも遅いのは事実で、それもググレばいくらでも出てくるだろ。
ただこれはC++そのものよりもオブジェクト指向の弊害だが。
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++の仕様/方向

767 名前:性ではあり得ない。C++ではCを殺しきれない。
だからRustが生まれた。
>>711の表を信じるなら、RustはCの代替としてはC++以上に上手く行ってる。
[]
[ここ壊れてます]



768 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 23:56:27.27 ID:sI+Q43v80.net]
お前の定義じゃないと議論が出来ないのは
おまえがアホだから

769 名前:デフォルトの名無しさん mailto:sage [2018/05/13(日) 00:02:56.89 ID:VV8A9gRv0.net]
定義の布教なんかより技術的な会話をしろよ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<282KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef