◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:C++相談室 part135 ->画像>4枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1522495206/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part134
http://2chb.net/r/tech/1516406742/ このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://2chb.net/r/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
この64ビットが主流になりつつある時代にSTL使うとファイルサイズガァとかよく耳にしますが、時代についてこれていない老いぼれの戯言なのでとっとと見限って先に進みましょう ----- テンプレ ここまで -----
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。 ---- テンプレ ここまで ----
>>1 乙だが
さすがに
>>2 がテンプレとかないわ;;
えー、どっちもワシ(
>>1 )が貼り付けたわけじゃないのにー
このRTL使うとファイルサイズが減るとかおもいっきり頭悪い回答した奴とSTLをごっちゃにするテンプレいい加減やめれ STL使っている奴=無能に見えるではないか
コレ老いぼれが仕掛けているマッチポンプにも見えなくはないしな 毎回毎回クソみたいなテンプレ貼りまくって見苦しいぞまったく
原発も飛行機も、自動車も?固定メモリ空間で、確保解放なんて一瞬の手間すら惜しんで全部上書きでしょ(知らんけど)
インターネットにつながってる原発とか、USB接続ができる原発なんてあり得ないから。フロッピーもダメ。ROMカセットならギリギリOK。
EMP対策とか防火対策とか銃器対策もしないといけない。
確実な「保証」が必要だからなぁ。 リアルタイム性の要求もそうだが、 ありそうにないほどの最悪条件でもメモリ確保に失敗してはいけないので、 確実に見積もれるようにするにはヒープメモリの使用を避けるのは妥当なことも有りうる。 メモリ確保に失敗したら安全な終了シーケンスの実行も難しいだろうし。 起こりうるすべてのパターンで new が失敗しないことを検証するなんて 面倒くさい (というより事実上不可能な) ことは出来んだろ。 本当にシビアな制御が必要な原発レベルなら定理証明系とかも使ってるんじゃないかな。
全部アナログに任せてるから操作間違ってこんなんになっているんやろ
コントロールルームの写真見るとありえんくらい計器とボタンついてるから ソフトウェア自体ほとんど使われてないだろうな
マウスで原子炉の制御棒を操作するのか? 冗談すぎる。
作業員に1人テロリストが混ざっていたとしても、原子炉を暴走させることが出来ないようなシステムにしないといけない。
二人が同時にキースイッチをカチッとオンにすると発射!
原発関係の諜報活動はかなりシビアで、どこかの国では、国家犯罪的なコンピューターウイルスにやられて原発が稼働できなくなったらしい。
16bit時代は、友人にウイルスを集める奴が、居たよな。今では所持だけで犯罪になっちゃったけど。
原発は既に発電原価が他の発電方法よりも割高なんで、やめても良い 核廃棄物の処分方法すら未だに手が付けられないんだし 他の国は土地があって置き場所に困らないが、日本はそうでは無いよ
>>23 その頃はしょせん個人がいたずら目的で作ってた程度だからな
今の違法なビジネスで作られてるものとは性質が違う
あの頃は、ウイルス対策の概念が浸透してなくて、雑誌の付録にもウイルスが付いていたらしい。MS-DOSとWin9x時代のデジタル発掘には危険が伴う。
ウイルス蔓延に対する答えが、プログラムファイルの保護、ウイルス対策、UAC、SmartScreen、デジタル署名なんだよな。
C++20では、生ポインタが非推奨になるんだよな?
>>28 生ポインタを取り出すstd::to_addressが追加されるんだが
じゃ、勘違い。 株価を見るに、インテルも安泰じゃないようだ。
リスクオフで世界的に株安なだけでインテルの業績が悪化しているわけではない
>>31 しったか乙
アップルがIntel捨てるからだよ
ん?ノートがARMにでもなるの?ちょっとむりない?
独自CPUだよ 林檎だしアーキから独自じゃないの?
>>34 あいほんはARMベースじゃなかったっけ。自社カスタムしてるけど。
仮にインテルから自社製造に切り替えが本当だったとしても、 ARMかAMDみたいな互換のどちらかじゃないかな 仮にARMだったらRISCに戻ることになるのか そんな変更を強行出来るのはアップルくらいなもんだな
これまでのニュース記事 ・独自CPUを開発中 ・iphoneアプリをmacbookで動かせるようにする ・1000ドル未満のmacbookを追加する つまりはこんなとこでしょ。 ・macbookはARMアーキのカスタムCPU ・proはIntel CPUとカスタムCPUのデュアル構成 スレチなのでもうやめる
>>32 最近の下げ調子からちょっと戻したところをイースター休暇を狙って仕掛けがあったんだが
個別のちょっとしたニュースの影響なんて掻き消える事態なんだよ
ITだけでもほぼ全部下げてる
https://stocks.finance.yahoo.co.jp/us/ranking/?kd=4& ;tm=d
アップル 前日比-1.10(-0.66%)
マイクロソフト 前日比-2.75(-3.01%)
アマゾン・ドット・コム 前日比-75.35(-5.21%)
IBM -3.36(-2.19%)
グーグル -25.32(-2.45%)
インテル 前日比-3.16(-6.07%)
エヌビディア -10.54(-4.55%)
AMD 前日比-0.52(-5.17%)
クアルコム -1.60(-2.89%)
オラクル -0.74(-1.62%)
フェイスブック -4.40(-2.75%)
ツイッター 前日比-0.97(-3.34%)
ヒューレット・パッカード -0.78(-3.56%)
シスコ・システムズ -1.88(-4.38%)
>>15 >メモリ確保に失敗したら安全な終了シーケンスの実行も難しいだろうし。
これに関しては起動時にまとまったメモリを終了処理用にmalloc()しておくという古典的なテクニックがある
(1 MBのメモリを起動時にmalloc()しておき、ヒープメモリが無くなったらそいつを解放すれば
終了処理に1 MB使える
メイヤーズの本にも載ってる
Java最高!プログラムの未来はJavaにある!面倒なメモリ管理もなくなるし移植でコード書き直す必要もなくなるぞ! それに引き換えC++(笑)ときたら、数年後には特殊用途以外では消えてるね。まあその特殊用途もCとアセンブラで充分だけどな(プ とか言われてた時代もあったんです 本当だよ
class Manager { public: template <class T> static void add(std::string key) { auto inst = std::make_shared<SuperClass>(new T()); Manager::m_data[key] = inst; } } 使用例 Manager::add<SubClass>("key1"); こんなことがしたいんだけどnew T()のところでエラーが出る C2248 'SubClass::SubClass': private メンバー (クラス 'SubClass' で宣言されている) にアクセスできません。 解決策を教えてください SubClassはSuperClassから派生させてコンストラクタSubClass(){}を追加しただけです
すみません派生クラスのコンストラクタにpublic:つけてませんでした・・・
make_shared使ってるのにnewするなんて
こうしなさい auto inst = std::make_shared<T>(); Manager::m_data[key] = std::move(inst);
まずはManagerとかControllerとかいった名前をたやすく使うのをやめるべき。 もちろんそういった名前が適切な場合も多々あるが、初心者が使う場合、たいていオブジェクト指向設計に失敗している。
>>51 なんで?シェアードポインタに限っては内部カウント増えてコピーされるだけだよ。
うにーくはmoveしたいけど、mapには入らないみたい。
違うよ ちゃんと実際の型でmake_sharedしてからshared_ptr<SuperClass>に入れろって言ってるの
せっかく make_shared 使うのに明示的に生ポインタを new する人って… というようなことだろ
auto変数はスコープ外れたらどうせ破棄されるしmove要らない
いままでC♯使ってたけど、最近つーかおととしくらいからC++使い始めたんだよ。 そしていろいろ見ているうちにファイルの作成→3Dシーンというのがあったので、作成したら、 何もオブジェクトの入ってないシーンだけの画面が出てきたわけよ。 このシーンにオブジェクトを入れるにはどうすればいいの? またウインドウズのGUIの実行ファイルからこのシーンを出すにはどうすればいいの? つーかそもそもGUIの実行ファイルからこのシーンを出せるの? このようにまだ右も左もわかってない状態なんで、よろしくご教授お願いしますよw
>最近つーかおととしくらいからC++使い始めたんだよ。 ごめん、おとといくらいからの間違いだったよw よろしくご教授たのむよ!!
>>59 自分の環境くらい理解しよう。UnityなのかUnrealなのか。
何を言っているのかわからないし 特定のプラットフォームの話ならそっちで聞くべき
YAMLをC++で読む簡単な方法はなんですか? LibYAMLなんですかね
>>62 いや、いま使ってたのはUnityでC♯だったが、
それとは別にVisualC++とFBXSDKでってのをやってみようと思っておとといから始めたわけだよ。
でFBXファイルを読み込んでノードの取得あたりまでは進んだけど、
よく見るとVisualC++のファイル新規作成に3Dシーン(FBX)ってのがあるわけ。
もしやこれ使うとFBXSDKはいらないのかな?とも思ったりしたんだけど、
何しろまだ右も左もわからないし、その3Dシーンにオブジェクトを置くやりからもわからないし、
そのシーンを一応とってつけてつくってみたウインドウズ実行ファイルから呼び出すためのコードの書き方もわからないしで、
こうやってみなさまにご教授を求めた次第ですよ!!
私の認識が正しければ、SDKはSoftware Development Kitだから、実際の実行時に使うライブラリーのことだろうよ。
実行時に動かすなら、SDKにリファレンス(またはドキュメント)があるはずだ。
ドキュメントがないなら、そんなマイナーなフレームワークを使うな、で終わり。
>>68 まだ正式なリファレンスはいろいろ暇がなくて読んでない。
日本語で簡単に解説してあるウェブサイトは見たけど、
取得したFBXファイルのいろんな情報を文字列で表示するプログラムが載ってるだけで、
実際にその3Dオブジェクトを画面に表示する方法が載ってない。日本語のサイトで解説してあるのは、どうもここまでみたいなので、
やはり英語の正式なリファレンスを見ないとダメかな?www
ゲーム製作板に、くわしく知ってる人が居るかも知れない。
業界へ出るなら、英語アレルギーは克服すべし。自動翻訳が使えれば、詠めるかもしれない。蘭学から学べることは多い。
>>70 >ゲーム製作板か、CG板の方がいいかもしれない。
いやゲームはもう作りたくないし、CGも特に興味ない。
実はMakeHumanみたいな3Dキャラ作成ツールがつくりたくてね。
まだ始めたばかりで、そこまでの距離は100億光年ばかりあるけど・・・
これってやっぱりちゃんとしたプログラム技術板向きの話題だよね?
ゼロから3D作りたいなら、DirectX, OpenGL, Valkanあたりを勉強することになる。 しかし、ゲームエンジンがなければ、動く3Dは手間がかかる。
>>76 DirectX便利ですよね
魚眼を再現しようとして挫折しましたが...
iPhoneXでリアルタイムでVtuber作れる時代に素人が3Dモデラー作るのは、技術のムダだろう。
数学のベクトル、射影、非ユークリッド幾何学が理解できるくらいの数学力がないと魚眼レンズはムリだろう。ムリムリ。
物理学的に考えると、魚眼は屈折率の差から発生する現象だから、モデラーの物体に屈折率を設定するだけでいい。
カメラの特性で、レンズの広角が設定できればそれに越したことはないが。
>>80 エピポール幾何はいるでしょうねぇ
AR/MR/VRするなら
>>83 度重なるありがとうございます。
勉強します。とりあえず処理重そうです(・・;)
ゲーム作ろうと思っても大体はゲームエンジン作り始めて途中で飽きてやめる
CGもオブジェクト指向になっているから、撮影スタジオで実際に物体やカメラの位置を決めるのと同じように、シーンを構築すれば、それが映像になる。
ニュースセンターで使われるような、再現CGを自由に作れるようになったら、引っ張りダコだよ。
そうなったら、映像クリエイターになって仕事を請け負って独立できるぞ。プログラマーよりも働き甲斐があるかもしれん。
やたら伸びてると思ったら1人あたりのレス数多すぎだろ(しかも知らんことに口出し過ぎ fbxsdkは昔ちょっとしか触ってないが、多分そのVSの3Dシーン作成ってのは3Dのモデルやシーンを.fbxに書き出すプロジェクトじゃね? そういうのは多分Maya使った方が早いしfbxsdkはどっちにしても要る あとDirect3D使うならそっちのスレ行ってくれ
C++で用意されているキャストと cのi=(int)j みたいなキャストの違いがよくわからない
static_cast … 無理のない互換性のある変換。 reinterpret_cast … int から void* 等への強制変換 c の ()キャストと同じ。 const_cast … const 付きから const を無くしたりまたはその逆の変換。 dynamic_cast … 実行時型情報を使って実行時に型情報で互換性を見比べながらの変換。実行時型情報とのリンクが必須。
>>92 C スタイルのキャストは dynamic_cast 以外の C++ スタイルキャストを兼ね備えている。
安全なキャストも危険なキャストも見た目にわかんないから、
うっかり危険なキャストをしないようにカテゴリ分けしたやつを使った方がいいなって話。
reinterpret_cast や const_cast がどうしても必要な状況になったら、
それはそのプログラムが悪いデザインだというサインだ。
(デバイスドライバとか OS とかの低水準プログラムだと仕方なく使う機会は多いかもしれないけど)
『プログラミング言語C++』第4版のどこだったかに、 「危険なキャストを行っているソース箇所が目立つように reinterpret_cast<型> のような長い綴りで見た目もスマートでない キーワードを選んで導入した」みたいなことが書いてあったな。
すいませんchar str[1000]に格納されてるこの文字列を、str2[0][]=64 str2[1][]=9 という感じで上手くデータだけ取り出す方法は無いでしょうか
ありがとうございます 基本的には見た目の話なんですね
>>96 cならsscanfかね
c++ならregexを使うか
そもそもc/c++でやりたい範囲ではないが
>>96 テキストなのなら、一行ずつ読んで、=で半分にしましょう。
んで、""の中の空白以外を全部取り去って、std::mapにでも突っ込みましょう。
>>99 >>100
めっちゃ難しそうな回答きた・・
ちょっと調べて頑張ってみますありがとうございます
danger_cast は言い過ぎとして、unsafe_cast くらいにして欲しかった
>>96 ・str2はポインタの配列、idxはstr2の添字とする
・1文字ずつループして以下を処理
「=」が現れるまでまで読み飛ばす
「 」「"」以外の文字が現れたらstr2[idx++]にその文字へのポインタ格納
・「;」までスキップして¥0に置き換え
>>104 なんかできそう!やってみますありがとうございます!
reinterpret_cast をポインタ以外に使うのはない
c向けのライブラリをc++で開発するときは躊躇なく使うかな>reinterpret_cast あとはargとかparamとかいう名前の引数に好きなデータを突っ込みたいときとか。
reinterpret_castはゼロオーバーヘッド?
コンパイラさんが解釈かえるだけだから。新しくなにも確保しない。
>>107 の「あとは」以下の用例多いよね。
スレッドのエントリポイントの引数だの libcurl のコールバックの引数だのそんなので
バリアント型が無いために野蛮なキャストが生きながらえるんじゃ さっさとリフレクションとプロパティーとバリアント型を規格に盛り込みなさい
>バリアント型が無いために野蛮なキャストが生きながらえるんじゃ 誰も殺そうとしていない
Windowsとかのメッセージのパラメータなんて、 キャストしないとなにもできないけどな
>>112 > さっさとリフレクションとプロパティーとバリアント型を規格に盛り込みなさい
C+++でも作って勝手にやっててくれ
C++++でしょ ill-formedだけど それでこそアホどもに相応しい
static_castは長いから、ただのcastにしてほしい その方がreinterpret_castのunsafe感が高まる
デフォルトをstatic_castで解釈しないのはなぜ?
>>117 #define cast static_cast
>>118 互換性には2種類ある
クラスポインタ変換の場合を例に挙げると
一つは拡張クラスからベースクラスへのアップキャスト
こちらはキャストの明示は必要ない暗黙の型変換が行える
もう一つはベースクラスから拡張クラスへのダウンキャスト
こちらはベースから拡張クラスへの変換に確証が得られている
わけではないのでstatic_castを用いて変換してやらないといけない
このときdynamic_castを使うと実行時に型をチェックしてくれる
のでよりstrictな変換を行わせることができる
できるといってもエラーを発生させるかさせないかの違いだけだけど
>>121 それは互換性じゃなくC++独自の話だね
互換性というからには何と互換なのかという相手がいる
ちなみに、かつて暗黙dynamic_castが提案されて否決となった
コンソールプログラムのwhile()ループで1文字入力したらループを抜けるときに使うやつって何でしたっけ・・ while(!getchar())だと文字を受けるまで処理がとまってしまいますが、止まらないやつがあったと思うのですが
標準に「止まらないキースキャン」はない conio.hのgetch()や ioctl.hのioctl()あるいは windows.hのGetKeyState()のような 処理系依存の関数が必要
linuxならファイルディスクリプタにselectが使えるけど windowsの場合はファイルディスクリプタとソケットがまた別物だし
>>125 getch()絡みで調べてたらkbhit()って出てきましたこれです
ありがとうございました
ちゃんと任意のキー押したら抜けれました
それって結局はビジーループの一種じゃね? やりたいことにもよるけど、基本的にはあんまりよくない方法だと思う。
>>128 まずいですかね?
一日ランニング試験してみたんですが良い感じに動いてるのですが・・
ビジーループにSleep挿入して100msづつ位休む感じでアイドルに見せ掛けるハッタリを噛ます
低優先度タスクからのプリエンプションが無いOSでSleep(100 ms)したら 優先度関係無く他タスクに100 msを超えて待たされてしまうかもしれない Sleep()は実行権放棄の呪文としては強力すぐる…
DOS並にコンソールがクソな環境も珍しいよな unixベースのシェルに比べるとこんな貧相なものがよく生き残ってこれたとおもふ
>>132 ウィンドウズの話だけど、threadヘッダのスリープは起こし忘れが少ない気がする。
未だにGUIがまともにならないLinuxも珍しいよな
Class A { void A(B* &b) { } };
済みません、途中送信してしまいました・・・ Class A { B* _b; void A(B* &b) { _b = b; _b = new B(); } }; B* b; A* a = new A(b); b←newされてない・・・ クラスAのコンストラクタでクラスBのインスタンスを受け取り newで新たなインスタンスを作成したうえで返そうと思います。 しかし上記のようなプログラムを作成してもインスタンスbは newされてませんでした。 どうしたらbをnewしたうえで返すことができるようになるでしょうか?
void A(B** b) { *b = new B(); } でいいんでないの
馬鹿だから分からないんだが教えて インスタンス渡してからnewするのはなぜ? ポインタを参照にする意味とは?
>>142 > void A(B* &b) > { > _b = b; > _b = new B(); > } 下の方は b = new B(); としたかったんじゃないのか A(B*&b) { b=new B(); _b=b; } 頭悪いだろオマエラw
A(B*&b){_b=b=new B();} もしくは一発で書けば何の問題もおこらんよ
受け取ったインスタンスを全く使ってないがそれが意図した動作なのか
参照オブジェクトの概念がよくわかってない 学び直せと言いたい
>>150 >>142 で「インスタンスを受け取り」と書いてあるから
ポインタ(の参照)でだけどインスタンスを渡しているのだろう
何故受け取っているのかとかの説明は無理だが
それにしてもbをnewするとかイミフ 何もしてないじゃんw
古いインスタンスを_bに格納して新しいインスタンスをbに返したいのか 新しいインスタンスを作成してbと_b両方に返したいのか どっちなんだよ
>>152 b を new するってのは
>b = new B();
のことか?参照で返してるんだよ
何故返す必要があるのかはこれも答えられないが
>>142 に new して返そうと思っていますとあるからな
_b=new B() は見当たるが b=new B() ←こんな記述は見当たらないぞ 嘘もたいがいにしとけや
>>142 コイツのソース見る限りbに対しては何もしてないでしょ
すまんすまん
>>142 >B* b;
>A* a = new A(b);
を見落としていた
インスタンスを渡すといっておいてインスタンスを渡していないとは思いもしなかったw
>>147 であってるんだろうね
>>142 > void A(B* &b) > { > _b = b; > _b = new B(); > } void A(B* &b) { B* new_b = new B(); b = new_b; _b = new_b; } こういうのは愚直に書けばええんや AのコンストラクタにBへのポインタのポインタだか参照だかを渡さなくても Bへのポインタと関係ないAのコンストラクタ、と A内部のBメンバへのポインタを返すゲッタ、との 組み合わせにする方が素直でねぇか? class A { B* _b; public: A() {_b = new B();} B* ptr_b() const {return _b;} }; int main(void) { A* a = new A(); B* b = a->ptr_b(); return 0; } 別に確保した「Bを格納すべき領域へのポインタ」を受け取って、 Aの初期化時にBの配置newを行わせたい、という意図かもしれないけど、 元の質問から想像を広げすぎてるよね。
Aが_bをdeleteするために管理するだけのクラスだとしたらスマポ使えという話になる
舌足らずでもうしわけありませんでした・・・ クラスBのインスタンスをクラスAで処理していくためにコンストラクタでクラスBの インスタンスを参照受け取りする仕様にしました。 大半のケースではそのまま処理して終わり、なのですが まれに受け取ったクラスBのインスタンスをnewし直す必要がありまして その際受け取ったクラスAのメンバ変数 _b をnewしても受け取り元のインスタンスを newできないことに悩んでいました ただオブジェクト指向の観点から見るとあまり美しいプログラミングスタイルでは無いのかもしれませんね。 クラスBのインスタンスはクラスA内部で完全隔離処理するようにした方がいいのかもしれません
BをAしか使わないならAの中に隔離する 他でも使う必要があって、Aの外部でBの寿命を管理してるなら、AにrefreshB()みたいなBをnewし直した時に渡し直す関数を用意する でいいんじゃないの 本当にBをnewし直す(メモリ上再配置する)必要があるならだけど 実はB自体にreset()用意するだけで済む話のように見える
c++じゃポインタのこともインスタンスっていうのか
理解不足を言い換えてミスしてない風にするのが流行ってるのかな
質問あるのですが、 同一PC内の画面機能と処理機能のプロセス間通信はどうやるのが便利ですか? 画面更新速度は100ms周期くらいです。 共有メモリがいいと思ったんですが、ソケット推してる人がいてもやもや アクセス速度とかNICの通信量とか考えると共有メモリ一択な気がするんですが、どうなんでしょうか? パイプとマップドメモリはメリット無いので考えていません。
そもそも別にする理由は何? どんなものを想定してるの? プロセスは常に1対1なの
同一PC内なのにソケットとNICの通信量って何か関係あるの?
>>168 ソケットって、その場合はUNIXドメインソケットのことだろ。 NIC は関係ない。
プロセス間通信としてはほどほどに速度もあって、ほどほどに疎結合なので十分に選択肢の範囲内だと思う。
unix domain ソケットがお手軽で便利だけど 時代に合わせてパイプか tcp かなあ Windows でしか使わないならならcom使うのも簡便
共有メモリだとリングバッファとか排他とか自分で作り込まなきゃいけんやろ ソケットならそのへん考えなくてええやん
windowsはファイルマッピングオブジェクトでしょ パイプでさえSYNCHRONIZE特権指定できないゴミなんだから
unix domain socket なんて使ったことないな 名前空間としてファイルの指定がいるし将来違うマシン間で動作させる時に変更量が多いしtcp/udpに比べてデメリット多くね?
>>173 ,174
共有メモリは例えば/dev/shmのRAM領域にあるメモリマップですよね
同一PC内のソケットのボーレートってほぼクロック数なんですか?
同一PC内の通信であったとしてもネットワークドライバの実装するプロトコルスタックを経由してしまうので、
その分のオーバーヘッドの分だけ速度が落ちる、という解釈ですが
iperfとかで同一PC内で速度測ったらどれくらいいきます? (1Gbpsな気が)
>>179 ドロップしないから楽なんだよ
デメリットは仰る通り
>>180 あなた知識が色々おかしいので何も考えずに教えられたとおりにした方が良いですよ
昨日の安全確保支援士の試験にC++が出ていたが、メンバ変数にm_が付いていた。 さすがにポインタのpなどは付いていないが、ちょっと意外だった。
>>183 同一PCのTCP通信はどういう経路通るの?
未だにシステムハンガリアンなやつみたいに変なのとも うまく付き合うのがC++使いのスキルの1つだかんね
Windowsのネットワーク関係APIはkernel内に実装されていない 後は判るな?
ネットワーク関係に限らずAPIはすべてサブシステムだね
class Sample{ private: const double val{0.0} public: void set(double v){ static_cast<double>(this->val) = v; } }; VS2015での話なのですが、こんな感じのコードを先日見かけまして static_castでメンバ変数のconst外しができているように見えるのですけど、この動作は合法なものなのでしょうか? 試しにwandboxのclang 7.0で試して見た所当然のようにコンパイルエラーになったのですが・・・
>>191 const を外すのは const_cast じゃなきゃ出来ないことになっている。
だいぶん昔からそう。
でなきゃわざわざ分けている甲斐がない。
const char *a = "hoge"; const char *b = "hoge"; この2つのポインタがa == bになることは保障されていますか?
>>192 やっぱりそうですよね、何か特別な動作かとも思ったのですがVC++のバグか仕様なんですね・・・
>>191 VS2017では警告されるぞ(おそらくVS2015でも)
cl 191.cpp /c /W4
Microsoft(R) C/C++ Optimizing Compiler Version 19.13.26129 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
191.cpp
191.cpp(7): warning C4213: 非標準の拡張機能が使用されています: 左辺値でキャストしました。
後はわかるな?
ポインタや参照のconst外しは合法だが なぜ合法なのか(合法にせざるを得なかったのか)というとmemory aliasing状況下での最適化の限界に関する ラクダ本ばりに長い議論を要する 悪寒、 プログラミング言語C++か何かでは古いライブラリのconst付け忘れにコード修正無しで対応できるYO!みたいな簡単な説明しかないが しかし左辺値のキャストというのはどうなの?
static_cast<double>(this->val)自体は合法でしょ this->valと同じ値のdouble一時オブジェクトができるだけ おかしいのはそれに代入してること
途中で書き込まれてしまった int x; (float&)x = 1; //well-formed (float )x = 1; //ill-formed
std:stringを引数や戻り値で使う場合、値渡しでも大丈夫ですか?
stringは内部に参照カウンタを保持した共有リファレンサを持っているから&&使用せずに直で渡しても特に副作用もなく何の問題もないよ
今どきのstringはヒープじゃなくスタックを使ったりもするね 鬼のように最適化されている
>>205 貴様は過去を否定するのか?
温故知新という言葉を知らないのか?
青二才
ありがとうございます 勝手にデストラクタでdeleteされるとか色々考えていましたがそこは先人たちが考慮して作られているのですね
いやいや老害に騙されちゃだめですよ。 参照カウントなstringは大昔に禁止されているので、ちゃんと参照や右辺値渡等を使いましょう
>>208 何言ってんだおまえ
頭悪すぎるにもほどがあるだろ
COWなstringは効率が悪くてマルチスレッドとの相性が最悪なのでとっくの昔に打ち捨てられました 規格のCOW実装許容するための記述はC++11でバッサリ捨てられました 今はCOWは規格違反です
値渡しや戻り値で戻せることと、 std::string内部での(ヒープ)メモリ管理の詳細は関係なくね?? 引数や戻り値としてスタックに構造体を積めるようになった時点で値渡しや戻り値で戻せることとはほぼ自明 (よほど変なコピコンを定義してコピーをわざと不首尾に終わらせない限りそれはできる
>>213 まあそうだけれど無駄なコピーはなるべく避けましょうということで
今時のコンパイラは、そこらの人間よりよっぽど高度な最適化をするから、素直で単純なコードを書くと速くなる。 効率化するつもりで余計なことをすると、コンパイラの最適化を妨げて、かえって効率が落ちたりする。 本当に重要な部分は実測しながら試行錯誤、それ以外はできるだけ素直なコードを書く、ってあたりが基本。
stringを値渡しせずにconst参照等々で渡すことはc++の基本なので、素直で単純なコードの部類に入ると思うが。
先生!OpenMPへの展開も自動でやってくれるんですか?
値渡しを素直なコードとか言う人って他人の書いたコード読まないんだろうな 宿題以外で何か書いたことあるのか
const参照渡しが基本だったのって C++11 以前の世界の話だよね… 幸い、近頃はそんなコードをあまり読まずに済んでるけど。 余計なことをしない、ってのが大事なんだよ。 参照でなきゃいけない理由がなければ、参照を使うべきじゃないんだ。
初心者です。 今書いてるプログラムをコンパイルして実行すると、エラーが出たり出なかったり謎の挙動を起こします 最初はエラーが出て、その後数回、コードを一切変えずコンパイルしなおして実行すると急にエラーが出ず上手く行ったりします。 これって何が原因なのでしょうか… こういう事ってよくあるのですか?
>>224 そのエラーとやら、もしかして警告か?
エラーは直すまで何度コンパイルしても絶対に通らない
警告はコンパイルが完了しオブジェクトファイルができる
そのコンパイルとやら、もしかしてビルドか? それともmakeか?
ビルドやmakeはオブジェクトファイルとソースファイルの日付を比較して
ソースファイルのほうが古いとコンパイルを省く
だから警告が出てからもう一度ビルドしても同じ警告は出ない
おそらく、こういうことだと見受ける
>>227 日本語読めないのかよ...
> 実行すると、エラーが出たり出なかったり謎の挙動を起こします
実行してるということはコンパイルは通ってるということだと思う つまりコンパイルの問題ではなく、コンパイルエラーではないだろうという推測
>>230 「実行すると」
ビルド時のコンパイラなどからのエラーではなく、
プログラムを実行したときの挙動についての質問のようですよ
初心者つってるから どこまでがコンパイルで どこからが実行なのかの 区別からあやしいと見ている 実行時エラーにしても stopダイアログなのか 結果がおかしいのか あの質問では言ってない
コンパイルして(リンクを)実行すると だったりして
しつけえな ここはプログラム技術板 技術的な内容が皆無のレスでひっ絡んでくるなカス
>>224 何を実行するのか目的語をはっきりさせろ
プロ意識が欠けている
pthread を使ってループ処理をマルチスレッド化したのですが、シングルスレッドと同じスピードしか出ませんでした。 pthread でこういう事やっても無駄なんでしょうか?
流石に情報が少なすぎて このままだと下手糞としか言いようがない。 ソースコード貼り付けれ
pthread使うとひとつの処理が倍速にでもなると思ったのだろうか
舌足らずですみません。コードはこんな感じです。 threadFunctionは単なる加算値、joinFunctionは集計処理です。 コアは物理2論理4です。 template< class ArgType > void Reduce( std::vector< ArgType >& threadArgs, void* (*threadFunction)(void*), void (*joinFunction)(std::vector< ArgType >&) ) { const size_t threadCount = threadArgs.size(); threads.resize( threadCount ); std::vector< void* > voidPtrArgs = CastArgsToVoidPtrs( threadArgs ); for ( int threadIndex = 0; threadIndex < threadCount; ++threadIndex ) { sched_param schedParam; schedParam.sched_priority = sched_get_priority_max( SCHED_FIFO ); pthread_attr_t threadAttribute; pthread_attr_init( & threadAttribute ); pthread_attr_setschedpolicy( & threadAttribute, schedPolicy ); pthread_attr_setinheritsched( & threadAttribute, PTHREAD_EXPLICIT_SCHED ); pthread_t& thread = threads[ threadIndex ]; pthread_setschedparam( thread, schedPolicy, & schedParam ); pthread_create( & thread, & threadAttribute, threadFunction, voidPtrArgs[ threadIndex ] ); } for ( int threadIndex = 0; threadIndex < threadCount; ++threadIndex ) { pthread_t thread = threads[ threadIndex ]; pthread_join( thread, NULL ); } joinFunction( threadArgs ); }
>>243 この世界では、何かやって思い描いてたようにならなかった場合
まず自分の能力不足を疑うのが鉄則
>>248 アハハハハ!ジョークのつもりかなんか?
そうじゃないならjoinの動きを勉強しろ
いまだに関数ポインタ使ってるのか。野蛮人。 std::functionってスレッドセーフじゃないの?
いまだ関数ポインタが使いこなせないんだけどやばいかな?
考えたらjoinの問題じゃないか もし「単なる加算処理」が1スレッドでメモリ帯域使い潰していたらマルチスレッドにしてもどうしようもないのは明らかだよ
>>253 未だに関数ポインタなんて使ってるほうがやばい
画像処理で合成処理をパラメータでもらう場合があるんだが その場合内部処理と対応させるために関数ポインタは使うが そういうのもダメ?
ダメってわけじゃないけどさあw C++ならもっと柔軟性のあるやりかたが幾らでもあるってこと
std::byteが邪魔すぎるんですけどg++で無効にするオプションってありますかね?
>>257 あんた昨日のおじいちゃんだろ。
functionの時代もとっくに終わってるぞ。
autoとlambdaで関数ポインタを使うべき。
>>258 ライブラリ制作者でもなければ関数ポインタなんぞ触らんよ。
よほどCとの兼ね合いが無いと。
>>248 threadcountいくつになってるの?
忘れがちなことだが std::function は実行時の型を扱う。 画像処理などのようにヘビーな繰返しがあるような場面では関数ポインタを使った場合との間に深刻な速度差が生じることもなくはない。
>>248 関数名からして、一度のreduce処理量は大したことなくて、何度も繰り返し呼んでない?
thread処理に必要な処理量が相対的に無視できなくなってるんじゃね?
スレッドは4本に制限して、各スレッドが処理する量を増やすかスレッドプール式にしては?
C++だから関数ポインタ使わないとか頭おかしい 関数ポインタのほうが高速かつシンプルに書けるならそちらを選択すべき
富豪かどうかはおま環だろ だから自己申告しないヤツが悪い なんでこっちがエスパーみたいなことしなきゃいけないんだ わたくしは教えないがあなたがわたしの環境を忖度しろってか? ヴァカじゃねえの? アフォに対してちゃあんと「テメーのスペックはいかほどですか」と尋ねろクズ 富豪かどうかはわからない、それを言わない人間がまず間違い、 それを逆手にとって相手をマウンティングするアフォがいるから話が進まない
どんなスペックだろうと他のソフトがどれだけメモリや処理時間を喰い潰していようと自分の処理はサクッと終わらせたいといつも思う
>>260 へんてこりんなマウンティングするやつだなあ
ちなみに昨日なんて俺書き込んでないからw
>>248 調べてみたけどさっぱり判りません。
pthread_joinで各スレッドの終了を待って、その後、集計処理をするというのはごく渡り前の処理に見えるのですが、
何が行けないのでしょうか?
別の方法でスレッドの終了を待たねばならないのでしょうか?
自分勝手デスミア線が、具体的に問題点、改善点を指摘して下さいm(_ _)m。
いいから「単なる加算処理」全部見せろよこの包茎野郎
threadFunctionが、 void* CalcBasicStatics( void* threadArg ) { BasicStaticsThreadArg* arg = reinterpret_cast< BasicStaticsThreadArg* >( threadArg ); double intervalOfX = arg->intervalOfX; double x = arg->dividedRangeOfX.start; double sumOfY = 0.0; double sampleCount = 0; const sc::Sampler& f = arg->f; while ( x <= arg->dividedRangeOfX.end ){ double y = f( x ); sumOfY += y; sampleCount++; x += intervalOfX; } arg->sumOfY = sumOfY; arg->sampleCount = sampleCount; return nullptr; } joinFunctionが、 void CalcBasicStaticsJoin( std::vector< BasicStaticsThreadArg >& args ) { double sampleCount = 0.0; double sumOfY = 0.0; for ( int i = 0; i < args.size(); ++I ) { sumOfY += args[ i ].sumOfY; sampleCount += args[ i ].sampleCount; } for ( int i = 0; i < args.size(); ++i ) { // 結果を書き込み BasicStaticsThreadArg& arg = args[ i ]; arg.average = sumOfY / sampleCount; } } です。細々すみません。
そのコード見ても 並列度もスレッドあたりのサンプル数も 1サンプルあたりのコスト(f)もわからないので まるで意味がない 2または4並列で、1スレッドあたり1~10Mサンプルくらい処理するようにすれば 速くなるか少なくともスレッドを使わない場合より遅くならないと思う 同じ速度ということはメモリ帯域が律速なのかもね
fでメモリのどっかから数値を読んでいるんだと思うけど、
これがなるべく連続したアクセス(局所化を謀る)になるようにループを構成できれば速くなるかもしれない。
この辺りはググれば色々参考になるページがあると思うが
いまググッたらそれらしいページがあったので書いておく
http://myoga.web.fc2.com/prog/cpp/opti02.htm 仕様として外からfが与えられるなら無理な話かもしれない。
もちろん interval が 1 で f(x) が { return v[x]; } のような最適なケースよりは速くならないので
その辺りは無駄な努力をしないよう測っておきましょう。
fの中身が公開出来るなら公開して 複数あるならそのうちの1個でいいから あと、 1回のthreadFunctionで何個くらいfを計算する?
>>250 joinについて勉強しろとか偉そうに言ってたのは何だったの
>>278 こりゃ「多分」joinの問題じゃないなと判断して
>>254 を書いたんだが
これくらいのコンテキスト読めないとマルチスレッドは無理だよ
fやら具体的なargsの内容やら処理時間測定のやりかたも記述されてないし んなもの誰も答えられるかよ
>>279 違う違う
なんで明らかに間違えてる事を偉そうに述べられるのかと聞いてんだけど
読解力もスキルもないのか
>>281 本当に「明らかに」だと思ってるの?バカですか?
サンプルレベルのJoinの使い方をみて 「アハハハハ!ジョークのつもりかなんか?そうじゃないならjoinの動きを勉強しろ」 は流石に笑ってしまう
cin で、個数の決まっていない整数たちを読み込みたいのですが、どうすればいいでしょうか? 整数たちの個数 n が分かっていれば、以下のように読み込めばいいですが。。。 vector<int> v; int i; for (int i = 0; i < n; ++i) { cin >> i v.push_back(i) }
>>282 明らかにだろどう見ても。
何をどう勘違いしたのか説明してくれよ。
>>285 他に入力がないなら cin.eof() で入力の終了を検出できるよ。
cin のブール演算を使ってもいいけど、どうにも慣れなくてね(個人の見解)。
>>287 ありがとうございました。
別の質問なのですが、一般的に、vectorの使用頻度というのはどれくらいでしょうか?
配列でやれることもすべて vector を使ってやるという人は多いでしょうか?
それとも、効率などを考えて配列で極力済ませるという人が多いでしょうか?
もちろん、ケースバイケースでしょうけれども、そのあたりの常識がないので、大体
どんな感じなのかが知りたいです。
自分としては、効率など細かいことは考えずに、vectorを使って問題ない 場面ではvectorを使うという風にしたいのですが。。。 vectorを使っても速度などの点で問題ない場合、一般的なプログラマーなら どうするのかが知りたいです。
vector<int> v; int n; cin >> n; int t; for (int i = 0; i < n; ++i) { cin >> t; v.push_back(t); } int *p; int n; cin >> n; p = new int[n]; for (int i = 0; i < n; ++i) { cin >> p[i]; } どちらにするのが普通なのかの常識がありません。
>>290 生のnew/deleteは、なるべく使わないのがいい。delete忘れ、例外などでバグの元や維持コストになる。
>>291 ありがとうございました。
ということはできるだけvectorを利用したほうがいいということでしょうか?
>>292 動的にサイズが変わらないなら配列かstd::array。
動的にサイズが変わるならstd::vector。
>>290 上だったらv.reserve(n)しておこう
>>289 私は書き始めは std::vector を専ら使っており、後で他のコンテナに換えています
>>296 普通の人間なら、文脈を読み取れるけど、俺はコンピューターに近いんだ。
>>289 実用上の問題が無いことがわかっている範囲内であれば、
深く考えずに vector だけで乗り切るのも悪い選択じゃないと思うよ。
ただ、使い分けることで意図を表現しやすい。
たとえば list を使っていれば要素の挿入や削除が頻繁なデータなんだなって思うし、
array が使われていれば要素の個数が固定なんだなって思う。
速度的に影響がない程度の規模であっても、
それが適しているような操作をこれからするのだという意思表明は人間がプログラムを読むときのヒントになる。
そして、そういうヒントは書いている途中にこそ必要なものなので、
>>295 のように後から整理していくスタイルは個人的には好きじゃないな。
>>298 >それが適しているような操作をこれからするのだ
うーむ、いろいろと考えさせられます
std::vector でなら使えても、std::list では使えない、というのはあるから、最初からそれを考慮しておくのは…よくありますねえ
vector は list に比べた場合、 データがメモリ上隣接して並んでいるので →そういう引数を要する各種 API にそのまま渡せる →メモリアクセスが局所的にできてキャッシュが効く 予約領域を拡張する場合にのみアロケータが呼ばれるので追加時のアロケータによるオーバーヘッドが低い とかの良い特性もあるので要素のコピーが軽くて個数が小さいものはvectorにして損することは少ない
BidirectionalIteratorとRandomAccessIteratorだろ 規格用語で言えば短く済む
std::listはメモリ局所性がないので今どきのマシンだとクソ遅い 積極的に使う理由は基本的にない
メリットとデメリットを見極められないとコンテナを使いこなすのは難しい 昔から配列を弄り倒している古参にとってはこんなに便利な物はないと思うがね 90年初頭辺りにタイムスリップして実際に構造を真似てフルスクラッチでテンプレートなんぞなかった世界で組んでみればコンテナの挙動は自ずと理解できると思うが時代がわるかったな 今は何も苦労しなくても容易になんでも手に入る世界だからな 修業が足らんよ青二才
>>303 その使い所がよほど特殊な状況以外にないんだよ
大規模C++ソフトウェアデザインという本を読んでいます。 冗長インクルードガードが紹介されているのですが、効果あるんですかね。 古めの本なのですが、最近のコンパイラだと意味ないですかね
#pragma once って規格化されたんだっけ?
されてない しようしようと20年言われ続けて技術的な問題でできずにいる
243です。 アドバイスを頂き検討したのですが、メモリが散らかっているのが原因と判断しました。 都合により細々とした実装の話は割愛しますが、付き合ってくれた皆さんありがとうございました。
>>305 その特殊な状況の為にlistが存在する
私の場合は特殊なプログラムを書くことが多いので
使いどころは多いのかもしれない
また、普通の組み込みC言語でも簡易な片方向リストとかを使ったりする (C++じゃないのでlistは無い)
>>309 技術的な問題ってなに?
既に実装してる環境の方が多くね?
>>313 プリプロセッサは C++ じゃないからね
C++ 以外の言語と共有しているツールなので
それらと歩調を合わせる必要があるし
プリプロセッサだけ独立の規格にするなら
C++ を含め、諸言語の規格も
プリプロセッサのバージョンとどう付き合うのか
策定せにゃならん
>>316 意味わからん
C/C++の規格にプリプロセッサの仕様もあることを知らんのか?
そもそも他の言語と共有してる環境なんて見たことないし
現行では、 #include ディレクティブは「対象ファイルの内容がそこに書かれているかのようにふるまう」という規則なので、
ヘッダファイル内のプラグマ (#pragma once) の解釈が始まるのはインクルードされた後になる。
もちろん対象範囲がコンパイル単位全体に及んでしまっては #pragma once の意味がないが、
現状の仕様に辻褄を合わせるとそうなる。
実装した処理系がもうあるんだから実装に沿うように規定しなおすってことはできなくは無いんだろうが、
#pragma once を仕様に入れるのに #pragma once の項目を追加すれば済むわけではないってことは理解してくれ。
それと、プリプロセッサの仕様は C/C++ の一部なのは確かだが、
挙動を規定しきれていないのじゃないかということは指摘されている。
https://qiita.com/ruiu/items/4d471216b71ab48d8b74#3%E6%9C%8817%E6%97%A5 うやむやでやってきてるところを整理する必要は有ると思う。
>>317 Haskell (GHC) は C プリプロセッサを使うよ。
汎用的に使いたいなら M4 とかの方がいいとは思うけど、
Cプリプロセッサに慣れている人は多いから……。
また別な話 #includeしようとしているファイルが 過去に#includeしたファイルと同一かどうか という判定も意外に厄介だね ハードリンクできるファイルシステムと そうでないファイルシステムがあったりするし ハッシュが一致しても衝突かどうかの問題もある
ハードリンク、シンボリックリンクが無いファイルシステムだったとしても、サーチパスの問題も思いつくな。 たとえばカレントディレクトリと、カレントディレクトリ直下の foo ディレクトリからヘッダファイルを探すようになっているとき、 #include "bar.h" と #include "foo/bar.h" は同じファイルを指しているが、表現が異なる。 同一のファイルとして除去すべきだろうか?
#if **** #pragma once #endif とかどうなるの? 複数回のインクルードで条件がちがっていたら?
>>318 > 実装した処理系がもうあるんだから実装に沿うように規定しなおすってことはできなくは無いんだろうが、
規定すればいいだけだろ?
どこに技術的な問題があるんだ?
政治的な問題だと言うならまだしも
>>319-320 みたいな話は処理系定義ですむ話
>>321 は少し悩ましいがそもそも途中まで読んでから#pragma onceとか言われても面倒だから書くならファイルの最初に書けとかの制限をつければいい
> 挙動を規定しきれていないのじゃないかということは指摘されている。
いやいや、その子ちゃんと規格読めてないだけでしょ w
> Haskell (GHC) は C プリプロセッサを使うよ。
仕様を流用してるだけでしょ?
何かのコンパイラと共有してるわけじゃないと思うが
君よりよっぽど賢い人達が20年間悩み続けて未だに出来てないことを舐めない方がいい
>>323 別に悩み続けてなんていないでしょ w
#pragma onceで事足りてるからわざわざ政治的なことに足突っ込みたくないだけ
新規格の季節になると毎回のように標準化委員会の議題に上がってるんだが?
モジュール方式になったらヘッダファイルが要らなくなる?
>>322 > 処理系定義ですむ話
それはおかしいでしょ
ハードリンクできる処理系からできない処理系に移植したtarボールの
#includeの挙動が未規定なら結局インクルードガードを自前で書くことになる
>>325 でも誰も進めようとしないんだろ w
よくある話
>>327 C/C++ ってそういう言語だしそもそも環境変える予定があるならそんなものに依存したファイル構成にしないでしょ
#pragma once なんて once upon a time だぜ 今はもうだれも気に留めてやしねぇ
>>322 トピックとして大きすぎるので面倒くせえってだけの話。
#pragma once ぐらいPerlでインクルードガードに自動変換できる、 ていうか無くてもできるから自前で書くとかありえん…
むしろプリコンパイルヘッダーが規格化されないの方のが悩ましい…
ていうか#pragma onceとか#ifdef~#endifによるインクル~ドガ~ドのシノニム以外の何者でもないと思うが
一方#ifdef~#endifによるインクル~ドガ~ドは
「対象ファイルの内容がそこに書かれているかのようにふるまう」
という規則の下で立派に機能していると思うし、
>>321 のように等価な#ifdef~#endifによるインクル~ドガ~ドが存在し得ない場合はエラーにしたら良いと思うし、
ハードリンクできる処理系かどうかに関係なく#ifdef~#endifによるインクル~ドガ~ドは機能していると思うし
(だいたい1バイナリのビルド中にハードリンクの中身が変わるみたいな想定をする方がおかしい=ハードリンクはそうでないファイルと区別がつかないとみなせるハズ
だったら#pragma onceも問題なく規格化が可能なのでは…
少なくとも技術的な問題とかとうていナッシング?
ちょっとはググれよ。 お前みたいなやつを「殆し」って言うんだぜ
↑ググってもボンクラが書いたような駄文が見つかるだけなので却下。 1. #pragma onceは#ifdef~#endifによるインクル~ドガ~ドのシノニムである 2. #ifdef~#endifによるインクル~ドガ~ドは世の中で立派に機能を果たしている にもかかわらず、 3. #pragma onceの規格化の有効な解が存在しない という驚くべき結論がなぜ導かれるのやろうか…
インクルードガードを自前で書くたびに 毎度毎度ワンパターンでタイプ数だけは結構多い不毛な作業は 機械化できないかと考えるのは至極当然 むしろ何の疑問も持たないやつは適性に疑問符がつく インクルードガード用のフラグマクロの命名則にも不安がつきまとい 無名namespaceのように衝突しない保証があったらなあと思ったりもする
要するに同じファイルであるかをどうやって判定するかの問題 インクルードガードは利用者(プログラマー)に識別子を決めさせる(押し付けたとも言う)ことで実現してる なので押し付けられたプログラマーには > インクルードガード用のフラグマクロの命名則にも不安がつきまとい みたいなことが発生する #pragma onceはこの判定を処理系側でやるんだが例えばファイルの絶対パスで判断するとかファイルをインクルードする前にmd5とかのハッシュを求めて判断するとかすればいいだけ ハードリンクとかで違う名前つけて#pragma onceがうまく動かないとか言うアホとかは無視すればいいし、ハッシュの衝突が心配と言うなら衝突した時に比較するようにすればいい どういう仕様がいいのかで揉めるのはあるけど技術的な問題とか言ってる奴はちょっと知能が足りなさすぎ
>>338 #ifndef 形式のインクルードガードを自前で書くとタイプ数が多いし
識別名を打ち間違える危険もあるから .h のファイルを新規作成したときに
自動的に入力されるようにエディタのマクロにしたよ。
まぁ、識別名をファイル名から作ってるから、ファイル名の変更でアレだけど。
昔(フロッピーでやってた時代?)は #ifndef 形式でガードすると
どのみちヘッダファイルをまるごと読み込まなきゃならないから、
#pragma once の方がコンパイル時間において優れてる、などと言ったけど、
ハッシュを計算して同一か検証するとか手間が増えるなら
時間の面での優位性はなくなったのかな。
「技術的な」というときの技術は「プログラミング技術」の意味じゃないこともあるんだよ。
前置きが無い限り広すぎてあんまり意味ない。
実装がいくつもあるのに、仕様策定にあたっての言葉で出てくる「技術的な」なんだから文脈でわかれよ。
仕様に落とし込む難しさが元々の論点。
ハードリンクの話題は「同一のファイルとは何か」を定義する難しさの一例で、実装のことなんか言ってない。
このスレで既に上がっている選択肢だけでも
・ 内容が同じ
・ 絶対パスが同じ
・ #include ディレクティブ中の表現が同じ
・ inode が同じ (ハードリンクは同一とみなす)
があり、内容の一致を選択する場合以外は言語の外の世界の環境に関する記述が必要になる。
世の中にある色んな環境のことを考慮して文面にする難しさってのはわかるだろ?
そんなわけで、個人的には内容の一致だけで判定するのが (仕様として定義するにあたって) 一番簡単だと思う。
ODR に関するルールの中にも同じトークン列を要求するものがあるし。
それに加えて
>>318 で取り上げた展開手順の規則をなんとかする必要はあるが、
>>321 に解を与えるような上手い簡単な規則は思いつかないな。
既に多く書かれてしまっているコードの現状との互換性を考えると
>>322 のいうような、
#pragma once を書ける場所を制限するような規則は選択できないと思う。
結局は複雑なものにならざるを得ない。
そんなのほっといてモジュールの導入に邁進しようぜっていうのは妥当な方針だろ。
>>339 みたいに独善的なやつは標準化委員に向かないタイプだね
提起された問題を個人的に考えるのがイヤだから却下とかやってたら
みんなやる気なくすし
>>341 > 「技術的な」というときの技術は「プログラミング技術」の意味じゃないこともあるんだよ。
そういう人がいるからわざわざ「政治的」って言う言葉を入れてあるんだが理解できなかったのか?
で、あんたの言う技術的な問題ってなに?
具体的に書いてくれ
>>342 >
>>339 みたいに独善的なやつは標準化委員に向かないタイプだね
> 提起された問題を個人的に考えるのがイヤだから却下とかやってたら
意味わからん
俺が提示した内容がダメだと言うならもっといい案を提示すればいいだけ
こんなスレで独善的とか頭大丈夫?
提示してねえだろ、おまえは無視つったんだよ 嘘つくんじゃねえ
>>345 私はこの件について、技術的な問題があるとは述べてない。
その箇所の後に技術的という言葉は広範すぎて (言い換えれば、具体性がないので) 意味ないという意味のことを書いてるつもりなんだが。
それとは別に、私の考える問題を端的に言うと仕様の文面に落とし込むのは難しいねっていう、そんだけのこと。
>>348 現時点での問題点をはっきりさせることに意味はあると思いますよ…
>>346 理解できないなら絡んでくるなよ w
「アホな利用者は相手にしない(=無視する)」って言う仕様を「提示」してるって話だ、ボケ
>>350 スレチ
意味があると思うなら他にスレ立ててやれ
>>351 科学技術的な議論にアホなんて用語を使うあたりお里が知れるな
形容詞には比較基準や単位をつけろボケ
俺は
>>339 が正しいと思うぜ。
というか
>>341 は明確に間違ってるだろ。色々と。
「ハードリンクガー」なんてのは論外。規格で定めるべき事項ではない。
規格で定めるべきなのは、
・全く同一の中身だが実体が異なる場合でも #pragma once は有効か?
(cp A.h B.h の場合にも B を読み込むか?)
だ。そしてこれは当然現行のインクルードガードと同じ方向に揃えるべきであり、
・読み込んではいけない
という仕様になるのも自明だ。
絶対パスやinodeやハードリンクというのは、
・通常のファイルシステムであれば、絶対パスが同一なら同じファイルを参照する
(=同じ中身であることが保証される)
・inodeでファイルシステムが実装されているのなら、
同じinodeを指すファイル(=ハードリンク)の場合には、同じ実体を参照する
(=同じ中身であることが保証される)
であって、これらは「全く同一の中身」であることを確認する手段でしかない。
これらが有効な環境では間引くのに用いればいいだけ。勿論ハッシュを使ってもいい。
これらが別物に見えるのなら、それは抽象思考が出来ない馬鹿だからだよ。
ファイルシステム毎にC++の規格をいちいち決め直す必要があるなんて、おかしいだろ。
今後新しいファイルシステムが考案される毎に、毎回C++の規格を刷新するつもりか?
例えばWindowsでは同一ドライブに複数のドライブレターを割り当てることが出来るが、
それでどうなるかをC++の規格に定めるべきだと?マジで馬鹿だろ。
最終的に規格に定めるのはつまり、 ・全く同一の中身の場合には #pragma once は有効 (=現行のincludeガードと同様) であって、揉めるとしたら、 ・意味的には同一だがバイナリ比較では異なる場合 (例:最終行に空白や改行が追加された場合や、コメントのみの変更の場合) (=現行のincludeガードでは読み込まれないが、単純な方法では同一性の確認が難しい場合) だが、これも方向としては現行のインクルードガードと合わせる方向、つまり、 ・読み込んではいけない とされるべきであり、これもまた自明だ。 (とはいえここは実装的に揉めるかもしれんが) そもそも「同一性の確認」をファイルシステムに依存する考え方自体がおかしい。 もうじき #include 対象を url 指定するような時代にもなるだろうし。 (善し悪しはさておき、PHPではこれが出来る) そうしたら、「同一かどうかは中身で判断する」という選択肢以外はなくなる。 こんな当たり前の話が分からないのは完全に老害化してる。
そしてやる気がないのは今更意味がないからだろ。ほぼ全ての環境で実装済みだ。
> Cray C and C++ 以外では全て実装済み
>
https://en.wikipedia.org/wiki/Pragma_once 勿論糞長いパスとかにしたらはまることもあるが、これもよくある話でしかないし、ユーザ責任でいい。
規格に「パスは○○文字まで」と決めるわけにも行かんし。
> 途中でバッサリとパスが切られて、まったく同じシンボル名になって、
> 初めてincludeしたファイルなのにスキップされるという、
> なかなか原因解明が困難な不具合に襲われる……といったケースがあるかもしれません。
> ……はい、体験談です。
>
http://cpp.aquariuscode.com/include_guard 二重にインクルードすることを想定しているヘッダーファイルって、存在するものなの? pragmaとか書かなくても、勝手にやってくれたら問題あるの?
>>358 <pshpack?.h>
<poppack.h>
>>355 要旨が混乱していますね
>例えばWindowsでは同一ドライブに複数のドライブレターを割り当てることが出来る
つまり、今読み込んでいるヘッダファイルがかつて読んだファイルと同じ実体かどうか、を決める方法は**基本的にない**と主張しているのですよね
そう主張するのなら、
>・読み込んではいけない
>という仕様になるのも自明だ。
「読み込んでいいかどうか」を決める方法がないのに「読み込んではいけない」と決めていいのですか?
条件を満たすかどうかチェックする手段がないのに、その条件を仕様とするのは無意味ではないですか?
>>358 たくさん存在する。
インクルードする前後のマクロ定義によって挙動を切り替えて使うようなものもある。
基本としては宣言というか、別のコンパイル単位にある関数などのインターフェイスを取り込むために使うものなんだけど、
アクロバティックな使い方をしてるものはそれなりに多いよ。
プリプロでループを実現するには再帰includeは欠かせないからな
>>361 むしろそっちのほうに、
二重インクルード可能みたいな宣言を用意してほしいわ
>>360 マジで言ってるんなら死ね。
俺の意見は、
・#pragma once は現行のインクルードガードと同じ方向に仕様化すべき
であって、実際これで文句が出ることはないし、妥当だろ。
つかお前、
>>340 を理解してるか?
int lengthOfLcs_r(const char x[], const char y[], int ix, int iy, int xsize, int ysize) { static int **lengthTable = new int*[xsize]; for (int i = 0; i < xsize; ++i) { lengthTable[i] = new int[ysize]; } if (ix == xsize || iy == ysize) { return 0; } if (x[ix] == y[iy]) { return lengthOfLcs_r(x, y, ix + 1, iy + 1, xsize, ysize) + 1; } return max(lengthOfLcs_r(x, y, ix, iy + 1, xsize, ysize), lengthOfLcs_r(x, y, ix + 1, iy, xsize, ysize)); }
#include "/dev/tty" も知らない雑魚はもう黙ってろよ
>>365 の関数は、再帰的な関数です。
その再帰的な関数内で static な配列を利用したいのですが、動的に確保した
領域を解放するにはどうすればいいのでしょうか?
再帰的な関数なので単純に関数の最後で解放するというわけにはいかないので
困っています。
>>365 動的計画法で配列に計算結果を記録しておき利用したいんです。
なので static にしています。
>>364 わけて考えてみますね
インクルードガードはプリプロセッサ名前空間内の一つのプリプロ識別子を犠牲にして、機能させようとしているわけですよね
#progma once が犠牲にする**べき**ものは何でしょうか?
>>365 の関数はまだ書きかけなので、計算結果を記録した配列の値はまだ利用していません。
>
>>365 lengthTableのポインタ値をなんとかしてグローバル変数に持ち出してatexitに登録するか
最初からそのグローバル変数でnewするか
どうせプログラム終了時にヒープ丸ごと消えるんだから放置するか
一から書き直すかの4択
>>365 あ、すみません。
なんかおかしなことを書いてしまいました。
>>371 ありがとうございました。
すみません。質問がちょっとおかしかったので、質問を代えさせていただきます。
ある特定の関数内でしか見えないグローバル変数のような変数というのはC++にありますか?
考えているのは、関数 func でそのグローバル変数のような変数 a を宣言する。
func 内で呼び出している再帰関数 rec_func 内でのみそのグローバル変数のような
変数 a を利用したい。グローバル変数のような変数なので、 rec_func の引数として
a を渡す必要はない。
何度も呼び出される再帰関数に引数として同じ変数を渡し続けるのはなんか 無駄なことをしているように思われたので質問しました。 本を読むとグローバル変数は使うなと書いてあるので質問しました。
>>373 でいう変数 a の代わりに、クラスを作って、メンバ変数を利用すればいいですかね?
rec_func はメンバ関数にすればいいですかね?
でも、そのためだけにクラスを作るというのもなんだかな―という感じがします。
>>360 一応添削しておくと、
> 今読み込んでいるヘッダファイルがかつて読んだファイルと同じ実体かどうか、を決める方法は**基本的にない**
× 同じ実体かどうか、を決める方法は
○ 同じ実体かどうか、をパス等で決める方法は
ただし俺はそもそも「中身」を見て確認すべきで、同じ実体だったら云々、という話はしてない。
cp A.h B.h の場合にインクルードガードでBを弾くとして、
当然Bは「ファイルとしては」「読み込まれ」、「コンパイル対象としては」「読み込まれない」だろ。
#pragma once はインクルードガードの自動版なんだから、インクルードガードと同じ仕様でいいんだよ。
そして逆に、実体が異なっていてもこの場合はインクルードガードは利くのだから、#pragma once も利くべきなんだよ。
ファイルパスでの識別ではこれは実現不可能だろ。
>>369 意味不明。何も犠牲にするべき物は無いと思うが。
というかな、規格化するなら方向は自明で、
・#pragma once はインクルードガードの代わりに使われているのだから、
現行のインクルードガードを機械的に #pragma once に置き換えして問題ないように仕様化すべき
でしかないだろ。これで誰も文句ないと思うが。
>>374 の心配があるんだったらクラスにしたって裏でthis渡すようになるだけだから一緒よ
ポインタ渡すコストが気になるならグローバル変数にするしかない
>>365 のコードのままなら末尾再帰の最適化かかるだろうから問題にならんと思うけどな
クラスを作ってそのプライベートなメンバ変数を、 ある関数内でのみ利用できるグローバル変数の ような変数として使うというのは邪道でしょうか?
>>373 > ある特定の関数内でしか見えないグローバル変数のような変数というのはC++にありますか?
見た目だけの話ならラムダでキャプチャすればいい。(クロージャ)
ただ、今気づいたが、C++のラムダって名前付けられないから再帰できないね。
変数の直接呼び出しも試してみたが、以下は通らない。
auto f = [](int x) {return x? x+f(x-1) : x;};
なんでこんな糞仕様にしたんだ?
JavaScriptも当初はそうだったが、不便だったので名前が付けられるように変更した。
この変更を知ってて無視してるのなら頭おかしいし、
知らないのなら不勉強だし。(言語仕様に携わる奴は他言語の動向も見ておくべき)
名前を付けられて悪いことはないし、技術的に不可能って事も無いと思うが。
ID:4xU9Va0kM=ID:HtO+dzj70 #include "X:\sandbox\aho.h" #include "Y:\sandbox\aho.h" これでどうなるかをC++の規格に定めるべきだと言っているのはおまえだけ //X:\sandbox\some_app.cpp #include "aho.h" #include "some_lib.h" //Y:\sandbox\some_lib.h #include "aho.h" おまえq文字列の解釈をまさか知らんのか?
>>353 反論されてぐうの音もでないのかよ
5チャンは初めてか? w
同じファイル 同じ中身 大きく分けて2種類あり、 それぞれ、同じの定義の詳細は色々と考えられる
>>382 > ID:4xU9Va0kM=ID:HtO+dzj70
勝手にアホな認定するんじゃねーよ
そもそも俺はハードリンクとかのファイルシステム依存の話は処理系依存にした方がいいって思う
>>384 人を嘘つき呼ばわりして謝ることもできない奴がなに言ってるんだよ w
効いてる効いてるw 嘘つき呼ばわりじゃなく嘘つきという真実を指摘されてファビョーンかよ おまえは考察自体を放棄した この事実はどうにもならない
>>381 自己レス。
すいません出来ました。以下通ります。autoは無理のようです。
std::function<int (int)> f = [&f](int x) {return x? x+f(x-1) : x;};
>>373 見た目だけなら、上記のようにラムダで再帰すれば書ける。
またいつもの奴が暴れてるのか 相変わらず不毛な話してるな
それで結局#pragma onceが採用されてこなかった理由はなんなん?
所詮 pragma だから この部分は処理系依存が強く出るので
>>388 >>351 にまともな反論してから出直してこい w
>>393 反論とは論に対して反駁することをいう
おまえは論を示していない
結果に至る思考過程をすっ飛ばしている
おまえこそ日本語を憶えてから出直して来い
もう一度言う、反論とは論に反駁することだ
まともに反論できないことはよくわかったよ w 事実を書いてあるだけで思考過程なんて関係ない
事実ってなんだよ 「アホは切り捨てろ!」とかいう標準規格として最低最悪の解決策を取れっていうのはお前のクソみたいな「意見」だろうが お前の意見は必ず自動的に実現して事実になるの?神なの?
そういう意見を書いてあると言う「事実」な マジで理解力無さすぎ w
>>397 それは違う
何からどう演繹した結果なのかを示さねば戯れ言に等しい
戯れ言でよければ過程は伏せたままでいいぜ
どーせそんなもんバカにはねえだろうがな
>>400 じゃあ俺も、お前はここに二度と来ないでに全財産を福島と熊本に寄付した上で家族もろとも自殺するべきであると意見するわ
こういう意見を書いてあるという事実に反論できなければお前の負けな
>>401 お前が何を言っても
>>339 に書いた「無視」と言う文言を理解できなかった
>>346 がいたと言う事実は変わらない
しかも誤魔化すために話そらそうと必死な
>>353 がいた事実も変わらない
>>402 別に意見を言うのはいいんじゃね?
それに何の意味があるのか知らんけど w
C/C++の規格はgets()とかいうアホな使い方しか出来ないアホ関数を30年も削除出来なかったくらいアホに気長に付き合う規格なんだよ 広く使われ続ける規格の宿命としてその方針は変えられない だからお前の言うようなアホを無視して切り捨てるという選択肢が採用されることはないという事でこの話終わりな
>>403 もう一度言う
提示してねえだろ、おまえは無視つったんだよ
人をアホよばわりしようと焦るあまり
論議そのものを粗末に扱ったのが
おまえの運の尽きだ
そこでどんなに暴れようが
おまえは何も論じていない
よって論に反駁してもらえることもない
ましてや事実に反駁というシュールなことをする者もいない
>>405 マジで言ってるの?
gets() なんてアホには使えない関数の典型だろ
バッファーオーバーフローはプログラマーの責任
って言う言語だぞ w
>>376 言葉尻を捕まえて悪いが、クラスや関数を作ることをそう大仰に捕らえることはない。
単純な機能のクラスや関数など幾らでもある。
>>406 >>351 を読み直せ
無視するのは誰で誰を無視するのかを答えてみ
まあ恥ずかしすぎて答えられないだろうからまた明後日の話に逸らそうとするんだろうけど w
>>410 読み直して欲しいのかよ
お願いしろよ
読み直してやるかも知んねーからw
りかいできないならからんでくるなよダブリュー 「アホなりようしゃはあいてにしない(イコールむしする)」っていうしようを「ていじ」してるってはなしだ、ボケ
C/C++は池沼お断りの言語なんだから、このスレも同じノリでいいと思うぞ。 指摘しても理解できないのは、日本語が出来ない=池沼だから。 慣れる慣れない以前の問題だ。
ていうか#pragma once規格化不能論者が言い立てる不可能ケースは
(1) #ifdef~#endifインクル~ドガ~ドでも曖昧さが残り処理系依存になるケース
(2) #pragma onceで自動的にガード条件を設定する際の困難(#ifdef ~の記号をうまい具合に考え出すことに相当
(3) #ifdef~#endifインクル~ドガ~ドにおける既存のアクロバティックな使い方への対応(
>>361 (4) #pragma onceで想定されるアクロバティックな使い方の解釈(
>>321 のn種類しかない
(1)は#pragma once固有の問題ではないから、#pragma once規格化の障害とは言えない ハードリンクとかの件でここまで費やされた長い紙数はムダすぐる…
(2)と(3)は、#pragma onceが力量不足ならそのケースだけいつでも#ifdef~#endifインクル~ドガ~ドに戻ることができる プリプロセッサの基本特性まで変えようというのではないのだから…
(4)はエラーにすればよい #pragma onceの解釈を単純な#ifdef~#endifインクル~ドガ~ドの置き換えと限定するなら可能なはずや
いままで20数年にわたって規格化委員会で話題に上りながら規格化されないのは、
この件の抜本的な技術である「モジュール」の規格化が控えていると全員が錯誤していること、これにつきるだろうJK
>>416 とりあえず、
#pragma onceの仕様を文章にしてみて
そんなに簡単じゃないから
■ #pragma onceの俺様仕様 (ヘッダファイルの集合の規定) 1. インクルードされるヘッダファイルを#pragma once付きとそれ以外とする。 ただし、次のいずれかに該当する場合はエラーとする(ヘッダファイルに含めない) (1) #pragma onceがコメントを除くファイル先頭に現れた場合 (2) #pragma onceがコメントを除くファイル先頭に現れ、かつ ファイル内の#if~#endifの入れ子がファイル内で完結しない (ヘッダファイルの識別) 2. #pragma once付きのヘッダファイル同士は、ファイル名で識別する。(ディレクトリパスは無視) (ヘッダファイルの展開) 3. #pragma once付きのヘッダファイルのうち、上記2の規則により同一と判定されるファイルは 単一のコンパイルの中で、2回目以降の展開を無視する。 4. #pragma once付きでないヘッダファイルの展開は現行どおりとする。 いじょ
>>418 #pragma onceってファイル先頭に置くものだと思ってた
ファイル末尾とかにおけばいいの?
ソフトウェアが巨大化してくると、サブモジュールが各々同一のSDKを抱えてるなんてことがある。 複数のサブモジュールを読み込んでるソースコードは間接的に同一ヘッダを読み込む可能性があるが、 cvs等が異なるidを埋め込んでいたり、それぞれ微妙にバージョンが異なっていたり、エンコーディングや改行コードが異なっていたりする場合、 Includeガードならビルドできるが、pragma onceだと同一ヘッダを異なるファイルと認識してしまい、エラーになってしまったので、サブモジュールを全て自前で修正する羽目になった。 なんてことがあるかもしれない。 結局ヒューリスティックな実装しかないんでないの?
訂正; 誤: (1) #pragma onceがコメントを除くファイル先頭に現れた場合 正: (1) #pragma onceがコメントを除くファイル先頭以外に現れた場合
>>420 >>418 の仕様によるヘッダファイルの展開のどこにヒューリスティック要素があるのかkwsk、
>>418 >ファイル名で識別
過去遺産をすっぱり切り捨てる斬新な発想に目から鱗
>>423 藻前は
>>418 の仕様の項番4を理解していない
出直せ
今後ヘッダファイル名にはドメイン名を頭につけなきゃいけないね。 メアドでもいいかな?
>>417 適当な処理系の言語リファレンス見ればいいだけ
そんなに難しくはないぞ
>>422 420が提起した問題に答えろ
kwskはそれからだ
>>427 是非は置いといて、ファイル名で識別するって書いてあるじゃん
文盲なの?
つまりfooSDK/interface.hとbarSDK/interface.hは同一として判定するんだな たいへんだー
#pragma onceの前に改行があったらエラーですかwww
>>420 それ単に管理がなってないだけだろ
どのバージョンのヘッダーを読み込むかを管理できてないとか怖すぎる
>>432 どう管理しろと?
混用しているライブラリに偶然同じファイル名があって
どちらもインクルードガードされているということを
「管理」で回避できるのか?
>>432 えー、cvs keywordはどうするのー?
サブモジュールを格納してたリポジトリ毎に値が異なるよ?
自動的に改行コードを修正してくれるリポジトリの場合はー?
まずは世の中のプリプロセッサのpragma onceの仕様がどうなっているかを調べるべきかと
>>433 話の流れを理解せずに無駄に絡んでくるなよ...
インクルードガードならとりあえずビルドできるって言う話だぞ
>>434 同一のSDKなんだから同一のものを指すようにすればいいだけだろ
目的は
インクルードのループを防ぎたいのと
同じ定義を複数回行うことでエラーになるのを防ぎたい
ってことだよな
これをインテリジェントに行ってくれるのが理想
インテリジェントな物を仕様にするのは難しいし、
時代が進めばインテリジェント具合も変わる
>>418 みたいなあまりにショボい仕様だと
後々不満が出ることになる
>>437 答えになってないぞ
今 #pragma once について話しているよな
インクルードガードを #pragma once でやっていたらどうなんだ
>>429 >>434 現行のヘッダファイルでうまく行っているのならそのままでええ(
>>418 項番4はそのためにある
そうではなくて、もしも(例えば)マイクロソフトのVisual C++の#pragma onceを使って書かれた過去の遺産の尊重が大事なら
そのときは
>>418 の方の#pragma onceを#pragma once2とかに代えれば良いが
そりゃー(例えば)マイクロソフトのVisual C++の#pragma onceが先行して規格になった後の話なので今は無視
>>435 >417からの流れと考え合わせるに、
「僕ちゃんの考えた理想の#pragma onceじゃないと嫌なの!!!>418のクソ単純な仕様は正しくとも認められん!!!」ってことですかそうですか…
なお
>>431 の指摘は評価する
>>436 抽象的な言い回しで無意味に高尚な議論に見せかけている連中の方が多数派
空っぽなのに…
当然互換性の問題もある
今まで動いていたものが正しく動かなくなるのであれば支持されない
だから
>>435 も非常に重要
>>441 時間差だったかもしれんが
>>440 の最初のパラグラフ参照
存在しない規格との互換性の問題を喚かないでいただきたい、というのはあるが
回避策も示しているのだからオール無問題
>>429 の例で
2重インクルードを防ぎたい場合とそれぞれ別にインクルードしたい場合があるってのは書かなくてもわかるよな
中身が全く同じであれば防ぎたいし
全く別の定義であればそれそれぞれをインクルードしたい
>>442 #pragma onceの仕様はVisual C++しか実装してないと思ってる?
>>443 >>444 >2重インクルードを防ぎたい場合とそれぞれ別にインクルードしたい場合があるってのは書かなくてもわかるよな
ああ
>>443 の脳内にはそういう要求もあるんですねわかります
その場合は
>>418 項番4でドゾー
藻前ら
>>418 の単純さをバカにするが藻前らの論理展開のアレっぷりも相当なもんやぞ…
いずれにしろ
>>418 みたいなチープな仕様じゃ誰にも支持されない
ツッコミ殺到でボコボコなのに勝利宣言してやがるな つっこんだ人たち(ここのほぼ全員)にバレバレなのに滑稽な
>>418 ,421はミニマムの仕様を提示しただけで、つまり、
この仕様で問題ない場合は #pragma once で手抜きが出来て、
無理な場合は従来通りインクルードガード使えってことだろ。
俺はありだと思うぜ。仕様ってのはこういう割り切り方をしないと決まらない。
C++のラムダなんて後付で仕様を拡張して行っているし。(このやり方がいいとは思わないが)
ただ、この仕様だと現行の #pragma once よりも割り切っているのがイマイチで、
「今」この仕様では却下されるだろう。
「#pragma once が全くない世界」なら、とりあえずここから出発するのもありだっただろう。
現行の #pragma once は常識的に考えて、
・ファイル実体が同じ場合(ハードリンク/シンボリックリンク)は対応可能
・コピーの場合(ローカルに xxx.h を tmp_xxx.h にしてデバッグ出力を改変したり)には対応不能
だろう。だから使用条件としては、
・全ファイルがローカルファイルシステム上にあり、ヘッダファイルの改変は行わない
であり、普通に個人レベルで開発する場合はこれで全く問題ないし、妥当だ。
会社で10-20人レベルで開発する場合、どのみちルールを子細に決めることになるし、
そういう場合は従来のインクルードガードでやれ、という割り切りも妥当だよ。
なお俺が推す仕様は、 ・#pragma once のファイル内では複数定義のエラーを無視する というものだ。従って、 ・現行の#pragma once とは違い、対象ファイルは必ず「ファイルとしては」「読み込まれる」 (これは現行のインクルードガードとも同じ) ・定義されている物のシグネチャが既に存在するものと全く同一だった場合、無視する。 ・シグネチャが異なっている場合、普通に読み込む(コンパイル対象とする) (勝手にデバッグ関数を追加されていた場合、その関数だけはコンパイルされる) ・#pragma once のファイルを全部パースし終わった際、「全部重複」「全部新規」ではなかった場合、警告を出す。 (正しく使えば「全部重複」「全部新規」のどちらかになる。 改変《追加》した場合は「一部新規」となり、警告にする。「一部欠落」は検知しない。) というものだ。 この場合、要するに「読み込んで同じだったら無視」なので、 #ifdef 内等、かなりアクロバティックに使われても、問題なく、使用者の直感通りに動作する。 改行の追加、コメント変更等は全く問題ない。 ただし常に全部のファイルを読み込み、初段階のパースは行うことになるので、 現行の #pragma once やインクルードガードよりは速度は劣る。 とはいえ、今更ここが問題になる時代ではないし、問題になるようならインクルードガードを使えと割り切る。 つまり、面倒なら #include を使わずに、全部 #pragma once にも出来る、というもので、 実際これで問題無いと思うんだがな。
もう書かなくて良いよ アホだってこはみんなわかったから
インクルードのネストがn段 それぞれの段、m個のインクルードファイルからm個インクルードしてるとします 何パス必要でしょう
>(ディレクトリパスは無視) 現行の#pragma onceでこんな実装になってる処理系あるかなぁ
>>438 ,
>>446 >
>>418 みたいなあまりにショボい仕様だと
> 後々不満が出ることになる
でも具体的には指摘できない
ってか w
static変数(クラスのインスタンス)がプログラム実行時にそのメンバ関数呼び出し時にその中で、 newをすると既存のヒープ領域を破壊することはありますか? どうもこのように解釈できる現象が起きているようなのですが、調べても分からずアドバイスを頂ければ幸いです。 環境はMacのHighSierra、コンパイラはbrewから持ってきたLLVMです。
>>460 99%以上の確率であなたのバグです。
1行目の意味はよく分かりませんが。
ああすまん、何となく1行目の意味は分かった。 ・クラスインスタンスをstatic変数に入れ、そのメソッドを呼んだ 事をそう表現したのかな? だったらはっきり言ってstatic云々関係ない。 GCなんて無いから「statc変数に入れたら忘れてGCされてしまう」みたいなことはそもそも無い。 ヒープを壊しているのはユーザーです。つーか、ランタイムもないし。 ガチでコンパイラのバグだと思っているのなら、 どのみち再現コード(その場合は20行程度か)を作るしかない。 その過程で君のバグだと気づけるだろうさ。 ただこのように「下から」デバッグをするのは時間がかかるから、俺は嫌いだけど、 君がそう思うのならやるしかない。 C/C++は広く長く使われて来ている言語だから、 現在もバリバリに使われているコンパイラなら、この辺の基本的な部分にバグは無いと思うよ。 static変数に確保するのはマイナーかもしれないが、滅多にやらないってほどではないし、 そもそも上記の通り、コンパイラにとって危険のある(バグに命中する可能性のある)使い方でもない。
ふつうに、 クラスのインスタンスがstatic宣言と読んだけだ static MyClass a; スコープローカルかファイルローカルかはわからん
>>450 >>464 日本語でおk
お前は半島に帰れ
>>452 それでお前は何パスだと思うのさ?
予言してやる。お前は言えない。
なぜならお前は馬鹿であり、それがばれるのが怖いから。
ひとまず俺の一つ目の予言は的中だな。
次に行こう。
>>467 ID:aIENMcPWd
お前の日本語の間違いをすべて訂正してみろ。
2つ目の予言をする。お前は言えない。
なぜならお前はゴキブリ韓国人であり、間違いを認識できていないから。
C++でプラットフォームに依存しない音楽再生ライブラリってある?特にlinuxで使いたいんだけど。 mpg123とかいうのもみてみたんだけどプログラムに組み込むやり方が分からない
質問ですが Q1. 浮動小数点型について表現しえる最小の値(負の値のうちの絶対値が最大のやつ)を取得する 環境非依存なやり方はどうすれば良いの? -std::numeric_limits<double>::max()とか -DBL_MAX でおk? Q2. テンプレートを型引数が整数型と浮動小数点型で分けたいんですが 同じ名前のテンプレート名のまま、テンプレートの特殊化的な簡単に済ませる方法は無い?
>Q2 template <typename T, bool = std::is_floating_point<T>::value> struct hoge {}; template <typename T> struct hoge<T, true> {};
>>472 std::numeric_limits<double>::lowest()
まりがとうございます
>>473 >>475 すばらっし
>>474 言葉足らずでスマンカッタorz
具体的型名で特殊化する普通の特殊化ではfloatとdoubleのそれぞれについて特殊化した定義を与えねばならないので
>>473 みたいなやつを求めていたのです!ヽ(>∀<)ノ!!!111!1!
たまにはlong doubleも思い出してあげてください
Boost.Optionalを使う際に、
対象クラスが自分自身の有効無効を変更できるようにしようとしてみたところ、
宣言時に宣言対象を引数にとって初期化できることに気づきました。
変数の引数に変数自身を使うのは仕様的にありなのでしょうか?
https://wandbox.org/permlink/YLKYol7KdEOhpyGU CObject obj; for(i=0; i<N; i++) { obj = new CObject(); ・・・(処理)・・・ } ↑みたいにdeleteせずにnew演算子でクラスオブジェクトを割り振り続けるプログラムってお行儀悪い? CObject obj; for(i=0; i<N; i++) { obj = new CObject(); ・・・(処理)・・・ delete(obj); } ↑こういうふうにすべき? 👀 Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
今時newなんかを自分で書いてることに疑問を持ったほうがいい
手っ取り早く動かしたいその場限りのコードならそういうことをやることもある くらいかな
ポインタじゃないものにnewしたもの格納できるとでも思っているのかジャバグラマ上がりのトーシロー
deleteしてからnewすることにします・・・
>>488 こうでしたorz
CObject* obj;
>>480 C++的には
for(i=0; i<N; i++)
{
CObject obj;
・・・(処理)・・・
}
でいいんじゃね
大規模なコードで大量にオブジェクト生成するならアリだと思うけど その場合もnewしたものをdeleteするための仕組みは必須だしね 追跡できなくなる、もしくは自分で自分を破棄する仕組みも無いようではダメ
>>482 クラスのメンバ変数に他のクラスインスタンスを召喚するときとか
コンストラクタでnewしてやらないといけないと思うの
>>494 複数のプロジェクトで使いまわせる
>>495 スマポ(かコンテナ)で大体のnewは回避できる
そのケースも回避できる
>>495 別にnewしなくてもよくね?
なんかサンプル出してみ?
new無くしてやっから
>>497 class CTest { CFoo cfoo; void CTest() { cfoo = new CFoo(); } }; こんなんとかどうでしょう >>498 class CTest
{
CFoo cfoo;
void CTest(): cfoo()
{
}
};
メンバ初期化子知らんのか
ちなみに非PODならメンバ初期化子に書かなくてもデフォルトコンストラクタで初期化子される
>>499 そ、そうやって初期化したcfooはdeleteしなくてもいいんでつか?
>>504 変数の寿命を理解してないのか?
C/C++で変数の寿命を理解せずコード書くとメモリリークだらけになるから止めるか横着せず勉強するかしてくれ
>>504 何言ってんだお前は
そもそもdelete出来んだろ
教えてください
やりたい事は ↓
https://stackoverflow.com/questions/14706954/how-to-override-the-text-displayed-for-a-property-in-the-propertygrid ここに出てるようなPropertyGridで、数値配列の値を16進で表示したい
[0] 0x0001
[1] 0x0002
[2] 0x0003
....
例えば↑とか、単にこれだけ
そうとう調べまくったんだが、配列の例はみつけられなかった
配列でなければ、実装例は結構見つかるんだが・・・
一見簡単そうなんだけど、俺のレベルでは不可能
>>507 それC++の質問なの?
.NETのライブラリ(=>C++/CLI)じゃなくて?
ごめん間違えた、ここ C++のスレだった 隣で聞きます。
>>505 >>506 >>512 み、みんな、親切にありがとう・・・
>>494 一度に作る分量が減るので間違えにくい
別々の人間が手分けして作れる
>>503 そもそも>>498 はコンパイルエラー(もしくは警告)になるだろ... class CTest { CFoo* cfoo; CTest(int x){ cfoo = new CFoo(x); } ~CTest(){ delete cfoo; } void ReNew(int x){ delete cfoo; cfoo = new CFoo(x); } }; みたいな奴を想定してたのかも知らんけどこれでもunique_ptr使えば良いだけだしね どうせ
>>498 の
CFoo cfoo;
はこれまた
可能な限りスマートポインタを使え、そしてスマートポインタで駄目な場合はほとんどないってのはその通りなんだけど、 初心者が生ポインタをちゃんと理解したことのないままスマートポインタを使いこなせるとも思えぬ。 そこらへんはちゃんと分けて、今回の場合はまずは生ポインタを理解するという方向性で説明する場面じゃろ。
もうスマポはスマポとして理解させたほうがいいような気がするけどな 下手な生ポの知識は初心者に有害だ
ポインターをdeleteせずに扱う猛者がいると聞いて駆け付けてきた
delete をしない戦略ってのは無くはないよ。 アプリケーションの起動時直後にガッと大量のメモリを必要として、 終了直前に全部解放するってパターンなら、 どうせプロセスの終了と一緒にリソースは回収されるのでわざわざメモリ解放の処理を入れる必要はない。 (C++ だとデストラクタは必ずしもメモリを解放するだけではないので注意が必要だが) だけどそういう戦略をとれるのはちゃんと理解した上で問題にならないことを確信できるだけの知識があってこそだわな。 というか、それ以上に、確保したのを解放しないのは「気持ち悪い」と感じる心が C/C++er にはある。
組み込みだとそもそも終了なんてものがなかったりする
>>526 placement new の意味が今でもよくわかりません…どんなときに使うのかなあ…
char buf[MAX_BUF]; new(buf) MY_STRUCT(1, 2, 3);
char buf[sizeof(MY_STRUCT)]; new(buf) MY_STRUCT(1, 2, 3);
>>527 VRAM みたいな特殊なメモリを C++ のオブジェクトに見せかけたい場合とか
すでに確保したメモリーブロック上でコンストラクターを発動させる。
組み込みとかゲーム機のような、最初に一気に確保する環境で使うんじゃないかね といっても確保済みのメモリに対して断片化しないように管理する仕組み作ったら、必然的にnew演算子もオーバーロードするだろうから結局placement new使わんかもしれんけど
クラスを丸ごとDLL化するときにはnew系をオーバーロード しておかないと解放時にエラーになるべ。 ヒープはDLL単位にあるので集めておきたい場合はplacement使う
unique_ptrの配列版でメモリの再確保を行いたい場合どのように行うのがベターですか?
>>534 unique_ptr::reset( ) じゃねーの?
[][][] [[[ ] X_[[[ [] ][ [] ][][[[]
以下のように、派生クラスのメンバ関数で基底クラスのメンバ関数を呼ぶように
基底クラスが派生クラスに強制する方法はないでしょうか?
https://wandbox.org/permlink/K4IHMYwOsutPQz3i FAQやな インターフェースとカスタマイズポイントを分けろ struct base { void f() { //非仮想 cout << "base" << endl; this->f_custom(); } private: virtual void f_custom(){} }; struct child : base { void f_custom() override { cout << "child" << endl; } };
レスありがとうございます。 NVIというのがあるのですね。 (大昔に勉強したような…しかし思い出せず)
>>544 pure virtualなのに関数定義することなんてできたのか…
f()とbase::f()は同じ関数なんだよね?
}]] [[《_["[[]]" 〈[]》》 [][][]0,1》》〈〉 [] } } "B,V,0%%%,*1BVLO,SASA1`}}//%\\0,1\"VL"\
>>547 12行目のbase::f()はvirtualを抑止してpure virtualを呼び出す
13行目のf();は動的結合でchid::f()を呼び出す
baseは抽象クラスでnew base{}できないので
13行目の動的結合がbase::f()を呼び出すということは起こりえない
だからif(typeid(*this) != typeid(base))のようなチェックをしていない
ちょっと根本的な質問を。 C#が既に普及しているなかあえてC++に固執する理由ってある?
MSのOSしか使わないなんちゃてPGならC#で十分じゃないの
mono/Xamarinはしんどいと言う事を知らない世界の内はいいんじゃない? 大体Win限定だとしても高速化するのにC++で書いたのをdllimportするだろう
ざまりんが苦しい人は信仰が足りないのです 僕は信仰の自由を主張しますけどね
>>551 余計な依存関係をかかえないのが嬉しいです
Boostとか使ってると余計な依存関係をかかえてしまうけどな C言語が一番
一番多くの環境で使えるのはC言語 RAMが数十バイトしかないような非常にチープな8bitマイコンでも使える
数十バイトだとスタック領域ももパンクしそう、厳しいのではないか?
知らないで盛ってると言うのはどうかと 昔6ピンpicでc使ってたけどRAMは16バイトだった気がする
調べたら勘違いで自分の持ってたのはSRAM64バイトのpicだった
PIC12F609とかでもプログラム領域は1Kwあるけど 数十バイトしかない奴の型番教えてくれくれ
PIC10F200はRAMが16バイトですね 制約は当然ありますがC言語で開発出来ます
C++どころかCすらやってはいけないレベルだな 恥ずかしいやつ
>>562 ROMとRAMの区別がつかない人がなんでこのスレにいるのか?
ハーバードアーキテクチャのデータメモリサイズだけ書くの 卑怯だと思うの。プログラムメモリは256ワードあるじゃん
>>557 を受けての話だから
そのチープなマイコンで開発にCが使えてる
>>551 競技プログラミングとかunity覚えるの面倒とか?
>>566 RAMってしっかり書いてるじゃん
チープなマイコンだとROM/RAMに別れてるのが普通だよアーキテクチャー関係無しに
スタックの話だよね スタックはRAMであることが絶対条件なので ROMがどんだけあろうが関係ない
C# と C++ は世の中でどちらのほうが使われているのでしょうか? いま、 C++ の本(ロベール)を読んでいますが、無駄ですか? 柴田望洋訳の分厚い本も買ってしまいました。
>>574 ありがとうございます。
結局、どのプログラミング言語を習得するのがおすすめでしょうか?
Python のような言語は除いて。
>>576 趣味でアルゴリズムとデータ構造を勉強しています。
プログラミングコンテストの問題(Aizu Online Judge)を解いたりもしています。
もし、プログラマーになるとした場合、もっとも必要とされる言語を使って、
アルゴリズムとデータ構造の勉強をすれば効率的かなと考えています。
セジウィックとウエインの本や講義動画を読んだり見たりするときには、
Javaの入門書を見たりしています。
>>576 コンピューターサイエンスを広く学ぶ上で一番適した言語がいいかなとも考えています。
C++のスレで言うのもどうかとは思うが、 初心者が覚えるのに相応しい言語はJavaじゃないかなと思う アルゴリズムだけを学びたいなら、C言語が良いかもしれない 他の人の意見も聞いてね
>>577 そういうのがやりたくて、しかも今 C で片言がしゃべれるのなら、そのまま進めるのが一番いい
>>579 >>580 参考になりました。
ありがとうございました。
>>578 アセンブラかVerilog/VHDLあたりじゃね?
今の伝統的言語はユニプロセッサに源流があって
直列一辺倒の弱点が浮き彫りになっている昨今
【広く】学ぶうえでは却って足かせになるぞ
Cはアルゴリズム勉強にはあまり向いてないと思う 以前各言語向けのアルゴリズム辞典みたいのを見比べてみたけど Cのだけ異質な感じ forのカウントいじってあったりして勉強しにくい 少なくともオブジェクト指向入れた言語じゃないと後で生かしにくい
オブジェクト指向が導入されているべきかどうかというよりも、単純に C は抽象化の能力が低いんだよ。 下層レイヤを上手く隠せないから段階的に積み上げていくというのがやり難い。 学習段階では上から下まで見えているって方が分かりやすいということはあるかもしれないので、 どちらが良いかというのは考え方とか好みにもよるので一概には言えないと思う。
アルゴリズムの仕組みが言語の内部に隠されると理解を妨げるだろう オブジェクト指向については、別の機会に学べば良い
そうとも言えない。
複雑なものを理解するには「分解する」は基本的なアプローチのひとつで、レイヤを切り分けるのは有用だよ。
それが
>>585 に書いた「段階的に積み上げていく」の意図ね。
かといってそれで全体像が見通しにくくなってもそれはそれでアレだし、何がベストかなんて言えないよ。
やりやすいと思った方でやるしかしょうがないんじゃね。
C言語で書かれたアルゴリズムが読み解けるようでないと 後で困るだろう
C以外だとリストのシャッフルはshuffleだけで済ませられる Cだとshuffleの中身を書かないといけない C以外だと「Combination()を使おう」 Cだと「Combination()を実装しよう」 くらいの差がある アルゴリズムがどこまで指すのか分らないが、楽しいことから先にやればいいんじゃねえの、ということで、C以外から
アルゴリズムを学習するって、その実装の中身を理解することだろう
個人的には、各種ソートや基本的なデータ構造の操作を自前で書くようなシンプルなところから入った方が分かりやすいかと思うけど、まあ人それぞれかなと。
みなさん、ありがとうございます。 セジウィックとウエインのアルゴリズムの本に載っているのは、おそらく ジェネリクスを使っているので一般性もあって、かつ効率もいいプログラム だと思います。 ライブラリのようなクオリティーでプログラムを作るというのが理想です。
アルゴリズムの本というと C 言語でプログラムが書かれた本が多いですが、 やっと C++ で書かれた日本語の本が最近出版されましたね。 セジウィックとウエインの本よりももっと初歩的な本のようですが。 データ構造とアルゴリズム (電子情報通信レクチャーシリーズ B-8) 単行本 ? 2018/2/1 岩沼 宏治 (著), 美濃 英俊 (著), 鍋島 英知 (著),
アルゴリズムの抽象的な部分(オーダーとか適用するデータ構造の再帰性や対応関係)を学ぶならCよりML系の方が向いてるは向いてると思う ただ環境構築なんかの障壁もあるだろうし最終的にCは触るだろうけどアルゴリズム以外の所で詰まりにくいという意味でC#を推してみる
>>594 勿論F#でもいいし理想はそうだが好みというかネットの情報量の多さ的にC#を挙げた
C#はLinqが便利すぎてお勉強用としてはどうなんだろうなぁ 何やるかによるけど
ああ勘違いしていた
アルゴリズムを勉強したいのではなく
>>もし、プログラマーになるとした場合、もっとも必要とされる言語を使って、
>>アルゴリズムとデータ構造の勉強をすれば効率的かなと考えています。
なのね
であれば
>>573 氏が現役バリバリな時の主流の言語なんて今からじゃ予想つかないだろうし、実務なら最も適した言語が使われるだけだからC++をそのままやり続ければいいと思う
コンピュータサイエンス自体死ぬほど広範囲な学問で、実務のプログラミングとの間にもやっぱり開きがあって万能な言語なんて無いよ
敢えて言うなら物理と数学、これだけは裏切らない
>>585 そこがいいんだよ
隠蔽されたことを忘れたフリをし
本当は忘れていないということの練習に向いている
忘れたフリが綺麗なコードの練習
本当は忘れていないことが性能評価につながる
両立した技能の練習に向いているということだ
>>571 >>572 そもそもROMの反語はRAMじゃねぇし(SAMってのもある)
SHARCだとDMのサイズは0でも、PMさえあれば動く
で、PMの事隠してマウンティングすればお前らは受け入れるのか?
今はどうか知らないけどcは標準でvectorやlistやmapがないから そこから始めないといけないのでめんどくさい アルゴリズム辞典見たら配列をdefineされたNやMで確保してた ライブラリとして使う気ゼロ
>>600 世の中のほとんどのチープなワンチップマイコンはROM/RAM構成なんだよ
世の中を知ってたら
>>557 に対して
>>566 なんて考えは出ないはずだ
>>601 Cはチープな環境やOS関連で使われるくらいだからなあ
コストのデカイlistやmapなんて無くて当然
必要になったら必要最低限の機能で自力で作る世界
>>603 コスト云々よりジェネリクスが無いから汎用コンテナを作るのが難しい
数十バイトしかないなら、普通アセンブラで書くだろう
>>605 別に難しくない
標準化されてないから広まってないだけで
作ってる人はいっぱいいる
>>600 だから何?
いいよ、じゃあSAMもありにしようや
で、スタックの量がCに適するのか適さないのか
おまえさんなりの考えを言ってみな
>>611 普通にvoidポインタに置き換えるだけだが。
何が難しいの?
初期の JAVA もコンテナを使うときにキャストが必須ってアレな仕様だったよな。
昔は仕様がダメで段々改良されていくということがありますが、 それはなぜなのでしょうか? その当時はハードウェアの性能上そういう仕様にせざるを得なかったというような 理由があるのでしょうか? それとも単に思慮が足りなかったというだけでしょうか?
>>615 知見が足りなかったというのが最大の理由だと思うけど、
せざるを得なかった場面よりもその程度で充分だったという方が多いと思う。
仕様が固まらないうちに作る時は、それなりの暫定仕様か何らかの制限事項を設けて開発したな
知見が足りなかったなんてのは少数派と思う シンプルな仕様からだんだんと機能追加で肥大化の方向 ってのがほとんど
>>619 C89 からの「関数の引数として構造体が(実体渡しとして)OK」というのは、私には堕落以外のなにものでもないと
昔のC++にあった(今もある)糞の山は、今のモダンな他言語たちへの反面教師として大いに役立った
>>613 メモリぶっ壊しやすくなるのは十分問題だと思うが
ライブラリ利用者側の責任で何とかしろってのはリソースの条件が厳しけりゃしょうがないがさもなくば正当化しかねる
独習C++は一通り読んだんだが次に読む本ある?問題集みたいなのとか
>>624 私がお勧めしているのは
https://www.amazon.co.jp/dp/4894714221/ https://www.amazon.co.jp/dp/4881357786/ 前者は実は難があって、変てこな実装をしている部分もありますが、それを自分で調べて解決すれば、強くなれると思います
後者は STL の解説本です
いずれも C++11 以前で今となっては古いのですが、代わりになるような本がない…
両方とも私は読んでいますので、普通の質問には答えることができます
どの言語でも、入門書の次は、Effective 何々
>>625 「なぜ」そうするのか
「なぜ」そうなっているのか
他にどんな選択があったのか
という思考回路の俺には合わない本だ
>>623 それは低級言語に求める物じゃない
C/C++は低級言語として数十年間圧倒的なシェアであり続けている
これってすごいことだと思う
>>623 データ構造の要素が静的に型が決まろうがそうでなかろうが、必要な要素数のメモリを確保する作業に違いはない。
せいぜい型のサイズを余計に掛け算するくらいだ。
確保するサイズが間違っていれば静的に型が決まろうがメモリ破壊は起きる。
もう少し具体的に示してくれないか?
静的な型の恩恵がどうたらって mallocがvoid*を返すのと同じだろ 問題ちゃ問題だがそんなもん怖がるやつぁC使いに向かない
>>629 静的なら実行時パフォーマンスには影響しない
>>630 「既に壊しうるのだからちょっとくらい壊せる場所増やしてもいいでしょ」には無条件では同意しかねる
>>631 向いていようがいまいがCの案件はあるわけで, 可能な限り安全にコーディングしたいと思うのは可笑しいか?
で話を戻すと, 汎用コンテナのCでの実装には, 大きく分けてもdefine使った型安全な実装とvoid *を使ったオーバーヘッドあり型安全なし実装が考えられるわけで, まずそれだけでこうして対立し得る
実装上でもいずれもpros/consがあるわけで, そりゃ規格がまとまる道理がないよね, って主張
別に必要最小限の機能で自分で実装することを否定するわけじゃないし, 型安全が絶対だという気もない
高速コンパクトと安全性利便性は相反するものだ 諦めろ
>>627 独習の次に Effective C++/Effective Modern C++ は飛躍しすぎではないかな?
ついてこれるのか
>>632 > void *を使ったオーバーヘッドあり
とは何?サイズ管理+アドレスの計算のこと?
だったらC++の汎用コンテナでも同じ事を内部でやっているし、オーバーヘッドはないが。
見た目でしか分からない人はCに向いていないぞ。
というか、型安全が欲しければC++を、
そんなん要らんから小さくて早いコードを、というのならCを、ってだけだろ。
その分自分で管理する項目が増えるだけの話で。
選択肢はユーザー側に与えられているのだから、それ以上は要らんだろ。
>>632 できねえこと言ったってしゃーないだろ
Cにはテンプレートがない
諦めるしかない
とりあえずスクリプト言語やC#で書く→速くしたい所をC++で書く→もっと速くしたい所をCやasmで書く これが正解 どれかにこだわって対立させて排他するのはアホ
>>638 同意。
若い奴が統一言語「○○だけ勉強すれば全ておk」を求めるのは自然だが、
そうなっていないのは理由があって、つまりは手抜きと実行効率(速度)の兼ね合いだ。
一時期Cが統一言語だったが、それは他言語がゴミだったから(対抗馬がLisp)であって、
C++で再統一されることはないよ。特に今のC++では。
オーバーヘッドについては撤回
>>636-639 だから基本的にそういう役割分担について否定しているわけじゃない
Cで汎用コンテナが標準化されることはないだろうっていうのが元々の主張
>>638 Cで書けることは基本C++で書ける
C++で最適化出来ない所はCでも無理
アセンブラしかない
>>636 CやC++に関わらず専用なコードは汎用に比べて高速コンパクトに出来る事がある
つまり、
void*で作って全てのコンテナサイズ(型)同一コードよりも型ごとにコードを作る方が速いことがある
C++のコンテナは全て専用コードなので
コードの肥大化と引き換えに微妙に速いかもしれない
コードの肥大化によってキャッシュミスして遅い可能性もあるけど
>>638 > 速くしたい所をC++で書く→もっと速くしたい所をCやasmで書く
asmはいいとしてC++→Cでもっと速くなるケースなんてあるのか?
>>632 >すでに壊してるのだから
一体どこからそんな主張を読み取ったんだ?
勝手に人の主張を捏造せずに、ちゃんと質問に答えてくれないか?
あと、void*使わなくても、生成時に型サイズを受け取る方法もある。
汎用コンテナ作るのにdefineで型定義なんてするわけないだろう。
>>642 qsortやbsearchとかそうだよな
C++のsortやbinary_searchには絶対に敵わない
>>644 FF外から失礼します
「すでに壊してるのだから」とはどこにも書いてないと思うのですが
なぜあなたこそ勝手に人の主張を捏造しているのでしょうか?
FF外から失礼しました
>>646 面倒なやつだな。
「既に壊しうるのだから」
これでいいか?
汎用バイナリ < 汎用コード専用バイナリ < 専用コード 速度的にはこう 速度が非常に重要であれば CだろうがC++だろうが専用コードを書くのが一番
>>643 間接参照を抜ける場合とかだろ。
逆にCよりもC++の方が速くなるコードの方があり得ないと思うが。
実際にC++はCより遅いってのは事実だし。
>>645 お前が値配列と参照配列の区別が付いてないだけだろ。
>>653 アンカーミスったか?
qsortとstd::sortはどちらも値であろうが参照(ポインタ)であろうが使えるぞ
>>653 > 間接参照を抜ける場合とかだろ。
それC++のまま書き換えればいいだけ
> 逆にCよりもC++の方が速くなるコードの方があり得ないと思うが。
そんな主張はしてない
> 実際にC++はCより遅いってのは事実だし。
だからどんなケースなんだよ
STLとか使いまくって遅いとかなら使わないように書き換えればいいだけだろ
厳密に言うと C11の可変長配列はC++には無い C++では例外処理を実現するために関数コールに微妙なオーバーヘッドがある場合がある って感じでCの方が有利な事がある どちらもガシガシに最適化した場合の話
x86-32 例外処理を有効にすると 関数コールに微妙なオーバーヘッドが加わる x86-64 例外処理の為のオーバーヘッドは無い その代わり例外発生時の処理は非常に遅い Cの可変長配列のような、スタックに可変長サイズを確保する手段はC++には無い 当然ダイナミックなメモリアロケートよりはスタックに確保した方が速い ただし実際にはあまり使われていないと思われる
>>654 ミスってないぞ。
>>656 Cの場合は抽象化してくれないんだから、関数を直接呼ぶしかないんだよ。
だから動的解決をしている場合はC++の方が遅く、静的解決の場合は同速になる。
CのほうがC++より遅いケース出してみろ。ないから。
C++は機能的にはCをラップしてるんだよ。
例外とか、クラスの動的解決とか、スマポ(キリッとか。その分管理が楽だが、速度は遅くなる。
Cの場合はC++のラッパ抜きで直接呼ぶことになるから、その分速い。それだけ。
>>658 > x86-64
> 例外処理の為のオーバーヘッドは無い
> その代わり例外発生時の処理は非常に遅い
これマジ?
煽りじゃなくて仕組みを知りたいから、キーワードかURLくれ。
こちらでググって確認する。
自分でディスアセンブルしたり バイナリ比較したり実測してわかったことで 仕組みがまとめて書いてあるような所は知らない
>>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の実装になる。(コンパイラの都合だが)
C/C++で基本同じ結果となるコードが書ける 同じ結果となるコードを書けば結果は同じ ってだけで 当然違う結果となるコードを比べれば違う結果になる 当たり前
>>661 ちなみに計測したときのOSは何?
なおその兆候が正しいなら、x64の場合はハードウェアで対応していることになる。
クラス関数はthisを第一パラメータとして渡してるだけで、これは構造体でも同じことが出来る virtual関数は関数ポインタテーブルへのポインタを持ってるだけ 同じことは当然Cの構造体でも出来る テンプレートは型ごとにコードを書くのと同じ
>>663 だから、いわゆるC++の機能を使ったら、管理が楽になる分だけ遅くなる、というだけ。
C++の機能を全く使わないコードはCと言うんだよ。
だから、C++はCより常に遅い。それだけ。
>>664 そういえば、
例外発生時のスタックにあるリターンアドレスを検索するとかどこかでみたような
どこかに仕組みが書いてあった気がしてきた
>>665 > virtual関数は関数ポインタテーブルへのポインタを持ってるだけ
> 同じことは当然Cの構造体でも出来る
Cでやる場合は、関数ポインタを引数で渡すことも出来るんだよ。
(勿論C++でも出来るが、クラスを使う意味が無くなるから普通はやらない)
この場合、間接参照が抜ける分だけ速くなる。
(実際はメモリアクセス1個よりはキャッシュを壊すことの影響の方が大きいとは思うが)
C++独自の機能を使うとCより常に遅い? それは嘘だな
>>669 C++にだけ独自の縛りを設けてCのが速い?
強引に主張を通したいのはわかるが
そろそろ痛いぞおまえ
>>667 それはスタックウォークという、従来の例外実装方法だ。
君の場合なら、x86がそれになってる。
>>670 ならC++の機能を使って、Cよりも速くなるケースを挙げてみろ。
ないから。
もとは
>>638 だ
C++で最適化に行き詰まった時に
わざわざコンパイラをCに変えて最適化する事なんてないから
Cっぽい記述とかアセンブラっぽい記述とかなら
そりゃいくらでも
>>672 前半
自分で調べろ
>>672 後半
ええと、...
「C++独自の機能を使うとCより常に遅い」
の否定はわかるかな?
>>658 って単に32bitプログラムを64bit CPUで走らせてオーバーヘッドがーって言ってるんじゃね?
>>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++ということだったのか。
なら話は噛み合わないさ。
#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] }
#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] ・・・あれ? 何だこりゃ }
>>657-658 そういやスタックにとる可変長配列はC++にないんだな
まあメジャーな環境でalloca( )使えないものはないと思うが
例外は使わないようにすればいいだけかと
>>678 一応、基本的確認をするが…データは同じなんだよな?
俺の予測では同速。多分そちらの期待も同じだと思うが。
>>676 > ・その他、関数ポインタ等、Cコンパイラでも通る機能のみで書かれたコードを、Cのコードという。
可変長配列とか使ってないならC++のコードでもある
つまりC++の範疇で書き直してるだけ
って言うのが大方の人の解釈だと思うが
>>676 それは単なる君の定義
100歩譲っても5chで一般的なだけ
普通C言語, C++と言えば、
その規格や規格に準拠したコードを表す
>>681 それは君の勘違いだね。
その定義ならC/C++を区別する理由がないし、多分LinuxもC++になってしまうだろ。
>>676 たとえばヘッダファイルなんか、同一のファイルを
Cコンパイラに入力したり
C++コンパイラに入力したり
ってこともあるよな
内容には無関係で単に
Cコンパイラに入力したらCのコードで
C++コンパイラに入力したらC++のコードだろ
最適化の内容だってrestrictのように
CとC++で違ってくる可能性はあるしな
>>682 最適化の掛け忘れでは?
Cの方はほぼ最適コードだが、(メモリアクセス減らして一時変数に取れとかその程度)
C++の方は最適化無しだとトンデモコードが出てくるが、
最適化でそれを消すからおkというノリだったと思ったぞ。
最適化無し同士の比較は意味がない。最大最適化同士の比較やってみそ。
使うモジュールの差を言語で言うから話が紛れる で、 君の定義であるごく一般的な記述を行った場合の話であれば C++の方が速いこともあるしCの方が速いこともある C++はテンプレートによって専用のコードをたくさん作る 当然汎用バイナリよりも専用バイナリの方が最適化がかかりやすいし、 変数よりも即値の方が速いことも多い C++例外処理も有効で、 これによって処理が速くなる場合がある
>>686 gcc unko.c -O3でやってる
>>685 > 内容には無関係で単に
Linus全否定かよ。
>>682 オールゼロでクイックソート?
それは...
>>687 > 君の定義であるごく一般的な記述を行った場合の話であれば
> C++の方が速いこともあるしCの方が速いこともある
ねーよ。
実例挙げてみ?
それって単なるコンパイラの適性であって、コード自体の速度ではないだろ。
C++とCの本質的な速度差ってのは絶対にひっくり返らないものであって、
例えば、スマポを使っている限り参照ポインタを管理する分だけ遅くなる、というもの。
コンパイラがどう進化しても、「0」「ADDまたはDEC命令」の差はひっくり返らないんだよ。
> C++例外処理も有効で、
> これによって処理が速くなる場合がある
ねーよ。Cは最初から全部noexceptだ。
ソートって メモリサイズ 比較コスト コピーコスト キャッシュサイズ ... こんなんで結果(時間)が大きく異なるんだよね クイックソートだと データの並び順でもたまたま選んだピボット値でも変わる 1個の場合を比較してもあまり意味が無いぞ
clでやってみたら期待どおりの結果になった
>>677 1.789[sec]
>>678 0.623[sec]
最適化は/Ox
>>690 ああ、それは確かに
テストデータをまじめに作るか。。。
>>688 となるとアセンブラを確認するしかないね。
(いいサイトはあったはずだが、普段使わんから忘れた)
>>693 それさ、以下の3条件でやってみ。
1) Cのコード(677)を、Cコンパイラ
2) Cのコード(677)を、C++コンパイラ ←追加
3) C++のコー(678)を、C++コンパイラ
Cコンパイラってポインタ周りは最適化をかけないから、多分、
速度差はコンパイラ起因であって、コード起因では無いと思う。
>>696 > (b) 自分が書いているのは実はCだと気がついていないC++バカ
>
https://cpplover.blogspot.jp/2013/05/linus-torvalsc.html 君の定義が正しければ、上記(b)の定義が出来なくなるだろ。
>>691 C++が遅くなる例だけあげてC++が遅いって言ってもねえ
C++が速い例
double p = 1.;
int n;
for (n = 1 ; ; n++){
p *= n;
}
C++だと例外処理をつかって、いつオーバーフローするかわかるんだけど
例外を使わないとどういうコードになるかねえ?
---
Cで普通に汎用vectorを作るとすると
普通は汎用バイナリで作ることになるんで
関数ポインタを経由する事になっちゃうけど
C++のテンプレートだとだとそれぞれ専用なんで
関数コールが速いよね
アドレス計算も即値の乗算だから色々なテクニックが使える
>>699 > C++が速い例
Java出身か?死ね
C++だとコンテナを使ってまともなソートを簡単に書けるけど Cだと面倒だからバカソート ってのも普通にある 要素数が少なければ意図的にやったりもする 一般的なコードではCの方が速い事の方が多い ってくらいの主張にしとけば良いものを 強い主張をしちゃうから
>>701 ん?
良くわからんが負け宣言てことでいいのかな?
>>684 何を言ってるのか意味不明すぎる
よほど感覚が独自なんだろうな w
>>699 おっとすまん、ポインタアクセスでのメモリオーバーフローと勘違いしてた。
doubleの無限大の例外って事?
俺はそっちには詳しくないが、浮動小数点例外をソフトウェアで検出するのなら同じだし、
ハードウェアでの検出なら割り込みがかかるだけで、速度的にはこれまた同じだが。
vectorについては完全に君の勘違いだぞ。
Cではそれぞれ専用の物を作るのが基本であり、それを一つにかけるようにしたのがテンプレートだ。
多分、理解の仕方が逆だ。
>>699 > Cで普通に汎用vectorを作るとすると
> 普通は汎用バイナリで作ることになるんで
速度云々議論してるところでそんなことする奴はバカって言われてもしょうがないと思う
>>705 > ハードウェアでの検出なら割り込みがかかるだけで、速度的にはこれまた同じだが。
Cだと言語の範疇ではその割り込みを処理できない
なのでif文とかでオーバーフローするのを検出するとかが必要
って話だろ
>>707 > if文とかでオーバーフローするのを検出するとかが必要
ほう。ならそのコードを書いてみ。
そしたらそのコードの中でオーバーフローするから無限ループだね。
そんな言語が実用だったとでも?
>>705 例外については「お前は頭が悪すぎて会話にならん」とだけ
コンテナは
「C++の方が遅い例だけ扱って、速い例は自分の想定と違う」
という主張を続けるならお前と会話しても無意味だ
IDが変わってしまった まあそんな事はどうでもいいか
ちなみに速度比較についてはいろんな人が様々やってるけど、
俺的にまあ公平だと思えるのはこれだね。俺の体感ともだいたい一致する。
おれはC++は1.1-1.3位かと思っているけど。
> C 1.00
> C++ 1.56
> Java 1.89
> C# 3.14
>
>
https://jaxenter.com/energy-efficient-programming-languages-137264.html C++の機能をバリバリに使ったら、そりゃJavaと大して変わらんだろ、ということになるし。
スマポってのは良くできたGCとコストはほぼ同じだし。(GCは全自動なだけ)
Javaは以前は3程度だったが、ゴリゴリチューニングしてきているらしい。
>>706 速度優先のコード前提ってことなら
保護されまくった高機能汎用コンテナを使うこと自体アホってことになるねえ
さらに条件を加えちゃってもう
>>708 なんで喧嘩腰なのかがよくわからないけど、
C言語では「n <= DBL_MAX」というif文が必要ってことだろ?
double p = 1.;
int n;
for (n = 1 ; n < DBL_MAX; n++){
p *= n;
}
>>714 いやオーバーフローするのは p だろ。
と思ったが、もしかして n の方なのか?
>>716 通じたようで何より。
だからオーバーフローの検出はソフトウェアでは辛くて、通常はハードウェアのはずだ。
そしてその場合は割り込みとなり、Cの場合は割り込みハンドラにコードを書くことになる。
C++の場合は『そこから例外処理ルーチンまで引っ張ってきてくれるコード』をコンパイラが用意し、
ユーザーのcatchコードを実行する。つまり、上記『』内コードでラップされてる分だけ遅い。
(実際にはラップだけではなくスタックウォークも行うから相当遅いはずだが)
なんだが、実際俺はゼロ割例外しか見てないからオーバーフローについてはよくは知らん。
ハードウェア的には上記の動作になる。
一般的にはオーバーフロー例外は出ない環境(無限大に貼り付けるだけ)で使うのではないかと。
Cではアホみたいにゼロ割チェックやってるよ。
これはC++でも同じだと思うが、C++erはやらないのが作法なのか?
とはいえ、ゼロ割はCMP+Brachであり、通常は分岐しないから、x86ではほぼゼロコストだ。
割り込みは関数呼び出し自体が遅くなるから、結局これもCの方が速いはずだが。
>>712 お前話の流れが読めてないだろ w
>>638 から読み直せ、バカ
overflowてexception吐くんだっけか
>>708 バカはこれだから w
isfinite( ) マクロとかも知らんのかよ
>>717 オーバーフローで例外や割り込みが起動することはないのでは?
普通、無符号ならキャリー、符号有りならオーバーフローのどっちかのフラグで判定するかと
unsigned long long array[100000000]; ↑ ここに同じファイルから乱数を読み込んで比較してみた clのオプションは /Ox /arch:AVX gccのオプションは -O3 -mtune=sandybridge qsort cl 27.171[sec] gcc 26.139[sec] std::sort
途中で書き込まれてしまった 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 未実装
>>698 そこの2通目に箇条書きしてある部分は
1992年当時に俺が思っていたことに近い
・例外がクソ
うん、マジクソだ
C++11以後マシになったが下痢が治ったという程度
・newいらねー
演算子newを初めて聞いた瞬間、
mallocの設計理念が大声でわめき立てた
C++11以後ブーイングが更にエスカレートした
・キーワードclassいらねー
禿自身が認めやがった
・・・しかし、それがなぜ
>>685 への反駁に引用されるのかがわからん
>>721 大抵のプロセッサの浮動小数点ユニットにはオーバーフローしたら例外を発生させる機能がある
それを有効にしてるかどうかは環境による
あとC言語の話で割込ハンドラーとか言ってる
>>717 は単なる知ったかなのでスルーした方がいい
>>726 >大抵のプロセッサの浮動小数点ユニットには
「浮動小数点ユニット」なんですね、ここで確認しておきます。
>オーバーフローしたら例外を発生させる
演算結果が ±inf になることを「オーバーフロー」と言うのですか?ちょっと耳慣れないですね
>>726 >C言語の話で割込ハンドラー
lsi-c ver3, MS-C ver6 あたりでは、そういうのもあったと記憶してます、 matherr() ですね
だから
>>717 はあながち間違いとはいいきれない面もあります
>>725 世間では「どちらのコンパイラを使うか」ではなく、
「どちらのスタイルで書いているか」でCとC++を区別してるんだよ。
>>727 > 演算結果が ±inf になることを「オーバーフロー」と言うのですか?ちょっと耳慣れないですね
それ反対、オーバーフローしたら結果をinfにしてるだけ
>>729 inf も NaN も浮動小数点表現の中にあるので「オーバーフロー」と呼びにくい、と思っています、まあ人それぞれ
>>730 だから誰もinfがオーバーフローとは言ってないだろ
オーバーフローしたらそれっぽい値としてinfを入れてるだけ
>>728 それなら
Cスタイル、C++スタイル
と言えば良い
CかC++かは当然コンパイラで決まる
C++は元々上位互換を目標に作られた物だ
>>732 > C++は元々上位互換を目標に作られた物だ
そうだ。そしてだからこそ、スタイルで区別されるんだよ。
元々C++はCの完全上位互換だった。
だから君らの定義なら、C++が登場したときから全てのCは消滅し、C++になっているはずだろ。
実際はそうじゃない。
「○○のコードはCで書かれています」
「○○のコードはC++で書かれています」というのは、
世間では俺の言った定義(
>>676 )で使われてる。
その後、CとC++が仕様的に分離してしまったから、
今現在はCコンパイラで通るコードがC++コンパイラで通らないケースが存在する。
だから今は明確に「どちらのコンパイラを使うか」を想定しておく必要があるが、
それもコーナーケースで、
大半の「Cのコード」はC++コンパイラでもそのまま通る。
お前らがC++信者でC++の範囲を広く取りたいのは分かるが、世間はそうじゃない。
C++がCの仕様を全て取り込んだら、
お前らにとってはCは消滅、全てはC++になり、お前らは幸せになれるだろうさ。
ただ、その後も世間はCとC++を引き続き区別するだろうよ。
お前用語の定義の説明とかどうでもいい スタイルの意味ならスタイルと書け
>>734 それは嘘だなぁ
extern "C"が無いとCライクに見えるオブジェクトを吐かない事が常となっているC++(コンパイラ)について、いくらpure Cライクなコードを書いてもpure Cでないextern "C"を書かないとCライクに見えるオブジェクトは吐けないってそれはもうC++でしょう
他の内容にも誤りがあって君の世間ではCライクなコードであればCで書いたと宣言していいらしいけど、少しでも世間のOSSのコードを見て回れば良いよ
Cで書かれているのはCだから
お前らが誤解したままでいるのはお前らの自由だが、 お前らの定義だと、CとObjective-Cを区別できないだろ。 あれはCの完全上位互換で、Cコードそのまま食えるらしいからね。 お前らも少し考えれば自分で矛盾に気づけるはずだが。
>>734 それは言い過ぎでしょ。
流石にそれは、世間を知らなすぎ、と言われても仕方ない意見にみえてきたなあ。。。
ならもうちょっと分かりやすい説明をしてやる。
>>677-678 について、お前らの定義では『コード』について議論できないだろ。
俺の定義では、677は「Cのコード」で、678は「C++のコード」だ。コンパイラに依らない。
お前らの定義では、678は明確に「C++のコード」だが、677については、
「Cコンパイラを通した場合、677はCのコード」
「C++コンパイラを通した場合、677はC++のコード」
になってしまうだろ。
それだと、CとC++の『コード』の速度比較自体が定義できないだろ。
677をCコンパイラを通した場合とC++コンパイラを通した場合の速度差は、
「コードの差」ではなく、「コンパイラの差」なんだよ。
当たり前だろ。
というか、C++erもここまでレベルが落ちたのか。世も末だな。
std::filesystemで片方のスレッドでファイルを出力し もう片方のスレッドでファイルが存在していたら読み込むというプログラムを書いた場合 出力中に存在すると判定されて読み込んでしまいそうですが、 そんなことないでしょうか? もし読み込んでしまう場合、自力でフラグ管理かMutexを使うなどして 判定する以外の方法はあるでしょうか?
>>739 お前が考えた定義とかどうでも良いって言ってるの
というか何でお前らそんなに必死なんだ?
俺の言ってる定義が世間一般の定義だよ。
そうじゃなきゃ『コード』の善し悪しの議論が出来ないだろ。自明だと思うが。
繰り返すが、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++以上に上手く行ってる。
お前の定義じゃないと議論が出来ないのは おまえがアホだから
面白くていいじゃないですかぁ… ここで linus メールをコピペ(省略)
>>742 面白い表ですね
つい C# とか lisp の立ち位置を確認してしまった…
>>739 だからお前のオレオレ定義なんてどうでもいい
そもそも
>>638 みたいな話でC++→Cで全面書き換えなんてする奴はいないだろ
まともなプログラマーならボトルネックを見つけてその部分を書き換える
例えば1つのファイルに関数f1()とf2()があってf2()がボトルネックだからC++からCの範囲で動くようなコードに書き換えたとする
お前はそのファイルの記述言語は何て言うんだよ?
関数毎に記述言語が違うとか言い出すのかよ w
>>740 > 出力中に存在すると判定されて読み込んでしまいそうですが、
> そんなことないでしょうか?
そりゃ普通にそんなことあるだろ
> もし読み込んでしまう場合、自力でフラグ管理かMutexを使うなどして
> 判定する以外の方法はあるでしょうか?
そもそも何をしたいのよ?
出力完了してから読みたいだけなら出力完了してから読み込む側のスレッド起動するとかする方法もあるだろうし
>>749 お前がIDコロコロしてまでも定義にこだわる理由が分からん。
お前の定義なら、仮に全面インラインアセンブラで記述してあっても、
Cコンパイラを通したらそれは「Cのコード」であり、
C++コンパイラを通したらそれは「C++のコード」になり、
Objective-Cコンパイラを通したらそれは「Objective-Cのコード」と言うんだろ。
そんな定義の奴はいない。それは「アセンブラ」と言うんだよ。
ただこの定義はもういい。
君は間違いを認めないようだし、仮に俺が間違っていたとしても、
お互いの認識のズレは確認できたのだからそれでいいだろ。
そして
>>638 は最初からそう言っているだけだ。
お前は「コンパイル単位」でしか言語を規定できないからおかしな事になっている。
世間は「コード単位」でも言語を規定する。だから、お前が
> f2()がボトルネックだからC++からCの範囲で動くようなコードに書き換え
と言うのを、世間では「f2()をCコードに書き換え」と言うんだよ。
仮にお前の定義が正しくても、これを日常的にやるようなら、じきに略されて
俺(世間)の言い方に落ち着くのも分かるだろ。
だから
>>638 は最初から、お前の言葉で言う、
> f2()がボトルネックだからC++からCの範囲で動くようなコードに書き換える
「f2()がボトルネックだからC++からアセンブラの範囲で動くようなコードに書き換える」事を
> もっと速くしたい所をCやasmで書く
と表現している。元々「コンパイル」単位ではなく、「コード」単位なんだよ。
その「コード」について議論するのに、「コンパイル」単位を持ち出すのはおかしいだろ。
「速くしたい『所』」ってのは一部限定って事を明示してるだろ。
お前はどうしても認めないようだが。
お前は根本的に考え方がおかしい。それではまともな議論が成立しないだろ。
議論している粒度に合わせた言葉を使え。
>>751 > ただこの定義はもういい。
> 君は間違いを認めないようだし、仮に俺が間違っていたとしても、
> お互いの認識のズレは確認できたのだからそれでいいだろ。
いきなり弱気になってて笑うわ w
自己解決しました。 仮の名前でファイルを書き出してからリネームすれば書き込み中か書き込み済みか 判定する処理をなくせるみたいでした。
>>751 コンパイラが変わらない単なる最適化で
C++からCにする
なんて言わないから普通
少なくともエンジニアの会話では無い
簡単にいう場合は「最適化」「チューニング」だし
詳しくいう場合は中身を具体的に言う
頭の悪い文系を騙すのには使えるのかもしれないけど
C言語風なコード と C言語のコード 全く意味が違う
「C++で書く」→カジュアルにSTLとか使って読みやすく書く 「Cやasmで書く」→キャッシュやSIMDとか低級に考慮してガリガリ最適化する くらいの軽い気持ちで書いただけなのに紛糾しすぎててワイ将困惑
>>756 おまえさんの頭がC++03のまま更新が止まってしまっていることはわかった
C++xx この末尾のへんなナンバリングが施されるようになったのっていつ頃から?
>>762 元々はC++09を狙ってたらしいから2008年頃じゃね?
>>759 STLが03から入ったと思ってんのか
あと
>Cコンパイラってポインタ周りは最適化をかけないから、多分、
>速度差はコンパイラ起因であって
こんなこと言ってる時点でID:PbE4ojLD0の話は聞くに値しない
>>766 あの流れからどうやってSTLが03からという話になったんだ?
>>756 馬鹿につき合ってすまんかった。
少なくとも俺とLinusは君と同じ定義で使ってるよ。俺の認識では世間もそう。
俺はこれでこれまで話が通じなかったことはないから。
おそらくはCをやらずにC++だけやってる世代と、
必ずCをやったうえでC++に進んだ世代の違いだ。
ゆとりだけで閉じてる世界では、彼らの主張する定義なのかもしれん。
ただまあ、話を聞いてる限り、こいつらは色々と無知だし、無知なことに無自覚だね。
まあもういいが。
自分が知らないだけのことをすべて間違いだと断定しているようでは上達しない。
C++erもここまでゆとり化が進んだのは残念だ。
本当に通じていたのかな? いわゆるフツーの人達は、めんどくさいから適当に話し合わせてテキトーに打ち切るものだが…
ついでだからもう少し書いておいてやるよ。
ゆとりC++erが「C++は速い」ということにしたがるのは、C++「言語」以下の解像度がないからだ。
「C++コンパイラさえ使えばおk」になってくれてないと困るからこそ、そこに異常にこだわる。
(他言語でも同様に、低位実装を直感的に推測できない馬鹿はこの傾向がある)
お前らは
>>722-723 の結果、同じデータ構造で同じアルゴリズムを適用した物に対し、
速度差が出た場合にそれを「言語の差」と言い張るようだが、
それは明確な間違いだ。ただの不勉強でしかない。
実際、それだとそれ以上の最適化は出来ないだろ。
C出身者なら、必要ならasm書いてチューニングすることも出来る。
現在C++は失敗しつつある。
それはRustを見ても明らかだ。以下ページを見てみろ。
https://imoz.jp/note/rust-functions.html スマポ(キリッな連中にとってはC++よりもRustの方が明らかにいい言語だろ。(後発なので当たり前だが)
C++だけにすがるのは止めとけ。
もうそういう時代じゃないし、C++はそれを満たせる言語ではない。
別にC++とCの宗教論争に加わるつもりはないが、 お前qsortがstd::sortより遅くなりがちな理由わかってないだろ アセンブラ使わんでも自分で書きゃCでも同等の速度は出る (というかVCの最適化にハンドアセンブルで本当に勝てるんか?こいつ) >CよりもC++の方が速くなるコードの方があり得ないと思うが。 >CのほうがC++より遅いケース出してみろ。ないから。 調べもせずにこんな決めつけを書く低レベルさ以前に これをC++のスレで書くお前はどう見てもただの荒らしだから。
>>771 お前は根本的に勘違いしている。
出発点は自前のコードでもいいが、逆アセンブル結果でもいいんだから、
改善できなくとも、遅くなることはあり得ない。
アセンブラを読めない君らでは、これは無理だ。
そして、遅くなる可能性の方が高いからやらないってのは、
馬鹿な君らなりの対処法としては正しい。
まあ、C++スレではC++マンセーしないと荒らしだ、ってのは理解した。
C++erがそこまで落ちぶれたのは残念だが、俺は去るよ。
それぞれの言語の良くある使い方であれば Cの方が速いコードもC++の方が速いコードも どちらも存在する 同じ処理を同じように書けば普通は同じ速度 (ただし、一部細かい例外あり)
一般的な使い方では C++の方が開発効率が高く Cの方がバイナリの性能が高い事が多い (もちろん逆になる要素もある)
>>772 以前ここに書いたこともあるけど、最近ET+simd(SSE、NEONのイントリンシック)で
ゲーム用の自前の線形代数ライブラリとか作ったんで
>アセンブラを読めない君ら
残念ながらこれは当てはまらないよw
どれだけ逆アセ読んで比較したか・・・・
>C++マンセーしないと
お前が”正しい批判をしてれば”荒れてないんだよ
ついでに言えば、
>「C++で書く」→カジュアルにSTLとか
STLをカジュアルとか呼ぶ辺り、最近のC++界隈は
「流行に流されて自分で考えることを放棄する」という、かつてJavaの流行に荒らされた時代と
同じ愚を犯してるな、とは思うけどねぇ
C++er憎し、では色々と話がおかしくなるよ
同じ処理を同じ動作で記述出来ない例 Cの可変長配列 C++の例外処理
もうアホらしくなって途中離脱したけど 例えば関数内のループで使ってるstd::unique_ptr が遅いからその部分だけ生ポインタに書き換えたら ID:tSRcUD9w0 は何言語で書いたって言うんだろ? って言うのはちょっと気にはなる まあまた明後日の長文書くだけだと思うけど w
>>775 > どれだけ逆アセ読んで比較したか・・・・
ならコンパイラ出力コードが手書きアセンブラと比べてどれだけ糞かも知ってるはずだ。
それでその言い方には矛盾を感じるけどね。
> STLをカジュアルとか呼ぶ辺り、最近のC++界隈は
その発言は俺ではないが、
基本的には抽象度を上げるのは簡単にプログラミングする為であって、
「カジュアル」という表現は妥当だ。
Cみたいに全部手でゴリゴリ書く意味なんて無い。
速度が問題ない部分は出来るだけ手抜きすべきだ。STLがそれに適しているのなら使えばいい。
ただ、「STL使わなくてもどうとでもなる奴が手抜きでSTLを使う」のと、
「STLを使わないと何も出来ない連中がSTLを使う」のは全然意味が違う。
とはいえ、俺は後者が前者になるべきだとは思ってない。
ただ、後者ならC++ではなくJavaやC#を使った方が妥当だとは思うが。
君が見落としているのは、STLをカジュアルと呼ぶ連中は、
基本的に、STLを使わずに最速な実装が出来るものの、面倒なので、
「手抜き」を「カジュアル」と言い換えてごまかしているだけだということだ。
連中は君みたいにSTLが無いと何も出来ない馬鹿ではないんだよ。
> C++er憎し、では色々と話がおかしくなるよ
これは違うぞ。俺は無知なくせにデタラメを言い張るゆとりは死ねと思っているだけだ。
ただし、お前が無知のままで死ぬ権利は尊重するので、
有用な情報は書かないようにするが。
>>772 >俺は去るよ。
>俺は去るよ。
>俺は去るよ。
>俺は去るよ。
>俺は去るよ。
>俺は去るよ。
>俺は去るよ。
>俺は去るよ。
>俺は去るよ。
>俺は去るよ。
>俺は去るよ。
>>780 > ならコンパイラ出力コードが手書きアセンブラと比べてどれだけ糞かも知ってるはずだ。
爺いは早めに滅びればいいのに
constexpr+UCS=ニューパラダイムのはずだったんだがなぁ。 コンパイルタイムは夢がある。
昔はライブラリもそんなに充実してなかったしアルゴリズム事典とか読み漁りながら色々自作してやってたけどね しかしまぁ便利な時代になったもんだ C言語だと型が変わるだけで使い物にならなくなっていたものが大半だったけど 型に囚われないSTLライブラリは本当に有能だよ 型に囚われない部分は全部インラインになっちゃうけどね
実行可能形式はC++、スクリプトはPython。 これができる大人の選択。
スタイルについての質問なんですけど、Cの文法で書けるならできるだけCで書いたほうがいいのでしょうか 上司のC++のコードがもうほんとゴリゴリのCって感じで、C++でcharの配列も無かろうよと思ったりするんですよ 確かにその方が分かる人は多くなるかもしれないですけど
>>792 C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために
さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが
簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを
追っぱらうため *だけ* だったとしても、それ自体、C を使う強力な理由になりうる。
C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら
Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、
それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる:
- うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が
安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、
もはや笑えるレベルを超えている)
- 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに
効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の
コードがその素晴らしいオブジェクトモデルに依存していて、直すためには
アプリ全体を書き直さなきゃなんない。
言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある
C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに
限定するってことは、他の人がそれをめちゃくちゃにしないってことで、
ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい
「オブジェクト・モデル」のたわごとを持ちこまないってことだ。
いや別に C++で問題ない 上司の意図は知らんが パフォーマンスを考えたコードとか 互換性を考えたコードとか そういう可能性も 5chの一般的な価値観とは違って C++っぽいのが良いコードって訳じゃない
逆に若者はコストも考えずに安易に汎用コンテナを使ったりと思うことがある
ものによるのじゃん? メモリイメージを意識するならCスタイルの方がきれいにおさまる。
バグを生む可能性が一切ないならCスタイルのほうがいいに決まってる
最近のC++は、std::vectorが配列に最適化されるのか? 遅いだろ
C++11以降ならstd::array使うけど、覚えることがともかく多い
区間チェックしてくれる配列を簡単に指定できると嬉しいの†
例えば、[ ]を二重に書くと添字チェックしてくれるとか。どうかな。 int a[[10]];
例外投げるインデクサと投げないインデクサ両方ありますから。
>>802 attributes構文と紛らわしい。
C++のコストの大部分は例外に起因するらしい。 Cでコンパイルできるコードであっても、C++としてコンパイルするとバイナリが肥大化する。 その原因は例外。
x86-32だと割り込み発生時に対応出来るように 関数コールの度にスタックに情報を埋め込む x86-64はこれが不要 割り込み処理がなければコストはかからない
>>813 組み込み開発の株式会社○○みたいなサイトで読んだんだけどな。
なかなかためになる内容だったしブックマークしとくんだった。
見つけたらリンクくれ。
俺の見解では、例外にコストが割かれるなら、それは必要なコストだと思うんだよな。
元記事消えてるっぽいからアーカイブだけど
http://bytepointer.com/resources/pietrek_amd_x64_primer.htm Windowsの例外機構がx64ではスタックベースからテーブルベースの通過するだけならゼロコストなものに変わった
ただしバイナリサイズは増える
>>816 例外を使うならコストがかかるのは当然なんだが、
例外が通過しないかもしれないのにそこかしこで情報を積まないといけないのは良くないってことなんよ。
そんでまあ例外を投げたときだけにコストが生じる方式がいいよねっていう話。
例外が発生しない時のコストなんてゴミみたいなもんだけどな
64ビット化するとサイズが1.5倍になるらしいけどな。
今時コードのサイズなんて問題にならんだろ その代わりに得るものは大きい
1.5倍って40㎏の可愛い少女が60㎏のオバはんになるってことではないだろか。 さあどっちか選ぶんだ。
どうしても対応し続けないといけない32bitのレガシーデバイスがあるなら頑張って そうじゃなけりゃもう32bitなんて捨てろ
32bitがレガシーだあ? どこで吹き込まれたか知らんが 騙されやすいやつだな
クラスのconst配列メンバをコンストラクタで初期化するにはどうしたらいいでしょうか? class A { const double array[]; void A( double &temp[] ) : array(temp) { } }; これはコンパイルでエラーが出てダメでした
>>828 できないからあきらメロン
素直にconst外してアクセサで制御するか、vector使うかしとけ
テンプレートとかを駆使して無理に実現しようと試みるのはいかにも頭が悪いし時間の無駄
constの問題というよりサイズが決まってないからダメなんじゃないの?
ここ3年ほど32bitの組み込み機器に触ったことない
今はほとんど64bitの上で無理矢理32bit動かしてるんだよ ネイティブ32bitCPUなんて化石
>>829 了解です、constは諦めマスカット
>>830 どんなサイズの配列が来るかはコンストラクタが呼び出されるまでわからないんで
サイズは未定にしておきました
vc++のマルチコアのオプティマイズなんて甘々だから余裕で 勝てるけどなぁ。 あんなのに負ける人もいるって、世の中広いなぁ(棒)
そりゃあ頑張れば勝てるだろう コーディングコストと可読性の犠牲に見合うほど速くなるかどうかは別問題だがね
VCもそうだけど大体のコンパイラは並列化や自動ベクタライズは強くないと思う 古くからある機能とそうでないものでは最適化に差が出るのは当然 だからこそSIMD使うときはみんなイントリンシック命令使ってるのであって
>>828 template<std::size_t N>
class A {
public:
const double array[N];
template<typename ...ARGS>
A( ARGS&&... args ): array{std::forward<ARGS>(args)...} {}
};
template<typename ...ARGS>
inline auto make_A( ARGS&&... args ) -> A<sizeof...(args)>
{
return A<sizeof...(args)>(std::forward<ARGS>(args)...);
}
auto a{ make_A( 1.0, 2.0 ) };
こんな感じだろうか。
要C++11以降。
>>どんなサイズの配列が来るかはコンストラクタが呼び出されるまでわからないんでサイズは未定にしておきました
要素数が決まってないとコンパイル時に困るので、テンプレートクラスにしちゃったけれど…
参考にしてみた
https://wandbox.org/permlink/3asRA3QSPQXmmn8l C++17ならヘルパー不要にはなる・・・(コンストラクタに与えた引数から推定
けどどっちにしても配列数可変にはできない
ていうか配列の参照とか初めて使ったw
>>828 C++14のinteger_sequence使ってみた
#include <iostream>
#include <utility>
template <size_t N>
class A
{
const double array[N];
public:
template <size_t... I>
A(const double (&temp)[N], std::index_sequence<I...>) : array{temp[I]...}
{
for (auto x : array) std::cout << x << std::endl;
}
A(const double (&temp)[N]) : A(temp, std::make_index_sequence<N>()){}
};
int main()
{
double t[] = {1.1, 2.2, 3.3};
A<sizeof(t)/sizeof(t[0])> a(t);
//A a(t); // C++17
}
アンチパターンを生み出すための新機能が次々出てくるのがc++だ!
こういうのからiostreamみたいになってゆくんだろうな
つか引数にconst double(&temp)[]って何だと渡せるのこれ ()ないとエラー出るし
何も渡せないよ 配列数のない配列型はどんな文脈でも不完全型だからその型のオブジェクトは存在し得ない
>>842 VS2017 15.7.1のVCのReleaseモードだとtemplateの部分が赤の下波線になるな
Debugモードにするとなぜか消える
そしてReleaseモードはエラーが出ているのにコンパイルして実行可能
バグじゃね
>>847 仮引数として表れる場合はポインタに調整されるんじゃなかったっけ?
配列への参照ってのはあるんだけどね template <typename T, int N> N size(T (&)[N]) { return N; }
>>848 > バグじゃね
未定義ならコンパイルできて実行できると言うのも規格に準拠してる正しい動作
>>854 見当違いのレスだな
DebugとReleaseでエディタの動作が首尾一貫してないって言ってるんだがな
15.7.2が来たから入れてみる
>>855 普通の知能を持ってたら
> コンパイルして実行可能
に突っ込まれてることぐらいわかるだろうに...
>>856 15.7.2にしたらReleaseでも赤い波線出なくなったぞ
エディタのバグが直ったようだ
だから「エディタの」バグと書き忘れただけなのにお前らしつこいな DebugモードでもReleaseモードでもコンパイルして実行できてたんだから
書き忘れとか知らんがな w そもそもエディタのバグと言うなら三行目は元々不要 余計なことを書いて突っ込まれるとか低能にありがちな行動ってだけ
>>859 気にするな。俺には
>>854 の方がよほど的はずれなことを言ってると思うよ。
>>861 >>856 同じようなレスを書いてループさせるのも低能にありがちな行動
未定義の意味を理解してないなら絡んでこない方がいいぞ
エラー 警告 未定義 不適格 ↑ 混同するやつが後を絶たないな
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 V9EWM
この文脈でエラーとか警告とか言い出す時点でアホ丸出しなんだが...w
VisualStudioはインテリセンスとコンパイルに使うコンパイラが違う ちょっと設定変えると、とてつもなくエラーが出るのにコンパイルは通るという事態は稀に良くある
あるコンテナaとコンテナbを連結?するようなクラス(イテレータ)を作りたいんだが イメージとしてはa.begin()からa.end()-1までいったら次はb.begin()になるようなやつを思い浮かべてるんだけど どんな風につくればよいかアドバイスください
>>871 concat_iteratorでググるとそれっぽい実装がチラホラ
C++で2Dのwindowsで動くゲーム作ろうと思っているのだけど、ライブラリって何使えばいいんだ?
windowsに限定するならopneGLにする意味は薄い
DirectX tool kit なるものは一般的なDirectXの上位互換みたいな捉え方でおk?
Siv3D とかも楽に使えると思う。 (3D という名前がついてるけど 2D もいける)
今の時代なら cocos 2d とかモバイルでも使えるライブラリ使った方がいいんじゃないのか
string::size_type についてですが、 size_type の前についている 「string::」 というのは何ですか?
>>893 ありがとうございます。
string::size_type は companion type というものらしいのですが、
この companion type とは何でしょうか?
メンバ関数の引数や戻り値、メンバ変数などで使用するためにクラススコープで定義された型のこと
クラス(この場合はstd::string)を利用する側は、
実際にはその型がなんであるかを知る必要なく
文字列のサイズの型としてstring::size_type を用いることができる
参考
https://stackoverflow.com/questions/41471741/string-companion-types std::threadでサブスレッドで処理をしているのですが、処理をキャンセルするためthreadをdetachすると メモリを破壊しているようで全然別の箇所で色々なエラーが出てきます。system_errorは送出されていません。 サブスレッドではnewでのリソース確保もしていないので理由がわからないです。 detachする際にはjoinableである以外に条件があるのでしょうか。
>>897 スレッドローカル記憶域とか破棄されたあとにアクセスしてんじゃないの?
std::threadのdetachってスレッドを手放すだけでキャンセルはしないのでは ラムダ式で処理を渡してるなら、ローカル変数の参照キャプチャとかしてるない?
一般にスレッドのキャンセルは難しいので適当に処理を終わらせてjoinするのが良いも思う
https://ideone.com/3LDXGx 質問です。定期的に同じ関数をスレッドで起動するクラスを作りました。
んでコード中のここ無駄って書いてある行を削除する方法はありませんか。
開発はVCでやってますが、GCCでも通ればいいなーと思っています。
すみません。言葉足らずでした。
メインスレッド:GUI、サブスレッド:既存のライブラリでデータ補間の重い処理
を担当していて、途中でデータ補間パラメータを変更したくなった場合
キャンセルボタンを押してやり直す、という処理を考えています。
CPUは複数コアあるのでサブスレッドが走り続けてリソース開放が遅れるのは
構わないのですがjoinするとそこで処理終了まで待ってしまうのでdetachしたいわけです。重い処理のループの中にキャンセル用フラグでも用意できればキャンセル通知後
ループを抜けて速やかにjoinするところまで到達させる等の方法があるのですが、
既存ライブラリなのでそうはいかず諦めてdetachしようと考えています。
そのまま走り続けるだけだから結果を回収せずほっておけば良いのかと思ってましたが
甘かったみたいです。
>>898 thread_localは使っていないです。
>>899 アドバイスありがとうございます。関数オブジェクト作ってキャプチャは使っていないです。
>>901 スレッドを平和理に終了させる方法はなさそうなのでdetachできなければ諦めてjoinするしかなさそうですね…
とりあえず最小の再現例を作ってみることにします。
重い処理の方を別プログラムのプロセスにしちゃって止めるときはブチ殺すのがシンプルで良さそうに見える
>>903 async つかえ。
wait_forっていう関数がプロミスにある。
基本的にstd::threadでキャンセルは不可能。 自分でそういう機構を汲んでやらないといけない。 whileの実行をキャンセルするbool変数つっこむとか。 それでもクリティカルパスの実行は避けられない。
強引にスレッドを殺すと、 そのスレッドが確保してたリソースが解放されないかもしれないぞ メモリであったりセマフォだったりハンドルだったり ちゃんと終了処理を追加しないとダメだよ
そのスレッドが使用するメモリ等のリソースを全て
スレッド終了まで保持していても
>>897 >メモリを破壊しているようで全然別の箇所で色々なエラーが出てきます。system_errorは送出されていません。
となるなら、そもそもそのライブラリがスレッドセーフじゃないのかもしれない。
>>904 式に別プロセス化するのが一番なのかもね
ぷぅうううううううううりいいいいいいいぃいいいいいいいいいずへーーーーーーーるぷみーーーーーーーーーー。
関数の中にif(cancel)return;みたいなのを大量に仕込んで外からフラグを立てて止めろ
基本的にはフラグで止めるか別プロセスで実行するのが定石だが 質問者は >CPUは複数コアあるのでサブスレッドが走り続けてリソース開放が遅れるのは >構わないのですがjoinするとそこで処理終了まで待ってしまうのでdetachしたいわけです。 と言ってるからなぁ
join なんて、カラクリが良く分からないものを、よく使う気になるなぁ 私なら、チャイルドプロセスが自爆するように、陽に記述するなぁ
joinが嫌ならdetachすればいいのよ パンがなければお菓子をたべればいいのよ
世の中には信じられないメンタリティの人がいるもんだなあ
標準ライブラリが嫌ならpthread使えばいいのよ
いろいろアドバイスありがとうございます。
どうもdetachした後に局所変数が確保されるとスタックを破壊してしまうようで、
局所変数を確保する前に
>>911 氏のいうようにif(cancel)return;入れるとLinuxでは落ちなくなりました。
ですが、windowsでは改善せず諦めました。atomicにするのものも面倒ですし。
結局キャンセルするときは結果を回収せず、さらに別スレッド立ち上げてjoinすることで
メインスレッドのGUIに制御が戻るようにしました。長期的には別プロセス化するしかなさそうですね。
ありがとうございました。
> 既存ライブラリなのでそうはいかず
って書いてあるのに
>>905 ,
>>907-908 ,
>>911 とかバカなら黙っとけよ...
913はスレッドを自爆させた後joinしないのであろう…
子スレッドが一つならjoinで待っててもいいけど、複数個になったら無限ループで待つよね
ていうか「重い処理かつ終了に時間が要するスレッド」複数個を所有するサーバみたいなスレッドを一発噛ませて、 パラメータを変えたくなったら「現行スレッド停止」と「新しいパラメータでのスレッド起動」をサーバに対して指令するつくりにすれば 良い この場合は「重い処理かつ終了に時間が要するスレッド」が終了するまで誰も待つ必要はなく(※サーバ終了時は除く 、サーバみたいなスレッドは、クライアントから「新しいパラメータでのスレッド起動」コマンドを受けたときおもむろに 「死んでる(再利用できる)スレッドはどれかいな~、」とタイムアウト0秒のjoinでポーリング式にサーチすれば良い 現行スレッドが死ぬまでの間現行スレッドと新たに起動するスレッドが並列に動くことになるが >CPUは複数コアあるのでサブスレッドが走り続けてリソース開放が遅れるのは 構わない ということですしおすし、
>>921 ウィンドーズならWaitForMultipreObjects()とかその亜種で複数の終了待ちができうる
そうでなくともイベントフラグの同時待ちはだいたいどんなマルチタスクOSでもできるから
それを使って類似のしくみを作れうる、。
>>923 できうる、作れうるって日本語的におかしいだろう
ウインドーズとか何か別物感あるし、multipleのスペルもおかしいし大丈夫か
色々なところで糞が露呈している それがWindows
デザインとしては Windows の方が現代的なんだけど、 色んなものが POSIX を基本にしたデザインになってるから噛み合わないんよなぁ。
POSIXに準拠できないWindowsがどうかしている
>>928 昔は POSIX 準拠にしてたよ。
アメリカの政府が採用するのに POSIX を要求してたみたいで、仕方なくやったって話。
だけど、基本的なモデルが違うものに API だけ接ぎ木してもなぁ。
windowsでpthread使うたびにトラブル起こってつら
>>921 他に条件があるならともかく、普通にjoinで待てばよくね?
>>931 別に、joinで済むならjoinでいいんじゃね
キャンセルしたくなるほど長い処理ならスレッドキューイングする利点はない もちろんしたいならしてもいい
C++を使うなら、Windowsでいいんじゃないの。 Clang、gcc、clと主要なコンパイラが動く貴重な環境だし。 文書を残さないといけないからアプリも必要。 図を描くのにvimでSVG書くって人もいるけど、流石にそれは労力の使い方を間違えてる。
サブスレッドでjoinして結果を使わない、というのとデタッチするのとどう違うんやろな。デタッチってなんのメリットあるんやろか。
自分で書いてる通り結果を使わなくて終了も待ちたくないなら join せずデタッチ。 メリットはリソース(スレッドハンドルなど待ち合わせ用リソース)の自動的な解放くらいか。
連結リストのクラス list があります。 addFirst removeFirst などのメンバ関数があります。 この list を継承して、 stack クラスを作ります。 stack クラスにはメンバ関数 push と pop があります。 push の中で addFirst を呼んでいます。 pop の中で removeFirst を呼んでいます。 stack クラスのインスタンスからは、 list クラスの addFirst, removeFirst などを 利用不可としたいのですが、どうすればいいのでしょうか? : public list と継承するともちろんダメです。 : private list と継承すると push の中で呼んでいる addFirst が使えなくなってしまいます。 どうすればいいのでしょうか?
・stack : protected listとして、必要なメンバをstackで明示的に公開する。 ・listとstackのポインタに互換性がなくなる。
・assert、throw等で警告するだけのaddFirst、removeFirstをstack側に作りオーバーライドし、規約で使うなと言っておく。 ・非常にダサい。
・基底クラスbasic_listを設け、そこからlistとstackを別に派生する。
>>935 釣りか?
MSYSがあるからなんとか我慢して作業できるが
仕事以外でそんな苦痛を受けながらプログラミングなんかしたくはない
wslを有効にしてコルタナにウブンツと言えばすぐ使えます。
wslでWindowsネイティブなバイナリ作れんの?
>>944 > 仕事以外でそんな苦痛
でもどんな苦痛なのかは書けない w
さあどうだろ? Linux側からWindowsのファイルは読めるけど。 環境設定が大変そうだな。 逆にWindows側からLinuxのファイルを直接変更したらだめらしい。
俺のおすすめの使い方は、Windowsバイナリはcl、Linuxバイナリはwsl上のgccで作る。 開発環境はVisual Studio2017、CMakeプロジェクトを使う。 これだけでWindowsとLinux両方対応できる。
>>939-943 ありがとうございました。
Macを使っている人はいませんか?
コンピュータサイエンティストって大抵Macのノートパソコンを使っているイメージがあります。
>>952 mac使ったところでmacしか使えないだけ
本物になりたいならシェアが高いウインドゥスを使え
もしくはLinux
>>952 念の為、標準ライブラリにlistもstackもあるからね。
あと標準ライブラリのlistは継承して使えるように設計されてないからね
リスト構造のスタックなんて簡単なんだからゼロから作っちゃえば?
push pop size copy move swap constructor destructor くらいでしょ使うの 片方向でもいいだろうし
stackはlistではないし継承は間違ってるわな
俺、リストツリーっていうの考えたんだけど、聞きたい?
>>953 >>955 ありがとうございました。
>>956-959 実は、
最近出版された岩沼宏冶他著『データ構造とアルゴリズム』(コロナ社)
という本にスタックとキューのそのような実装が書いてあるんです。
まず連結リストをテンプレートを使って実装しています。
その関係で質問しました。
まえがきに「本書の前半ではC++言語での実装コードを示すが、これは
初学者によいコードを読ませることが目的であり、Art of Programmingに
つながるような解説を付記するように努力する。」と書いてあります。
下手が伝染るから、クヌースを取り寄せしたほうが良いぞ
>>965 横レスだけど複数スレッドがあったとき
・どれかの終了を待つならjoinでは無理
・全ての終了を待つなら適当な順でjoin
というだけのことでは
>>938 そういうことをやるなっていうのが「リスコフの置換原則」
「外から見えるインターフェースが変わらなければ 内部の具体的な実装がまったくの別物に変わっても使うのに支障ない」 ていうオブジェクト指向のカプセル化だっけ、あのあたりの教材じゃなかろうか。 それと継承のアクセス制御の使い方。
派生クラスのアクセス制御、と書くべきだったかな。 意味は通じると思うけど、用語の使い方に厳しい人もいる故。
>>932 言葉足らずだったスマン
スレッドハンドルの配列があったとして、[i]についてjoinしたら[i]を再利用できる(再びスレッドをcreateしなおせば良い
、の意味
joinせずとも済むやり方もあるが、
(「重い処理かつ終了に時間が要するスレッド」の関数本体をそのままスレッドにするのではなしに、
普段イベントを待ち、イベントが来たら「重い処理かつ終了に時間が要するスレッド」の関数本体を普通にcallし、そいつがreturnしてきたら
再びイベントを待つ、というループするスレッドとしてwrapすれば良い、等
結局「重い処理かつ終了に時間が要するスレッド」が使っていた資源が開放されたことを論理的に知る必要からは逃れられず、
一番簡単なのがjoinですよという意味で
>>922 ではjoinと言ったので察してホスイ、
ほむほむ、ところでgtestとBoost.Testはどっちが良いですかな?
>>972 自分でこれまで勉強した範囲で疑問なり興味なり沸いてきて、あれこれコード書いて試して見ようとしたことは無かったの?
もし全くないのならもう諦めた方がいい。
>>972 純粋な言語部分
プリプロセッサ
標準ライブラリ
特定のOS, 特定のライブラリ
組み込み
どの辺の課題?
「計算機プログラムの構造と解釈」(SICP)を読んで演習課題を解いたら良い
>>975 まだ scheme 手習いが終わっていないのです(泣)
リトルインディアン、ビッグインディアンも教えない職場があるんだな。 おっさん、びっくりしたわ。
>>977 周知のこととして扱われているのかもしれませんね。
私は学校で教わりました。
>>977 インディアンかー
俺も教わった覚えないな
One little, two little, three little Indians
エンディアンなのかインディアンだったかいつも忘れる 口語は混ざる
「リトル・エンディアン」「ビッグ・エンディアン」て用語は 『ガリバー旅行記』が由来、という情報が載ってるサイトで、 主人公が漂着した小人の国、巨人の国のエピソードから…、とか 書いてあるのを見たことがある。ネタだったのかも知れないけど。
>>985 それはほんと、小人国での卵の割り方にちなみます
>>977 今どきバイトオーダー意識するようなプログラム書くような職場じゃなきゃ教えないよ
アライメントなんかも同様
SEなら尚更知っておかないと 日本はなんちゃってSEばっかだもんなw
>>986 調べたら小人同士の戦争の原因なのね。巨人国は関係ないな。
実は空の国の「学者の無意味な論争」の一例だと思い込んでいたんだわ。
>>989 「ウチはCのコーディングスタイルとしてAT&T式を基本とします」
ってところはあるかも知れん。
何でもネットに繋がらなきゃならないこの時代にhtolやltohを避けて通れるもんなのか? PHPしか触らないWeb屋ならともかくここC++スレだぞ
今時C++と言えどhtol()とかltoh()なんて低レイヤーの関数使うことなんて滅多にないだろ
>>995 ソフトウェアがなんでもかんでもネットワークに繋ぐ必要があると思ってるの?ここC++スレだぞ
C++使うくらいだからXMLとかJSON使うんだろ
このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 68日 2時間 56分 35秒
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/ ▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
read.cgi ver 07.7.23 2024/12/25 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20250423161345caこのスレへの固定リンク: http://5chb.net/r/tech/1522495206/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。 TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「C++相談室 part135 ->画像>4枚 」 を見た人も見ています:・C++相談室 part152 ・C++相談室 part153 ・C++相談室 part154 ・C++相談室 part156 ・C++相談室 part155 ・C++相談室 part148 ・C++相談室 part124 ・C++相談室 part157 ・C++相談室 part164 ・C++相談室 part133 ・C++相談室 part137 ・C++相談室 part136 ・C++相談室 part144 ・C++相談室 part143 ・C++相談室 part146 ・C++相談室 part134 ・0からの、超初心者C++相談室 ・Cygwin + MinGW + GCC 相談室 Part 8 ・C♯相談室 Part20 ・自営業 悩みごと相談室 16 ・C#, C♯, C#相談室 Part93 ・自営業 悩みごと相談室 52 ・C#, C♯, C#相談室 Part94 ・C#, C♯, C#相談室 Part91 ・MFC相談室 mfc23d.dll ・C#, C♯, C#相談室 Part97 ・C#, C♯, C#相談室 Part98 ・自営業 悩みごと相談室 48 ・C#, C♯, C#相談室 Part95 ・C#, C♯, C#相談室 Part91 ・自営業 悩みごと相談室 51 ・自営業 悩みごと相談室 47 ・自営業 悩みごと相談室 41 ・自営業 悩みごと相談室 46 ・【不倫.浮気】お悩み相談室 ・C#, C♯, C#相談室 Part94 ・0からの、超初心者C言語相談室 ・【男飯】Rickの相談室【言霊】 ・ライダーマンのお悩み相談室 ・【イエス』ユダの相談室【口寄せ】 ・[特設]サマータイム対応相談室 ・♪♯☆ IRCnet相談室 part2 ♪♯☆ ・アパート経営なんでも相談室【135号室】 ・■コンサル田中の経営相談室。■ ・【太気拳】なんでも相談室 part6【意拳】 ・【真剣相談】大阪市営住宅の浴室給湯器設置 ・アパート経営なんでも相談室【136号室】 ・【太気拳】なんでも相談室 part3【意拳】 ・シーバスなんでも相談室 17©3ch.net ・MM(MI)型カートリッジ相談所 第5会議室 ・【ハゲ】髪の毛の悩み相談室 in DQO【彡⌒ミ】 ・黒田塾黒田広史行政書士相続まちがど相談室非弁 ・アパートマンション経営なんでも相談室【152号室】 ・【NTT】ドコモ お客様相談室【docomo】 ・アパートマンション経営なんでも相談室【154号室】 ・アパートマンション経営なんでも相談室【151号室】 ・アパートマンション経営なんでも相談室【150号室】 ・アパートマンション経営なんでも相談室【137号室】 ・黒田広史行政書士相続まちがど相談室非弁高額報酬 ・アパートマンション経営なんでも相談室【154号室】 ・アパートマンション経営なんでも相談室【153号室】 ・アパートマンション経営なんでも相談室【154号室】 ・No A012-2 【ジャマイカン恋愛相談室】広告対策 ・アパートマンション経営なんでも相談室【158号室】 ・アパートマンション経営なんでも相談室【155号室】
11:59:57 up 62 days, 12:58, 0 users, load average: 10.76, 9.56, 9.49
in 2.8670189380646 sec
@2.8670189380646@0b7 on 061900