1 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 17:27:19.70 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.83【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1363154865/ ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。 【アップローダー】(質問が長い時はココ使うと便利) codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック) ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
212 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 08:52:28.92 ] char const* a は const *a だから、*a がコンスト char* const a は const a だから、a がコンスト って考えると、3, 6は確かに自然な気がする でも、char const& a は const &a だから、&aがコンストかっていうと 何それイミフw って考えると、全然自然じゃない気もする。
213 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 09:12:40.30 ] constは ・左側で一番近い ・型に付いて 修飾するというのが基本ルール >>203 の1,4はその基本ルールでは解釈できず>>208 ,210のいうように例外的に解釈しなければならないから不自然 >>212 はconstが右側の、型ではない*aやaや&aに付いてる、という解釈の時点で最初から二重に間違ってる
214 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 10:15:43.42 ] なるほどなー。 自分は1,4を使う派だけど、constをどちらの目的で使うかによって、 型名とconstの位置が逆になるので、パッと見て分かりやすいかなー?と思っている。
215 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 10:49:49.41 ] >>213 なるほど、てことは const の左側に「が」を補って char const* は char が const char* const は char* が const char const& は char が const char& const は char& が constはイミフだからエラー って考えると自然?
216 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 12:03:02.39 ] そんなかんじでいいんじゃない
217 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 12:43:38.38 ] 左側にconstは記憶域指定子(static,extern,...)付きの宣言とぱっと見同じ読み方で解釈できて const初見の人でも受け入れやすい形だから便宜的に導入された記法なのかな int a; // int static int a; // なにかついてるけどint extern int a; // なにかついてるけどint const int a; // なにかついてるけどint int const a; // なにかついてるけどconst、・・・?
218 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 12:46:15.89 ] >・左側で一番近い 規格の該当個所はよ
219 名前:KUSO KOTE mailto:sage [2013/05/17(金) 15:03:07.06 ] >>217 記憶域指定子は別に左でなくても良いのだけれど ideone.com/k9Lxqm
220 名前:KUSO KOTE mailto:sage [2013/05/17(金) 15:12:14.57 ] URL間違えたoops ideone.com/PAlXVV
221 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 15:19:59.33 ] msdn.microsoft.com/ja-jp/library/1b4az623.aspx stringを取得する関数ってこれみたいに参照渡ししてることが多いけど、stringをreturnで返したら駄目なの?
222 名前:KUSO KOTE mailto:sage [2013/05/17(金) 15:31:43.27 ] >>221 昔は右辺値参照が無かったから コピーのオーバーヘッドを避けるために 参照にしていたと思われる。
223 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 15:47:36.06 ] やはりマイクロソフトの設計思想かな マイクロソフトは昔から関数を inに対してoutを与えるものでなく 「正否のステータスを返せるサブルーチン」 ととらえているところがある。 だから戻り値は参照渡しで受け取る
224 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 15:50:21.95 ] >>221 C++の.NET拡張はスレ違い
225 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 16:13:49.70 ] >>224 221はただの例示で本題はstd::stringだからな?
226 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 16:22:45.99 ] C++の文字列はJavaみたいはimmutable じゃないからねえ。 わざわざインスタンスを生成するより 使い回す方が自然。
227 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 19:52:53.57 ] 今回のconstもだけど、テンプレートやポインタ等の型を コンパイラはどのように構文解析して型を決めるんだ?
228 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 22:10:02.07 ] その状況で構文規則的にありえる構文候補を列挙してソースとマッチするものに絞り込んでいくんだがそういう話でなく?
229 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 22:14:50.72 ] *で区切られると覚えれば 別に左とか右とかそんなのどうでもいいんだよ
230 名前:KUSO KOTE mailto:sage [2013/05/17(金) 22:20:16.28 ] >>227 1.明らかにシンボル名と思われる所を見つける 2-1.すぐ右に()があれば関数 2-2.すぐ右に[]があれば配列 2-3.すぐ左に&があれば参照 2-4.すぐ左に*または*constがあればポインターまたはconstなポインター 2-5.すぐ左に「型」または「型 const」または「const 型」があれば終わり 3.その 関数の戻り値/配列の要素/参照先/ポインターの差すものは… →2-1に戻って解析を続ける ただし途中に記憶指定子とか入るので適当にがんばる
231 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 22:29:30.64 ] くそみそ
232 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 22:58:32.42 ] "const"は型の前と後のどちらに置いたほうがよいですか www.libjingu.jp/trans/bs_faq2-j.html#constplacement
233 名前:デフォルトの名無しさん mailto:sage [2013/05/17(金) 23:02:15.59 ] 日本語でも英語でも修飾子や形容詞は名詞の前にあったほうが読みやすいってことか
234 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 00:27:47.88 ] 欧米人には>>209 のC/C++表記だとすぐにそのように解釈できるのかな 同様にC/C++の型表記も自然な表記って感じるのか 俺的には、配列は int arr[10]じゃなく int[10] arrがいいだろって 初めのころは思っていたからな。
235 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 00:38:49.32 ] Cの文法がint[] a でなくint a[]なのは 使う時の書き方に似せるという 方針だったはず。 だがC++で参照&が登場した際に一貫性を失った。 ハゲは臭いものにフタをするタイプだから 整合性を考えなくて困る。
236 名前:KUSO KOTE mailto:sage [2013/05/18(土) 01:15:59.31 ] >>235 宣言と使用の記述の統一ついては ISO/IEC 9899:1990の時点で既に 宣言 void (*pf)() = f; 使用1 pf(); 使用2 (********pf)(); とか怪しかったような。
237 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 01:31:31.65 ] そんなことよりC#でやろうぜ 文法キモイ言語はポイしなさいポイ
238 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 08:04:30.10 ] 規格の何番の何ページという話は 規格オタ隔離スレでも作ってそこでやれ 初心者スレなんだよここは
239 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 09:20:03.56 ] >>238 いやそのりくつはおかしい
240 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 10:14:01.38 ] 有識者が初心者に正しい使用を教える ってよりは、 俺こんなに規格読み込んでるゼーっていう、 自己顕示欲旺盛な人たち同士の会話で、 初心者置いてけぼりなふいんきが 感じられる。
241 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 15:22:32.62 ] >>237 C#で済むプログラムしか作らないなら黙ってC#使えばいいんだよ お前がこのスレに居ることが全くの無駄
242 名前:デフォルトの名無しさん mailto:sage [2013/05/18(土) 15:32:38.93 ] >C#で済む この言い回しが勘違いも甚だしい。 「CはC#よりすごいんだ!」的な 自分の中で自分の価値を高めようと 必死なのがよくわかる。
243 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 00:45:26.82 ] Cのが速いんだから当たり前
244 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 00:52:59.09 ] .NET FrameworkのJITコンパイラの質がどんどん向上してスピードが上がってるんだが セキュリティの更新だけだと思ってるのか?
245 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 00:59:54.36 ] より低級な部分の処理には(ryですね、分かります
246 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 01:14:04.19 ] そのうちアセンブラを追い越す性能になるかもなw
247 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 01:17:53.99 ] >>246 アセンブラ直接弄ると、小数の丸め処理まで制御できるからな…… コンパイラがどこまで解釈できるかの勝負
248 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 01:41:00.42 ] >>244 それでもC/C++に比べりゃゴミみたいなもんだよ
249 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 02:06:25.95 ] 書き手の技量次第でFAではあるが、平均的なプログラマを前提にすると 手書きアセンブラと今時のC/C++コンパイラってどっちが速いか微妙じゃね?
250 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 02:11:20.47 ] アセンブラにしたって速度が要求されるコアな部分だけ使うのが 本来の使い方だからね。
251 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 02:17:33.53 ] ぷっ
252 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 05:05:15.33 ] 速度って言うけどさあ 細かい動的メモリ確保が 壊滅的におそいじゃんC/C++は。 そういうのを自前でメモリ管理すると 圧倒的に速くはなるんだが VM系のnewの代替としては限界がある。
253 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 06:49:35.08 ] え?malloc freeやら new deleteがめちゃくちゃ遅いってこと? そんな話聞いたことがないが
254 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 06:49:49.29 ] >>252 そういうのは自分でなんとかするものだ
255 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 07:39:02.23 ] >>253 mallocは明らかに遅いだろう
256 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 07:44:57.58 ] なにと比べて?
257 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 07:50:20.62 ] いや、普通の関数呼び出しとか 浮動小数点数演算とか ポインターアクセスとか 自動変数のメモリ確保と比べて
258 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 07:51:08.31 ] 中でリニアサーチを始めてると聞いた
259 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 07:52:19.07 ] 当たり前だろう ヒープを利用するのはそれだけのコストを払っても便利だからなのでは?
260 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 07:53:22.13 ] >>258 二分木にして適切にサーチする実装くらいあるだろう
261 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 07:53:54.40 ] >>259 多言語との比較の話を Cのメモリ確保方法の話に すり替えないでください
262 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 07:55:33.29 ] 他の言語だと早いのか?
263 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 07:56:16.70 ] 1秒間に100万回ループする所では mallocの使用はためらわれるけど Javaならまあ大きな問題はなかろう
264 名前:KUSO KOTE mailto:sage [2013/05/19(日) 08:03:58.39 ] さすがに100満開はかなり厳しいぞよ。 でも体感でJava/C#のnewはC++のnewより100倍は高速かな。 後でまとめて別スレッドでGCするんだから 解放時間入れてもスループットは高いだろう。 スループットだけは。
265 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 08:06:31.49 ] でもOSのカーネルじゃ使い物にならないよね(プゲラ
266 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 08:09:02.71 ] コンテキストスイッチしようとしたら ゴミがゴミ整理しようとして 5000マイクロ秒 待たされちゃいました。てへ
267 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 08:20:33.29 ] >>262 ガベコレ系の言語は C/C++の自動変数の代わりに newする設計なのでそれなりに速いよ ただ適材適所というか、やっぱり CPU演算メインな処理は C系じゃなきゃね
268 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 08:39:56.90 ] たしかに、すべての変数がnewで確保されるのだから Cのように100ナノ秒ちかくかかっていたら使いものに なってないっていう
269 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 09:03:42.10 ] でもJava/C# は C/C++ に比べて何を省略したからスピードアップを図ることができたの? GC があろうとなかろうとアロケーションという点では同じだとおもうんだけれど
270 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 09:11:39.60 ] コンパイル時になんでもかんでもしようとしないからじゃね
271 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 09:21:52.31 ] >>269 マイクロソフトのドキュメントには 「ガベコレ用スタックポインターをずらすだけなので高速です」 と書いてあったような。 つまり確保する領域の中に 「後でそれだけでガベコレできる情報」 を埋め込んでいることになる。詳細は不明
272 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 09:26:03.10 ] www.google.co.jp/search?q=C%2B%2B+Java+allocation+performance
273 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 09:40:50.19 ] >new Byte[1024] Cが速いという結果を得るための設定ですね? しかもJava1.5って、Sunが.NETを参考に GCを改良する前のやつ?
274 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 09:54:40.89 ] >>252 .NET のメモリ確保は0埋めするから壊滅的に重いじゃねーか
275 名前:KUSO KOTE mailto:sage [2013/05/19(日) 10:16:56.51 ] >>274 実測して比較しようじゃないか ideone.com/s6pjNN
276 名前:KUSO KOTE mailto:sage [2013/05/19(日) 10:23:30.46 ] すまん間違えた microseconds→milliseconds C#あんま速くなかったわ
277 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 10:26:43.12 ] C#は配列確保がクソ重いからメモリプールしてるわ
278 名前:KUSO KOTE mailto:sage [2013/05/19(日) 10:28:11.15 ] ちなみに俺の環境では C++:150マイクロ秒 C#:0.15マイクロ秒
279 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 10:43:14.88 ] >>278 それ、 >>276 の間違いは直して出してるの?
280 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 10:50:21.93 ] コンパイラによっては内部実装がdlmallocになって、 昔よりかは高速になったって聞いたけど
281 名前:KUSO KOTE mailto:sage [2013/05/19(日) 11:03:34.06 ] >>279 直してるつもりなんだけど あんまりVC++2012が遅いので不安になってきた。。 できれば誰か他の人、試して ↓修正版 ideone.com/r56YkM
282 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:06:57.53 ] そりゃそんな細かいメモリ確保したら遅いのは当たり前だわ 流石にそういうのは .NET に分があるのは間違いない
283 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:15:58.40 ] つまりC++の細かいメモリ確保は Java/C#より千倍遅いとふむふむ
284 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:25:34.32 ] C++とC#でNが違うだろ>>281 のソース
285 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:26:54.20 ] C++でもアロケータ自作で乗り切れるが そもそもそんな細かいnewを何度も行うケースは稀だから 意味の無い比較だな
286 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:28:49.49 ] boost::poolをいろいろ使ってみるとか 種類があるから
287 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:30:52.81 ] 最適化はやってるんだよね? 確かVCはデバッグ用だといろんな情報を埋め込んでて遅くなったと思うけど
288 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:33:49.10 ] >>284 平均する時に割ってるからいいじゃん むしろ速すぎて100倍しないと 測れなかったんだろ(プ >>287 最適化してなかったら死刑だなw
289 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:40:00.45 ] ideoneは最適化しなかったような
290 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:41:23.84 ] エクスプローラへのD&Dを試してみてるんだけど、何故か遅い 一回のドロップ操作完了までに、2〜3秒位掛かるんだけどこれ遅すぎだよな?
291 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:41:59.66 ] >>282 このプログラムのような細かいメモリ確保に対してC++では不可能で.NETが可能な最適化とは?
292 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:42:57.93 ] 標準でミリ秒測定できるとはいい時代になったなー GetTickCount()とか gettimeofday()を使っていた頃が懐かしい >>290 エロアニメの見すぎだろ
293 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:43:19.23 ] >>291 最適化の問題ではなく、 そもそもデバッグ用のメモリアロケータは バッファオーバーフロー検知や初期化漏れ検知のために 色々と小細工してる
294 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:48:09.15 ] >>293 それがC++と.NETの違いだとは思わんのだが。
295 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:49:37.20 ] >>293 じゃあ君のパソコンで比較して 結果貼りつけてみなよ 俺はメンドイからやらん そもそもメモリ管理の仕組みが 根本から違うんだっての 最適化の問題じゃない C++使いがガベコレにnewで勝てると 思ってたなんて新発見だわ
296 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:49:50.38 ] >>294 小細工ってのは、特定の値で初期化することで、 初期化のコストが発生する
297 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:51:54.14 ] >>269 フリーリストを手繰る処理を省略して、その分の処理をGC時にやってるようなもんだろう。 総計算量はイコールとは限らんが。
298 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:53:20.57 ] >>295 勝ち負けで言ったら予測不能な 中断を受ける可能性が入るC#は 処理時間にシビアな世界では負けだな 役に立たない
299 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:55:21.04 ] C/C++を使う理由は速度とかじゃない気がする。 .NETは十分速いもん 体感的には.NETが遅いので、C/C++を使うじゃないかとー
300 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:55:29.30 ] C++のほうは個別のdelete終了ごとにアロケータの内部整合性を保たないといけないけど、 GCなら一括でいろいろできるね。
301 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:56:19.37 ] >>299 .NETはPC上でしか動かないからな。組み込み.NETランタイムとか開発されれば別だが。
302 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 11:58:53.09 ] 速度だよ 似たようなアルゴリズムを .NET で実行と明らかに遅い
303 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 12:04:51.96 ] 標準、dlmalloc、tlsf、固定プールとか いろいろ比較してみたいけど、なんか環境用意するのが面倒だな…
304 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 12:08:21.19 ] >>302 比較コードはよ
305 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 13:00:24.45 ] あいかわらず無意味な比較してるなあ .NETのコア部分はC++で書かれてるのに
306 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 13:06:32.79 ] 何かが成功するかタイムアウトするまでループって処理で for (int i = 0; i < 5000; i += s){ nanika = suru(); if (nanika == seikou) break; sleep(s); } みたいのが繰り返し出てくるんだけど、何か上手い書き方ないですか? optional r = seikou_or_timeout(5000, [](){ return optional(...); }); こんな感じで書けたら素敵なんですが・・・・・・
307 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 13:08:47.13 ] WaitForSingleObjectで別スレッドで動かすとか
308 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 13:09:50.63 ] そこまで書けるのなら書けば良いじゃん
309 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 13:10:13.45 ] >>305 >>253 の疑問を晴らすには そんなにおかしな比較とは思えんが、 いつかの空ループベンチよりはマシだ >.NETのコア部分はC++で書かれてるのに 惨めwww
310 名前:269 ◆QZaw55cn4c mailto:sage [2013/05/19(日) 13:12:31.15 ] >>297 >総計算量 アロケーションからリリース(GC込みこみ)までトータルでみてどっちのほうが速いかというのが気になります。 C/C++ の場合は cmalloc() させるとしても、それでも C/C++ の方が速いと、どーしても思うのですが
311 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 13:14:51.55 ] >>306 win32api ならイベントオブジェクトを好んでいるんですけれども‥‥posix 系はどうしているのだろう?
312 名前:デフォルトの名無しさん mailto:sage [2013/05/19(日) 13:22:24.52 ] >>308 ラムダ式が何を返すにしろとにかくoptional的な何かに突っ込んで返すってとこがどう書けばいいのか よく分からないのと、もしかしたらループ以外に何か上手い方法か、そういうライブラリが既にあったり するのかな?という期待も込めて・・・・・・