◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:C++相談室 part146 ->画像>1枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1573094136/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part145
http://2chb.net/r/tech/1568362404/ このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://2chb.net/r/tech/1556142878/ ■長いソースを貼るときはここへ。■
http://codepad.org/ https://ideone.com/ [C++ FAQ]
https://isocpp.org/wiki/faq/ http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。 ---- テンプレ ここまで ----
https://ideone.com/Al0exx これ通ったんだけど、三項演算子ってどういう挙動なの?
プリプロセッサ的に選択したモノに式を置き換えるのか?
え? 三項演算子は参照返してるの? ~~?lvalue:rvalue;はどうあつかうんや?
何を混乱してるのか知らんけど、四則演算や比較など他の演算子が返すものと性質は何も変わらんて
たぶん三項演算子で分岐後の型が異なっている場合の事を気にしているのでは? 三項演算子は変数セレクタ(変な表現だけど)ではないのだが そういう使い方もできるだけ
上級者のvoid君によると、初心者避けのおまじないらしい
二択条件演算子を条件演算子と言うやつは CとC++の区別がついていないやつ
はて、ISO/IEC 14882:2017もISO/IEC 9899:2011もConditional operatorなのだが JIS信者が崇拝する廃れたJISには二択条件演算子などというマヌケな用語が書かれていたのだろうか
>>16 話を逸らすな
ドヤってるやつ自身の言葉遣いがおかしいのを正している
おまえ個人がJISをどう思っているかなどハエのクソほどの価値もない
ハエのクソほどの価値もない これはなかなか良い煽り表現、メモしとこう
ふむふむ確かにJIS X 3010:2003は「条件演算子」、JIS X 3014:2003には「二択条件演算子」とあるな Conditional operatorは正しいが「条件演算子が誤り」と言われても致し方ない 勉強になった
『プログラミング言語C++』第4版の第2章のエピグラフには シェイクスピアから引用されてるね。 「まず行うべきは、言語の法律家を皆殺しにすることだ。」
JISwww まぁ英語読めない人はそっち読んでればw
JIS信者ってコンストラクタとデストラクタを生成子とか消去子とか呼んでるの? 話したくねえな
随伴と言う言葉は、実は数学や物理で別の意味で使われているのでちょっと 抵抗を感じるのは否めない。量子力学でのエルミート共役や、リーマン幾何学 で使われることがある。数学の「双対」の概念とも関係していて、随伴に対して もう一度随伴操作を行うと元に戻る性質がある場合もある。
class 満州国 { friend 大日本帝国 };
class 明 : public 元; class 清 : public 金, 元; class 李氏朝鮮 { friend 明; friend 清; };
>>32 清は、大モンゴル帝国の正統な後継国だから。
北元がモンゴル高原に持ち帰って保持していた玉璽を、清が引き継いだ。
北京は一見すると漢民族の首都のように見えるけどまったく違う。
最初に現在の北京を首都にしたのはモンゴル帝国の元。
北京は、漢人・モンゴル人・満洲人それぞれの活動域の接結点に位置している。
以下の事件では、内モンゴルから来た2人の患者が北京の病院で肺ペストと診断されている。
中国で2人が肺ペストに感染、危険性高い劇症型
https://www.cnn.co.jp/world/35145373.html 2019.11.14 Thu posted at 10:04 JST
しかし継承ってほんと駄目な語だよな インターフェースに対する実装感が無い
じゃあinheritって言えば? それで何が解決するのか知らんが
inheritには立場や役目をそのまま成り代わって継続する意味合いがある そういう意味合い抜きで単に引き継ぐだけ(あとは後任の勝手)ならsucceedな 王位とか家督とかの相続はinherit 単に財産を相続するとか、社長なり議員なりの後任を単に務めるだけならsucceed (ただし後任の社長が前任の右腕で忠実に同じやり方を継続していく意向、みたいなのはinheritでもいい) 「継承」は原語のinheritの含みがスッポリ抜け落ちてんだよ 派生クラスが基底クラスの完全な代替として振る舞う(べき)っていうニュアンスが消えてるから初心者が誤解する
しょせんメタファーなんだから単語だけで正しく理解できるわけないだろ あほちゃうか
「継承」は老舗のお店や古典芸能の家系なんかの気持ちだったのかね。 先代の商売のやり方を引き継ぎながらも新しい世にも…みたいな。 「相続」は悪くない訳な気がするけどね。 祖先の遺産を使って苦労なく好きにアレコレできるとか、 変な具合にいじってお家断絶しちゃうとか。
>>42 俺も聞きたい
バカとか言っちゃう人がどんな崇高な訳をお考えなのか拝聴したい
ここんとこしばらく腹を抱えて笑うという健康法をしてないしな
英語が曖昧すぎるからよほどぴったりじゃないと英語そのままのがいいでしょ
こんなしょーもないことをいちいち気にしてたらプログラムなんてできんだろ。 まあいまだに「オブジェクト指向とは」みたいなしょーもない禅問答やってるバカもいるけど。
むしろ継承にただ引き継ぐだけなんていう暗黙的意味があるなんて今知った
単に継承という言葉の意味を知らない馬鹿が発狂してただけという
2019年になってなお、訳文でもめるのかよ もう全部英文で良くね?
実際そうしてるでしょ スマートポインタ、ムーブ、ラムダ、constexpr、noexcept、コンセプト、モジュール、 誰もゴミみたいな訳語当てたりせずに英語そのまま使ってるしそれが正しい
訳でもめてるというより ひとりだけ継承という訳にダメ出ししてる状況 一般論として訳や命名は軽視してはならないけど、 これに関してはかなりどうでもいい
和訳とか関係なく、術語が一般用語としての意味と必ずしも一致しないなんてのはあたりまえなのにね。 数学なんかそんなのばっかり。
4人くらいいるだろう ま、訳以前にそもそも継承という概念が役立たずだからな
こうゆう機能、性質を○○と呼ぼうって順番なのに ○○って名前なのにこうゆう機能が無いのはおかしい!って言うのがアホ
prvalueを純右辺値というだけで ひっ絡んでくんの、このチンピラ?
仕様内で定義のある用語はその言葉の一般的な意味がどうあれ定義通りに理解すべきではあるんだが、 そもそもある語がテクニカルタームであることがわかりにくい場合ってのはイケてないと思う。 継承という言葉があったらどこかで定義されてるだろって思うけど、 右辺値って書いてあったら右辺にあるやつかなって思われても仕方がない感じがする。
defaultとかexecuteとかの英単語は、それ自体にいろんな意味あるじゃない。
ドスとかスワップとかコンピュータ用語って昔から怪し杉
だいたい元の英語のままでも日常語としてみたらなんじゃそら、みたいなのが ちょいちょいあるのがコンピューター用語 バグ(虫)とか
https://ideone.com/CMbxJf ちょっと聞いてくださいよ。
ファクトリーメソッドのサンプル書いたんですよ。サンプル。
そしたら、子クラスのthisで親クラスのメソッド呼んだら、子クラスが記憶喪失になるんですよ。
おかしいじゃないですかこれ・・・。
あー、もどかしい。
スマポのポリモはよくわかんないから触らないことにしてる
DupってCreateのことだと思うんだけど FactoryMethodなら呼び出し時にクラスのIdを指定しないといかんよ この例だとDupの返す内容はIFactoryに固定されてしまうので もともとIFactoryに存在していないXを表示させるのは鼻から悪魔
で、もしIFactoryにXを持たせてもこうなる
https://ideone.com/s9beHs IFactoryとAのメモリレイアウトが違うんだろう
あくまでもDupは生成時にmake_sharedするべき
キャストじゃなくて、インスタンス作るとこでディスパッチがないとな
ファクトリで思い出したけど 文字列をクラス名とみなしてインスタンス化するにはどーすりゃいいの 他言語のevalみたいなの
>>74 んだね
C++ならif文を重ねるしかない
仮想関数の動きに惑わされず基本を押さえないとな
C++でデザパタやるとどうしても多少の泥臭さは我慢する必要がある
decltypeなんか使ったらコンパイル時に型が固定されちゃうよ
createProduct()は仮想関数にできるね これでかなりすっきりするのではないかと んでIfactoryのcreateProduct()は純粋仮想関数にしておく
IFactory内でdecltype(*this)取ってもIFactoryにしかならんよ、コンパイル時の型情報しか取れないんだから そういうのは(すでに言われてるけど)仮想関数でごにょごにょすべき 仮想関数と共変使えばif文を排除できる
すまん間違えた、共変使ってもIFactory内だとだめだな make_sharedまでを派生でやらせればいける
インスタンス作るとこの振り分けは愚直に書くのが保守性が高くなる気がしてる。
"Java言語で学ぶデザインパターン入門"のソースにならって
愚直に書いてみた
突っ込み歓迎
https://ideone.com/uUbAfy ストラウストラップのプログラミング言語C++Vol3以降、
ひさびさにできるだけ新しい仕様に準拠した日本語のC++本買おうと探したんだが
ほとんどまともな日本語本ってないのね
επιστημη、 高橋航平の独習C++
https://www.%61mazon.co.jp/dp/4798150231 表題だけみたけどマルチスレッドとか一切ふれてないのコレ?
とりあえずプログラム実装するならテンプレートなんかよりマルチスレッド/マルチコアプログラムのほうがよっぽど重要だと思うけど?
だれか買った人居ない?
レビューよろしく
何で禿4があるのに禿3なんかみてるの? 髪薄いから?
>>85 日本語のC++本はVol3の時に買っただけで久しく入手してないという意味ね
Vol4は英語版のebookを持ってるが、ひさびさにできるだけ新しい仕様の日本語で書かれたC++が欲しいと言ってるんだよ。おつむの弱いお前
だいたい、C++-11で止まってるVol4今頃見てどーするつもりだおつむの弱いお前www
>>94 江添のような異常者の文章は読まないことにしてる
なに勧めてもケチ付けるだろうから規格書をお勧めするよ
>>85 あー、おまえ禿4の日本語版あるの知らねえウルトラ情弱かw
英語が苦手でググりスキルも家畜以下じゃ
C++に限ったことじゃねえよな
それはそれはステキな人生送ってそうだな
同業者として失笑が止まらんわw
内容くらい読んでからご託ぬかせよ
おまえみたいに物を知らんやつには
間違いなく勉強になるから
C++11がどういう位置付けかも知らず
営業呼称の数字がでかいの探してるだけだろ
う す ら ハ ゲ
>> ID:SB5I0OPT あほはアンカーのひとつもまともに入れられないってかウスノロ 原書持ってるのに11どまりの今頃Vol.4の日本語訳入手してどーするつもりだ低能 あほは死ねや ご希望とあらば、ぶち殺してやってもいいぜwww
>>94 >C++11がどういう位置付けかも知らず
シングルスレッドのお前は11で止まっとけよ低能
お前のオツムじゃ並列思考は到底無理だろうからよwww
あきらめて下請け土方でもやっとれ。あほ
>>100 だから内容くらい読んでから御託ぬかせっての
シングルスレッドと11がどうつながるんだよ
職安通いのおまえのクビみたいなもんだろうが
シングル毛根のくせに11やっても毛が2本に増えたりゃせんぞ お ハ ゲ の 旧 太 郎 が
アンカー滑っちゃってすまんな おまえもせめてアデランスが滑らないように気をつけな
あ、よく見たらこいつC++-11だってw 禿本持っててこれじゃ英語白痴が絶望的なステージなんだな なあbaldって意味わかる?
あれ? 寝ちゃったのかな それとも自分の頭から滑落死したか?
ハゲ:規格と乖離した妄想言語をコンパイル確認せずにドヤ顔で披露する老害。頭頂部に髪が無いのが特徴的 添:ハゲを医者の不養生と揶揄しつつ自分もコンパイル通らないコードをドヤ顔で披露する委員会メンバ。頭髪を剃っているのが特徴的
ひさしぶりに見たらなにかよくわからないハゲのスレッドになってた
俺たちがどれだけ頑張ってもC++でハゲには勝てない
このスレではじめてC++についてまったく非のうちどころのない正しい意見が書きこまれた
C++はすぐ深刻なエラーになるからコーディングに注意を要しストレスで禿げる
それはあながち否定はできない まあ俺は禿げていないが
プログラミング言語好きの人たちが集まるネットコミュニティの 雰囲気にあてられてハゲるんと違うか? C++界隈は他の言語に比べて攻撃的な物言いをする人が多い気がするぞ。 皆がトーバルズ氏になりたがってる、みたいな。 ハゲ先生の本を(和訳本で)読むと穏やかな人格者っぽい感じなのに。
C++はもうC#の後追いやってるだけだからなww テンプレートにうつつ抜かしてる間に生産性以外でもC#に劣る言語仕様に成り下がった
>>116 void君とか頭おかしい連中が目立ってるからだろ
>>110 c++で創薬したるわ
今はやりのpythonを使う人はpybind11とかでpython用のC++プラグイン作るだろうから、これからもC++は色んな所で使われ続ける。
後追いというか、C++を最も使い込んでいるのはMSなんだからC#に似てくるのは当然
何寝言逝ってる C#で新たな規格が決まって だいぶ遅れて、C++がそれ取り込んでという順番がつづいてるだろうがwww
C++/cli経由だけどenum classもそうじゃないかな
yieldは40年前からある技術だけどな。 cライクの言語に取り入れたという意味ではエポックメイキングだったんだろう。 その2つくらい?
>>127 Herb Sutter
のことですかね。
>>128 中間言語や VM の存在は C# の本質ではないと思います
マイクロソフトもいずれネイティブコードを吐く C# コンパイラを出してくるでしょう、私には VM なんてなんの腹の足しにもならない無駄な機構にしかみえません
PGのVM設計するときに参照するのがx86だったりとかで、結局ロックインしちゃってる気がする。 複数の未知のCPUにJITできるように組んでないような気がする。
wintelの目指すトコロはCPUアーキテクチャと専用高級言語の囲い込みでしょ C++を潰すには、みたいな第二次ハロウィン怪文書を思案中だよきっと
>>132 今でも .NET の中間コードは、native コード化できます。
>>136 できますが、結局、GCを使うので、C++並の速度にはなりません。
GCが動いた場合、処理時間のオーダーが違うので、CPUがどんなに速くなっても
どんなに最適化を施しても無理です。
ビジネス用途を想定しているC#と基礎技術を支えるC++が競合してると思ってるのが面白い
GC で止まるのが嫌なら、GCの無い、Rust を使え! その代わり、かなり注意深くプログラミングしないといけないw
注意深くプログラミングしなくていい言語なんてあるのか
昔は1日の業務の終わりにGCを走らせてから帰宅したもんだ。翌朝までにGCが完了してればそれで充分だった。 いまは物理メモリが広いので速度クリティカルな部分ではGCを無効化するのもありかもしれない。 それだとしてもC#はC++を置き換えられないよ。思想が違うもの。
やっぱ今衝突とか爆発しそうなその瞬間に寄りによってGC走ったら悔やんでも悔やみきれないからな GCなし言語には生き残ってもらわないと
>>145 それはRTOS使わないといけない
C++でも割り込みで予期せず遅れることはある
Rustはコンパイルが通った時点で(メモリ管理に関しては)注意深くプログラミングし終えたことになる、 抜け穴がないわけではないが普段気にするほどではない
GCとプログラムの実行速度の姦計は、 GCが極力動かないようにプログラマの側で工夫する余地があるから必ずしも打つ手が無いわけでは… (GCが動き出したらワーストケースの見積りが吹っ飛ぶというのはあるが とゆーわけでC++に比べてC#がいまいち遅いのはGCが主犯というわけではなく、 オブジェクトに参照経由で毎回間接アクセスする言語仕様なのと JITでマルチプラットフォーム対応可能なことと引き換えに最適化があんま利かせられていないせいだと思う あとネイティブコードを呼び出す最にマーシャリングもするし、 ジャヴァのサンドボックス思想をパクるために仕方なかった側面、
ユーザーコードがバックグラウンドタスク(応答時間非規定で可)でGCを使うだけなら GCとリアルタイム性は両立しないわけでは無い まあGC有りのプログラミング言語でプログラムする状況で GCが使われる状況がバックグラウンドタスクのみに限定されるというのは 非現実的な想定かもしれんが
>>151 姦計とか、どんな文脈で使ってたんだよw
今時のよくできた GC (の実装) はインクリメンタル化されてるから、 良い感じに暇なときを見つけて動いてくれるっしょ
あれ?この人職業プログラマなの? 趣味でお気楽にやってるだけの人だと持ってた
わたくしが「現代現象」と呼称する一連の悲劇的な出来事は なんの変哲もない日常がいきなり変貌を遂げるものであり その猶予は0.1秒もない スイスチーズモデルを天文学的数字ですり抜けたそれら現代現象への対処時間は大抵は1秒未満になる なので未来になればなるほど思いもよらない意味不明で突発的で素早い破壊事象が起こる これを踏まえて車載映像の事故映像を見てみると猶予が本当に少ないことが分かる なので自動運転では各種の重い処理はマーフィーの法則によれば衝突する0.1秒前の「暇な時」に動き出す これを超克するには未来予知が必要になる
>>155 はちみつさんは lisp-er ですから、lisp-er 的な視点で現在のプログラミング環境をみれば、
やっと時代が lisp に追いついてきた、という感慨が発生するのも自然だと思いますよ
GC も lisp の産物ですから
「適正に欠く」と判断する推論内容は理解できませんね
>>159 それは、おまえも適性を欠いているということだ
形容詞に比較をつけないとか、定量的でないとか、
魔法的にアレしてくれるだろうとか
おまえの頭ん中も同じだとここで露呈して今どんな気持ち?
>>160 私に適性がないのはそのとおりなのでしょうが、いちいち定量的に条件を明示して話をしなければならないわけでもないでしょう
魔法的にアレするレイヤーの話は別途規定する前提で、今は特に大局観を語りたいときにはね
あなたは、戦術レベルの話はできても戦略レベルの話は理解できない大局観に欠いた狭量な、例えば java 屋さんに見えますね
>>161 主張に説得力がないって指摘がおまえまだわからないのか?
あいた口が塞がらんわ
ほんと攻撃的なやつが多いな これだからC++界隈は
>>132 >いずれネイティブコードを吐く C# コンパイラを出してくる
すでに出とるが
いつの時代の話しだ
>>159 ワイは Scheme 使いでもあるし日常的には Scheme の方をよく使ってはいるが、
長いことバイナリマンだったし、 LISP の思想にそんな強い思い入れはないわ。
ただ、評価とかごちゃごちゃ言ってないで手早く書いて実測しろってのは LISP 的かもね。
今では他の言語でも書きながら速いサイクルで回して改善するスタイルって一般的じゃね?
書き始めは楽観的にやってるよ。
なるべく楽して必要になってから手間かけりゃいいんだよ。
そんでもってゆるふわに富豪的プログラミングしてても割と足りてしまう経験の方がおおいなぁ。
>>156 俺は趣味人やで。
> 富豪的プログラミング 相手してはいかんやつだったコイツ
>>163 これだけ広いスパン使われて、いろいろな書き方がある言語なのに
ユーザーは多様性に非寛容というのはなかなか興味深い現象。
いや多様な使い方を求めるからこそ GC厨の矮小な発想範囲を危惧するんだ
>>170 この板で唯一まともな僕も赤くしておこう
C#って、これ以上の普及はもう無理だろ。WindowsのUIアプリでしか存在価値はない。 MonoはイマイチでJavaはなくならんし、WebもAIもスクリプト言語系でOK。 タイムクリティカルなエンジン部をC++で書いて、スクリプト言語(Python含めて) 使うのが主流化してる。C#を使う場面が無い。
会社の上層部がMSの営業に騙されてAzureの導入を決めてしまった場合、 マネージドサービスの利用のためにはC#を使用せざるを得ない 他の言語では事実上使い物にならない
Windowsのデスクトップアプリを手っ取り早く作るにはC#以外の選択肢が無い
保守的な経営者とそこそこの技術力の社員でも使えるんだからAzureというのは大したもんだな
windowsに関わってる限りC#とC++/CLIからは逃れられない
>>132 制限付きながら、既にネイティブコードは吐ける
>タイムクリティカルなエンジン部をC++で書いて、スクリプト言語(Python含めて) >使うのが主流化してる。C#を使う場面が無い。 主流て、そんなもん昔からほぼこういう書き方してるだろwww そこで、スクリプト言語を使ってどれだけ実行時間に影響与えてるか正しく認識してないのが多い。 ここでC#使ってこんなに違うのかと初めて気づく。 そして、単に実行速度ってことならエンジンにC++使わずともC#でもそこそこ勝負できるってことも認識するのが情弱。 タイムクリティカルな用途ならそれこそOSからしてラウンドロビンなんか使わない。 RTOSでわざわざ、メモリプール設定してるのに、new/delete繰り返すようなC++流の書き方はそもそもよろしくない。 C++で非推奨の限りなくpure Cに近い書き方してるのはもはやC++とはいわんだろ。
> RTOSでわざわざ(中略)C++流 そう思い込んでる迷惑なのがいるんだよ おまえみたいな
タイムクリティカルもいろんなレベルがあるから ハード実装 FPGA OSレスのフルアセンブラ RTOS + C .... クラウド
> C++で非推奨の限りなくpure Cに近い書き方してるのはもはやC++とはいわんだろ。 テンプレート、ラムダ、...を使いまくるコーディングだけがC++じゃない 小規模組み込みでnewすら使わない泥臭いC++もC++
禿も必要な機能だけを使え、無理に全機能を使おうとするなって言ってるね
クラスにupdateという関数があってそれが何回もメイン関数にあるインスタンスから呼び出されるのですが update内で変数宣言を書いている場合、領域の確保は呼び出される度に行われますか?
その宣言にstaticがついてなければ毎回領域確保が行われる
変数の宣言と定義、用語の違いを利用した罠かも知れん。
変数自体はスタック(またはレジスタ)に割り当てられるから 確保解放のコストは気にするな 変数の内部(コンストラクタ他)でのメモリ確保解放や初期化処のコストは当然気にしよう パフォーマンスの問題であればクラス変数にする等
関数を使おうってときに 関数内変数をデータメンバに改造するアホが うちの若いのにいたら焼きだ
バッファをあらかじめ確保しておくなんて ごく当たり前のことだと思ってたけど そうじゃないのか? updateなんていう、 クラスの内部に直結してそうな関数ならなおさら
とか抜かすやつに限って計測もせずに片っ端から最適化と称した難読化をしやがる
パフォーマンスの問題であれば パフォーマンスに問題があるなら
>>200 パフォーマンスの問題であるなら、まずは計測する
そして最適化厨が必死に難読化を施しているその箇所は、殆どの場合パフォーマンスに全く影響しない
パフォーマンスを考えなくていいプログラムなら そもそもC++を選ぶのが間違い
パフォーマンスなのかフラグメントなのか使用リソースなのか 何を気にしてるのかはわからないけど
再入やマルチスレッドで死ぬ恐れもあるから、このレベルの初心者にバッファの事前確保が当然だなどという阿呆な考えを植え付けることはテロ行為に等しい
>>191 はstaticがついてなければyesで終わる話
それに勝手な前提つけたしていらん押し付けをするからお前らは駄目なんだぞ
>>207 会話するのが嫌いならわざわざ書き込まなくて良いんだよ
https://ideone.com/kprgQF ちょっと暇だったので、
昔のビットシフトの掛け算と割り算って、
今の技術使ったら爆速になるんじゃないかと思ったのですよ。
で、書いてみたのだけど、知識不足で到達しないんだ。
なんでだろう??
>>202 そのプログラム全体が速度が要求される訳でもなかろう。必要なところだけ必要なぶんだけ高速化しろよ。
速度が要求されない部分も別にわざわざ別の言語で作るメリットがなければC++のままで構わないわけだし。
>>208 質問者にとっては混乱させられるだけの余分な情報だし、知っている人からすれば当たり前で価値のない情報だし、実のない議論したいだけの無意味な付け足しは要らんよ。
俺が言いたいのは一つだ。 C言語は超高等言語なので、その前にC++使うのだ!
いやそもそも
>>195 の前半で解答は終わってるだろ
>>195 の後半は余計
>>210 普通の型なら普通にC++で書いた方が良い
定数ならコンパイラが工夫する
普通じゃない型、例えば多倍長でも
1ビットずつシフトして速くなることは無いと思って良い
>>210 >今の技術使ったら爆速に
ならねーよw
>>217 ならないかー。
コンパイルタイム時に置き換えるから、1サイクルに落ちるものだと・・・。
なんか根本的にconstexprを勘違いしてる初心者がよくそういうこと言うけど
定数同士の計算の省略なんか大昔からある最適化だぞ
C++03以前を偉そうにデイスってる奴(
>>210 は別として)最近多いけど、そういうのに限ってこういう基礎が全くわかってない
constexprの利点はtemplateとif constexprの組み合わせがおすすめだと思うの。
>>218 を読まずに
>>220 を書いた
コンパイル時に解決するなら0サイクルだ
よく分からない多倍長ライブラリを使うのであれば 当然コンパイル時に解決出来るとは限らない
>>223 多倍長の乗算は筆算の要領で出来るの算数程度の数学で足りるが、
多倍長の除算は、CPUが持っている除算命令を使って行おうとすると
数学的な考える力が必要になる。アルゴリズムは既に有ることはあるはずだが、
丁寧に解説されているわけではないので自分の力で証明できるくらいの
人で無いと難しいと思う。
多倍長の乗算は、 非常に桁数が少ないときのみ筆算方式 もうちょっと大きいとカラツバ もっと大きいとフーリエ変換 除算はニュートン法が一般的かと もちろん、 特殊な形だと特殊な方法があったりする
>>226 それは乗算と除算が逆なのでは?
除算は筆算流しか手はありません、乗算はいろいろなやりかた(カラツバ・FFT)があるようです
>>228 >除算はニュートン法が一般的かと
ニュートン法で剰余を求めることはできますか?
>>230 そりゃ当然出来ますよ
桁数が大きいときは、
除算は乗算の3倍程度の時間で出来ます
分子の桁数が大きくて分母の桁数が非常に小さい場合のみ筆算方式が有効 この場合も、 非常に遅い割り算命令なんかは使いませんが
>>229 >除算は筆算流しか手はありません
そうではありません。除算をCPUにある除算命令を使った筆算で行うには、x/y の
xのBIT数を増やすのは容易ですが、yの方のBIT数を増やすのは非常に難しいのです。
不可能では有りませんが、非常に数学的な注意が必要となります。
私は数学マニアみたいなものなので、自分なりのアルゴリズムを作ったことが
ありますが、個人的には、それをするためにはテーラー展開の剰余項や解析学的な
知識が必要だと思っています。
考えもしませんでしたが、他にも除算は、ニュートン方を使う流儀もあるそうです。
>>233 いえ、そうでもありません。テーラー展開の剰余項を注意深く扱うと、
CPUがもつdiv命令を使った筆算の場合でも、x/y の y の方のBIT数を
増やすアルゴリズムがありえます。何度も書いてますが、それは数学的に
とても慎重さを必要とします。
>>235 ただし、ニュートン法を使う方法については考えたことがなかったので、
どっちが効率が良いかは分かりません。
>>235 普通のPCのDIV命令は30サイクル近くもかかる
乗算は1~4サイクル
スーパーコンピューターでも除算は非常に遅い
>>233 の条件では
除算命令などは使わない方が速い
除算は乗算に置き換えるのが普通
分母、分子それぞれの桁数によって 最適な方法は変わる だからそういった条件をセットで語らないと意味がない
巨大な桁数同士だとニュートン法が速い 乗算の3倍ほどの時間で出来る 割り算を組み合わせたらそんな時間では計算出来ない
>>231 ニュートン法(にゅーとんらぷそん)って、曲線で与えられる関数の根の一つを求める方法でしょ?
いわゆる実数の根を求める方法であって、整数の剰余を求めることはニュートン法では無理なのでは?
何がどうなって「当然」なんですか?
>>241 で、その剰余はどうやって求めるのですか?
まさか、求めた商に除数をかけて被除数から引くのですか?それって遅くないですか?
>>243 本当ですか?わざわざ、あらためて掛け算をするんですよ?私には馬鹿みたいな方法にみえますが?
馬鹿みたいな方法にみえるのはあなたが馬鹿だからです
>>242 ニュートン法なので、
z = b / a の z を求めたい場合、直線 y = a * x - b と x 軸(y=0) との交点の
x を求めることによって行う。その際、x0, x1, ・・・, xn のように x を
漸化的に交点に近づけていく。数学的直感だと、その途中で剰余も求められ
るように出来そうな気がする。
>>246 色々なやり方はあると思うけど、2^m <= a < 2^(m+1) の場合、
x_{k+1} = x_k - (y_k << m);
y_{k+1} = a * x_{k+1} - b;
の漸化式でいけるかも知れない。
間違っていたらゴメンなさい。
>>246 その方法で乗算の3倍の時間で除算が出来ますか?
無理ですよね?
>>248 漸化式が三回くらい行ったら正しい答えに到達するのであれば、
乗算の三倍程度の時間で済むと思う。
何回で到達するかは、まだ考えて無いのでわからない。
>>247 ここで、0<= y_k < x_k が満たされれば、x_k が商、y_k が余りだと思う。
初期条件は、
x_0 = 1;
y_0 = a * x_0 - b;
とすればよいはず。
途中、y_k が負の値になることが有るが、問題ない。
分母の桁数があまり大きくないならテーラー展開も有効だよ
>>251 一般的な場合を取り扱うのであれば、その条件が、もっともらしいと思います。
ニュートン法を使うのは初めて聞きました。 とても勉強になります。
>>253 それで漸化式3回なんてことはあり得ないかと
○<< m とせずに ○<< (m+1) としておけば、y_k は負の数にならないかも 知れない。ただ、数学的直感的に、収束速度は、前者の方が速い気がする。
>>240 数年前にも「にゅーとんらぷそん」とか書いてた糞コテがいたんですが
もしかして本人?
文のレベルも頭の悪さもそれっぽい
八木アンテナを八木宇田アンテナと書かないのと同程度に ニュートンラプソン法とは書かないと思っているので 印象に残ってます
>>258 raphson の ph を摩擦音で読むか、有気破裂音で読むかは、選択可能かと思っていましたが
>>247 まず、シフトの向きが右で、正しくは、○>>○ でした。
>>260 何を指摘されてるのかわかってないwww
>>256 では、BIT SHIFT ではなく、浮動小数点演算にして、以下の様にすれば速くなるかもしれません。 (i) 初期条件 η = 1/a; // 多倍長の浮動小数点 x_0 = 1; y_0 = a * x_0 - b; (ii) 漸化式 x_{k+1} = x_k - (int_N)(y_k * η); y_{k+1} = a * x_{k+1} - b; 但し、int_N は、多倍長の浮動小数点を多倍長整数に直す cast。 #include <iostream> using namespace std; int main() { string str = "abc"; cout << &str << endl; cout << str << endl; cout << str.c_str() << endl; return 0; } VisualStudio2019のdebugとreleaseとで&strのメモリダンプ内容が異なるのはなぜでしょうか? debug : 78 f7 b6 00 61 62 63 00 release : 61 62 63 00
1/a が求まれば あとは乗算2回(と軽い演算)で剰余が求まるでしょ 漸化式にするまでもなく
>>264 デバッグ情報とか破壊検出用データとかじゃ?
>>265 細部までは分かりませんが、直感でなんとなく分かります。
aが32BITの場合なら、一度にほぼ、32BIT分計算が終わる気がします。
>>266 ありがとうございます。
ということはdebug版の呼び出し元(exe)とrelease版の呼び出し先(dll)
間ではstring型を関数の引数にするとバグりますね。
>>268 そうなりますね。
malloc() や new なども、Debug 版と Release 版ではライブラリに互換性が
有りません。Debug 版では、まさに、破壊検出用の埋め草のような物が入っていたり、
new を行った行番号情報が入っていたりします。
>>269 私は特に仮定はしていませんが、四倍浮動小数点型などに興味があり、
それを整数演算に置き換えて実装してみようかと思っていたりするので、
割る数も割られる数も同じくらいのBIT数の整数の場合に興味があります。
前に調べたところ、倍精度浮動小数点演算を用いて、四倍精度浮動小数点
の乗算、除算まで実装する方法があるようですね。ただし、その場合、
Intelの内部拡張倍精度(80BIT)方式をONにしていると駄目なんだそうですが。
>>272 4倍弱精度なら
Haswell以降で使えるFMA命令がとても約に立ちます
>>264 こっちで試した限りだと、debugとreleaseでコンソール表示の長さは変わらんかったぞ
x86とx64なら差が出たが
>>265 aがN BIT の場合、例えば、1/a を、64BIT 程度で求めた場合は、
(N / 64) (回) 程度の乗算が必要になりそうです。
1/a を高速に N BIT まで求めるアルゴリズムがありますでしょうか?
それ以前の普通の乗算でも出来るけど AVXでSIMD化出来るのでたくさん計算するならぜひ
>>273 興味深いです。教えていただければ幸いです。
>>274 メモリダンプという言葉をみおとしていた
スレ汚しすまぬ
>>275 私が何度か除算は乗算の3倍の時間と書いたのは
例えば100万桁同士の除算は100万桁同士の乗算の3倍な時間という意味
乗算命令の回数ではなくて
aが100万桁で1/aを100万桁精度で求めるのは
100万桁同士の乗算の2倍くらいの時間で出来る
>>277 {a_hi, a_lo} と {b_hi, b_lo} の乗算で
a_hi * b_hi を求めてから、
本当の a_hi * b_hi との誤差を求めるところ
c_hi = a_hi * b_hi とやってから
a_hi * b_hi - c_hi
をFMAでやれば誤差が簡単に求まる
fusedな3個の足し算命令とかもあると 加減算も簡単になるんだけど そんな命令は(他のCPU含めて)見たことがない
a=1+q の時: y/a=y/(1+q) =y*{1 - q + q^2 - q^3 + ... } =y*(1-q*(1-q*(1-q...))}
>>283 この式は、|q|<1の場合にだけ正しいので、 aをa=u*2^n (u = 1.0 + q)の形式に直してから 1/a = 1/(u*2^n)=1/(1+q)*2^(-n) = (1-q*(1-q*(1-q...)))*2^(-n) とするのですかね。 なるほど、qの精度を考えれば、乗算の回数は2個くらいまで で済みそうですね。 >>284 すみません、これだと二回では精度が足りなさそうですね。
多倍長の1/aの話なら
テーラー展開は遅すぎて使いませんよ
4倍弱精度の話であれば
除算命令やテーラー展開は使いますが
どれの話をしてるのかわかるようにかいてくれませんか?
>>238 の通りなので
>>286 多倍長の 1/a はどうやって求めたら効率が良いのでしょうか?
>>288 もしかすると、
y = 1/(a*x) - 1
と
y = 0
の交点をニュートン法で求めるのでしょうか。
初歩的な質問ですみません 2つのdouble型実数xとyを引数とし、x/yとy/xの大きい方を返却する関数を作成せよ。xあるいはyのときは0を返却するとする。という問題でコード書いてみたんですがうまくいきません どこが間違っているのでしょうか #include<stdio.h> double func(double,double); /*プロトタイプ宣言*/ int main(void) { double a,b; printf("実数をスペースで区切って入力してください\n"); scanf("%d %d",&a,&b); printf("%d",func(a,b)); /*呼び出し*/ return 0; } double func(double x,double y) { if(x/y > y/x) return x/y; if(y/x > x/y) return y/x; if(x==0) return 0; if(y==0) return 0; }
ありがとうございます 1時間くらい悩んでたのが馬鹿みたいだ
世にある仕事の数でいうと java:C#:C++が5:3:1くらいだな。
本当はね・・・constの逆が欲しいのさ デフォが書き込み禁止で許可を明示だったらと キャプチャのmutableみたいな
Pointという点を表すクラスがあって、2点間の距離を取得する関数を追加したいのですが、 double Point::GetDistance(const Point &p) const にすべきか、ただのCの関数で double GetDistance(const Point &p1, const Point &p2) にしたほうがいいのか迷っています。 設計的にいいのはどっちなんでしょうか?
>>303 下
Pointに必要以上の機能を作らない
下だな なんでもかんでもインスタンスに生やすのは厨臭くてダサいし、対称な操作は対象に見えるべき
>>304 ありがとうございます。
ですよね。前者の考えでいくと、いくらでもメンバ関数が増えそうな気がしていました。
下の方が、スカラー値等の既存型や配列向けの特殊化をし易いメリットもあるかもねー
下を造っておいて
operator - で下のを利用
>>309 と同じ
どちらも inline
ああ同じではないわ ベクトルの引き算はスカラーじゃなくてベクトル ベクトルの絶対値を定義する
ベクトルの加減算や符号は紛れが無いのでオペレータで実装 乗算は内積、外積と要素ごとの積の3種類あるので 関数にする 3次元ベクトルも作る可能性があるなら 2次元ベクトルだとわかる名前にしておく 可能性が無いならそのままで 絶対値やノルム、象限などをグローバルにするかメンバ関数にするかは一長一短 設計ポリシー次第
>>303 私も下
>double GetDistance(const Point &p1, const Point &p2)
を friend 関数にします、大事にするのは対照であること、です
>>187 メモリフラグメントを起こさないようにわざわざメモリプール切ってるのに
new/delete繰り返すオマエみたいなアホがいるからまともな製品ができねぇんだろww
>>315 ほーう?
メモリプールでフラグメントが防げるのかww
>>314 オペレータだとメンバ関数な実装多いよね
なんでだろう
RTOSを使うような小規模環境だと ヒープをしなかったりアロケートのみにしたりする そんな環境でもC++は便利なので使えるなら使いたい
OSレスでもC++が使えるなら使う 実際それで製品出した
対称が大事なのって、交換法則が成り立つ計算だから?
主役がはっきりしてる場合はメンバ 同等な重要度の時は非メンバ 私の場合はだいたいこんな感じ
対称性が特に問題になるのはオペランドの型が異なるケースだな 対称な演算a.op(b)をaのクラスに実装したらbのクラスにも同じものをコピペするのか? C#の演算子オーバーロードがstaticなのはそのへんが理由だとか Pythonなどのスクリプト言語では基本的にインスタンスメソッドとして演算子を実装するけど、 それは動的型故に事前に実装を解決できないからだね
>>317 かつて非メンバ関数のオペレータを名前空間の外から呼び出そうとするととても残念な気持ちになるからじゃね
オペレータオーバーロードを使うとカッコイイ気分にひたれるからだろ それ以外の理由なんてあるのか?
private変数の書き換えを伴うものだけメンバだな Pointが座標値しか持ってないようなのならコンストラクタ以外は持たせない
代入は普通メンバだろ = += -= *= /= [ ]も
>>303 これは後者が良い場合が多い。
型変換の対称性が絡むんだよ。
たとえば std::tuple<double, double> から Point への変換コンストラクタが用意されているようなとき、
メンバ関数として実装されていると左辺ではこの型変換が考慮されず、右辺では考慮されるということになる。
>>329 代入系と添字はそもそもメンバとしてしか書けない
>>332 >>328 に言って
>>331 対称性は関係ないって
Point * double
だって型変換された方が都合が良いなら非メンバだろうに
>>316 ほーう?
そんなことすら知らないのかww
>>334 ハッタリしかできることねえようだな
まあ、そうだろう
フラグメントが問題になるならアロケート専用で解放出来ないようにするとかそもそもアロケート出来ないようにするとか 固定サイズを頻繁になら独立させておけばフラグメントしない
ヒープはヒープで1個の研究分野になるくらい いろんな技術、方法がある
>>333 ???
理解できないのでもうちょっとくやしく
>>338 今回たまたま対称であったというだけで
対称性が理由じゃないってこと
ベクトル※ベクトル
ベクトル※スカラー
ベクトル※行列
ベクトル※矩形
なんであれ型変換された方が良いなら非メンバ
>>339 なるほど、一般化した場合の話になってるわけね。
begin()とend()があればRangeなんですか?
std::uint8_tってstd名前空間にあるけど、名前空間で修飾しなくても使えるのは何故ですか?
>>346 自分でusingしてなくても大丈夫ですか?
a[i] = b; みたいなのき a に対して a.setitem(i, b); するのと a.getitem(i) が参照を返す様にしておいて a.getitem(i) = b; するのと どっちが正解?
JavaのArrayListは a.get(i) = b; になってるので長いもんには巻かれろと思考停止で真似るだけ
>>345 #include <cstdint>は
#include <stdint.h>
つまりCのライブラリだからだ
typedef unsigned char uint8_t;
#ifdef __cplusplus
namespace std {
using ::uint8_t;
}
#endif
こうなっているだけだ
さすがに整数型にまでstdつけるのはうざい なのでcのヘッダーを使ってる
何の情報も増えないし紛れも何もない 意味の無い情報に5文字も余分に使いたくない 画面も入力の手間も
int8_t がcharで、std::int8_t がsigned char とか? それは御愁傷様
STL使ってスタティックビルドしてるコンソールプログラムあるけど、 ファイルサイズ 400KBぐらいだな。圧縮した状態で200KB これが20KBぐらいに減るのかー、でも誰も喜ばないだろうな。
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
>>350 >>350 cstdint 内の名前はマクロを除いて std に入るはず。
グローバル名前空間でも定義されるかどうかは処理系定義じゃなかったっけ?
逆に stdint.h 内の定義はグローバル名前空間でアクセスできるけど、
std 内でも定義されるかどうかは未規定だったように記憶してる。
仕様を読み返すのが面倒なので誰か調査よろ。
変数名をメモリやオーバーヘッド無しでエイリアスつける方法ありますか? メンバ変数に shared_ptr<Data> m_data; みたいなのがあるとして using text = this->m_data->member.text; みたいに使いたい変数だけ別名で取り出したい
現実問題としてCのライブラリをstdに入れるということ自体が馬鹿げた話だ 今の流れはuint8_tの話だが、extern "C"の関数は装飾名に名前空間が含まれない
>>358 一番簡単なのは、
auto &text = this->m_data->member.text;
とすることです。
>>360 現状それでやってますが、コンパイル時に確定できるのなら他に方法があるのかと思いました
>>361 そういう簡単なケースだと最適化でちゃんと消えてくれるんじゃね?
参照解決のコストすら嫌なら #define text this->m_data->member.text
むしろもとの書き方だと2度参照解決して3度足し算しているような…
textに実行時にアクセスするなら
いずれにしろアドレス計算は必須になる
>>360 のようにすれば
最適化がうんこで複数回計算されるのを防ぐ可能性すらある
アクセスしないならおそらく最適化によってアドレス計算コードは生成されない
m_data の型が shared_ptr<Data> なことを気にしてるのかな。 shared_ptr の指す先のメンバを参照変数でバインドするのは無作法か、とか。 と言うか、上の話は俺の疑問でもあるんだけど。
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 え?リリースするときスタティックリンクして配布するのかって? ダイナミックリンクするけど?
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 え?リリースするときスタティックリンクして配布するのかって? ダイナミックリンクするけど? え?なんで俺が笑われてるの?
constexpr定数とconst定数って結局何が違うの?
コンパイラに対する単なるヒント 優れたコンパイラでも糞コンパイラでも動きほ同じ 中途半端なコンパイラだと最適化のレベルがもしかしたら違うかも コンパイル単位にもよる
constexpr定数はコンパイル時に値が確定することが保証されている
>>373 constexpr定数はconstexprな文脈を作る。つまり、
constexpr int a = func()
とするとfunc()はコンパイル時に実行される。当然constexpr関数でなければならない
一方、const定数はconstexprな文脈は作らない
const int a = func()
とした時、func()は実行時に処理される。constexpr関数である必要はない
ああ、初期化に関数を使うと違いが出るんですね それにconstexprの場合は初期化が保証されていると ありがとうございました
constexprの強みは、配列のサイズみたいな定数を要求される文脈で使えるってこと。 const変数だとこれができないから、昔はマクロで定数定義するしかなかった。
>>378 C++ではconst変数も一部定数式扱いになってたでしょ。だから
>>373 みたいな疑問が出る。
大昔のC言語時代に考えた物だから 関数を使った初期化が出来ない時代の
>>383 std::set とか、内部は木じゃね?
汎用的な木?
ポインタのvectorで良くない?
Javaでも.NETでも標準ライブラリに木は無いだろ 木はメモリへのシリアライズの仕方を工夫せずに素直にノード毎にnewしてたら殆どあらゆるケースにおいてクッソ非効率なデータ構造なので、 標準ライブラリとして提供する意義が薄い 誤った選択肢を提供することで余計にパフォーマンスを低下させることになるだけだ
ダブルアレイを変形させて木を表現できないでしょうか。 子は親のIDを知っていれば良く、親は子の個数を知っていれば良いので、出来そうな気がするのですが。
だから形容詞には比較や数値をつけろってば それじゃ健康産業で不安を煽る悪徳業者そっくりだろうが
遅いlistやsetがstlに入っていて使われ続けてるんだから stlに入れない理由にはならないってことだよあほ
いやそんなもん使うやつらがそもそもc++使う必要がねーって話だわ
それはお前の個人的な意見? それとも何かデータでもあるの?
listやsetが適した用途があるから存在してるんだけどね 使いどころ間違ってるんじゃない?
同じ用途なら newやdeleteを使わなかったとしても 結局ノード作成時に空きエリアを探すことになるわけで
ノード追加専用のスペシャルlistやsetなら速くなるけど それはもはやlistやsetじゃない
プログラムのすべての部分で最速の選択をする必要なんて全く無いのに
>>392 みたいなことを言うやつはCかFortranで書けばいいんじゃないかな
>>394 残念ながら、setはともかくlistが適しているシーンは実際にはほとんどない
途中への少数の要素の挿入削除が頻繁にあって事前にその位置が分かっている状況などどれほどあるというのか
>>398 使いどころがわからないなら無理して使わなくて良いんだよ
>>397 10%の高速化なら無視すればいいけど
1000倍とかなら考えるだろ?
vectorとlistとsetの選択を間違えると
そのくらいの差が出る
データ数が多ければ
>>397 最速のものを使う必要はないがそもそもアルゴリズムオーダーが間違ってるようなものを
使うってのは頭悪すぎるし、なぜc++使ってんの?バカなの?ファッション?
って気にしかならん。
「そんなもん使う」なんて全面否定しといて 今さらアルゴリズムオーダーとか言い出すのは見苦しい
イニシャルコストとランニングコストがあるだろ 数か月~数年間止まらないようなソフトウェアだと初回起動時のデータ読み込み10億件・数分程度は誤差で済む
>>401 > 1000倍とかなら考えるだろ?
いや? 0.0001ミリ秒が0.1ミリ秒になったところで
大した問題じゃないからね
実害が出るかどうかはケースによるのに 全てお見通しの仏様か何かになったつもりのやつが変なことぬかすんだよな
>>409 1分と1000分なら大違い
トータル0.1ミリ秒なら何でも良いよ気にするな
データが多い時の話
オーダーが効いてくる
newの時間なんてオーダーの差に比べれば誤差
毎回newだから遅いとかトンチンカン
Boostにイテレータが安定なvectorがありますが、速度はlistに劣る場合があると但し書きがありますよ。
データ構造は list, set, リニア(vectorやdeque) で揃ってる これでオーダー的には大抵は問題ない 微妙な高速化が必要なら専用を自作すれば良いが 組み込みでもなければ必要となることはあまりない 複雑なデータ構造は、 標準のデータ構造を組み合わせて作る 複雑なリンク構造はSLAMの世界だとよく使う
メモリの再配置が起こると都合が(あるいは効率が)悪いオブジェクトを比較的頻繁にnew/deleteしつつ、 一覧を保持しておく用途にはlistが適していると思う。 あ、でも、本体をdequeに、ポインタをvectorに入れて管理する方が速いかな? バグりそうで恐いけどw
>>386 木をそこまで悪くいう人を初めて見かけました、大概のデータ構造は木だと思うのですけど…
下手くそが巨体な木を作るとひどいって話だろ 下手に作らなきゃ良いだけ
>>414 問題にならない用途、条件のもとで使う分には問題ない。
きみはあれか 「ライトバンはセダンにくらべると速度も遅いし馬力もないしとてもあんなもの使えない!」 とかいっちゃうタイプ?
一般的には、適切な二分木等で実装されたSetは、メモリ効率が悪いことはあっても速度のオーダーがひどいってことは無いだろ
C++11のstd::unordered_setに負けてる。
>>428 もしかして二分探索と二分木を混同してる?
木の枝を回廊にしたらグラフになります。 グラフはスパコンのベンチマークにされるくらいにメジャーな構造です。
>>411 自分で言ってるやん?
データが少ないときなら気にする必要はないので、
データが少ないとき用のアルゴリズムとして
「遅いけど便利」はあったほうが良いだろ
普通ハッシュ使うよね?とかそういう発想が皆無なのが、 ここは馬鹿しかいないってことを示してるよな。。
ハッシュを使うんじゃねえな
ハッシュをどう作るか?になる
perl5/hv.h at blead ・ Perl/perl5 ・ GitHub
https://github.com/Perl/perl5/blob/blead/hv.h cpython/dict-common.h at master ・ python/cpython ・ GitHub
https://github.com/python/cpython/blob/master/Objects/dict-common.h 木やグラフがほしいって言ってる人が、ハッシュマップや内部実装だけが木構造のコレクションなんていらんだろ。。
「木が欲しい」という要件に対して確認もなく二分木渡すような奴はダメ ディレクトリ構造表したい奴に二分木渡してどうすんだ
「木が欲しい」なんていう人には とりあえず何でもいいから木を渡しておけばいいんだよ
木は用途や使い方次第で適する作り方が異なるので 標準コンテナを組み合わせたカスタムで良いと思うよ
https://ideone.com/u8DxeY ほら~。あそこに見えるのがN分木のさんぷるだよ~。
デバッグしてないから酒の肴にぴったりだよ~。
C++11以降なら子ノードをweak_ptrの配列で持つとか?
>>444 言い忘れていたが、このスレから取得したN分木のコード(
>>444 )はMITライセンスです。
改造して変な構造を作ろう!
サンプルとかライセンスとか頭沸いてんのかこいつ 下痢便を神棚に飾って人に配るような所業
著作権表示は、 2019 Yakitori が必要なら使って。
オランダのTIOBEの調査でも、C#よりJavaやC/C++が人気で、 他の会社による日本での求人数もJavaやC/C++の方がC#より上だそうだ。 JavaScript、PythonやRubyは、求人数では大したことが無いらしい。 Webページを製作している人がネットでは多いので、JS、Python、Ruby などが人気であるかのように見えるだけかもしれない。
>>454 すまん。日本での求人数は、
Java, PHP, Ruby, C#, JS, Python, Objective-C/Swift, C/C++,
HTML, Android, Unity, VB.NET, Scala
だそうだ。ただし、C#から、C/C++ までは横並びでどれが上とも
いえない僅差。そして、Java, Python, Ruby は伸びているが、
PHP, C#, JS, HTML は減っている。
ところが、プログラマ側からの「希望言語」としては、JSがTOP
らしい。アメリカでの今後学びたい言語としては、Java, Pyhtho,
C++ は上位に来るが、C#, Ruby はかなり下の方。
>>455 個人的見解としては、VS code が 5ch で評価が高かったのは、言語が
TypeScript や JavaScript と HTML で記述されているので、JSで
プログラムすることを希望するプログラマが、JSの求人を増やすために
JS製の成果物を高く評価していたからかもしれない。
また、Javaの伸び率はかなり高い。Rubyの求人は日本では多いようだが、
アメリカでは少ない。C#の人気は、ある時期までは延びたが、今は停滞期
に入ったようだ。しかも今後学びたい言語としては、C よりも低い。
TIOBEの調査では、Java と Cの人気が同列で高く、Python がそれに続く。 また、CとC++を合計すると、Javaよりもだいぶ高い人気となる。 Java 16.2% (-0.50) C 16.0% (+1.64) Python 9.84% (+2.16) C++ 5.60% (-2.68) C# 4.31% (+0.36) VB.NET 4.22% (-2.26) JS 1.93% (-0.73) PHP 1.72% (-0.66) SQL 1.69% (-.15) Swift 1.65% (+0.20) Ruby 1.26% (+0.17) Objective-C 1.20% (-0.28) ・・・ D 0.927% (-0.64) Go 0.853% (-0.64)
今はもう戦力外技術者なんて即解雇だよ そもそも大手だと営業と技術者は別会社
比較するもんじゃないだろ C++は好きだが、在庫管理システムをC++で書けと言われたら全力で拒否してC#を推すぞ俺は
ほんとそれだな きみらはいつになったらライトバンとセダンの使い分けができるようになるのか・・
でもJavaはベンチとると速いんだけど、実際は遅い。 これ、リソースを食いすぎるのが原因なので、本当はサーバーよりクライアントに向いているんじゃないのかな。
ライトバンとセダン? スリッパと自転車と乗用車と飛行機とロケット くらい使い分けないとダメ
C++はメモリーの分断化があるので、長時間起動し続けるサーバーには向いていないと言われてるんだけど、実際にやってみたら全く問題なかった。 考えてみると、JavaプログラムをホストするシステムがC/C++で書かれてるんだから、本当に問題になるなら、Javaも無理なはず。
Androidは特に不満もなく動くので、Javaはクライアントでこそ力を発揮するような気がします。
メモリは潤沢にあるし アドレス変換もあるので よほど下手に作らなければ PCでフラグメントは問題にはならない そんな事を心配する時代じゃない 組み込みだと話は別
機種ごとの差を言語が吸収してくれるなら、こんな楽なことないし。 一方、サーバーは、サービス提供側が機種を自由に選べるのでJavaである必要が無いと思う。
>>469 比較的最近追加された
リアルタイム系オーディオAPIは
C/C++での提供ですね
用途によってはいまだにC/C++が必要
>>470 でも、フラグメントが・・・と言われると、なるほどと思うじゃないですか。
僕もいずれ別の言語で書き換えるつもりだった。
でも問題なかった。
>>468 それは完全に理解不足
Javaや.NETのVMはC++で静的に確保した大きなメモリ領域をヒープと呼んでいる
でアプリ内でnewするとオブジェクトとしてその中の領域が割り当てられ、ハンドル(生ポではない!)をアプリがオブジェクト参照として受け取る
C++のオブジェクトとの大きな違いはオブジェクトを再配置できることであり、
GCが必要に応じてヒープ上のオブジェクトを移動して詰めるため断片化が生じにくい
C++でも生ポを使わなければ再配置できるんだけどね
やってることがさほど変わらず100MB確保から1GB確保にするだけで 断片化率が1/10になる プログラミングの技量が全く変化しないのにも関わらず安全性が10倍になる つまりマシンの搭載メモリが1GBから10GBになるだけで安全係数が10倍になる これぞ大富豪プログラミング
>>474 windows3.1のGlobalAllocみたいのを今さらドヤられても…
>>468 実はかなり古くから、C/C++ の malloc(), new のヒープメモリから確保したメモリの
断片化は、実際に問題になるようなことはとても少ないといわれています。
というのは、断片化というのは、確保したメモリを開放したときに出来た
「隙間にある空きメモリ」が再利用されにくい場合に起きるものなんですが、
実際には、再利用されることが多いためです。なぜなら、おなじサイズの
オブジェクトを new することが多いためです。この場合、完全に再利用されるので
断片化の問題と言うものは全く起きないと言っても過言では有りません。
それから、通常、1つのオブジェクトのサイズは小さく、それが多数集まって
データをなしていることが多いのです。このことから、異なるサイズのオブジェクト
であっても、1つ1つのオブジェクトのサイズが小さいため、断片化したとしても、
再利用される確率が高いのです。まず、同じサイズのオブジェクトであれば再利用されます。
異なるサイズであっても、昔開放されたオブジェクトよりも、小さいサイズのオブジェクトを
新しく確保する場合であれば再利用されます。
このようなことから現実の例では、断片化しても、使われないメモリの量はある程度の比率
に収まると言われており、それは GarbageCollection を行うためのオーバーヘッドの
メモリのサイズと比べても余り大きいものではないのです。
ゲームはメモリー効率も求められますが、それでも C/C++ が使われているのは、
メモリー断片化の量が一定比率より多くなら無い事が経験的に知られているためです。
フェイスブックがPHPのコードを翻訳機でC++コードに変換して配備してるそうですが。 そんなことするなら最初からC++で書けばいいのに。
>>474 C/C++ では、配列ではなくリンクリストを積極的に使うようにすることに
よって、メモリーが断片化しても再利用される確率を高くすることができます。
というのは、データの基本となっている要素のオブジェクトのサイズが
小さいため、さまざまなサイズのデータを new しても、結果的に、
断片化された空きメモリも高い確率で再利用されるためです。
new、delete するオブジェクトのサイズがランダムな場合で、
断片化空きメモリが残っている場合、確率論的には、おおよそ 2回に1回は
断片化空きメモリが再利用されることになるでしょう。もちろん、
delete された回数が少な過ぎる場合、そもそも断片化空きメモリの個数が少なすぎる
ので、再利用できる確率は低くなります。それは、初期化時やファイルからデータ
読み込み時などにどんどんメモリを new していくよう場合ですので、そもそも
断片化が起きる余地も有りません。
なお、ポインタとリンクリストを組み合わせると、よくある場合には、他の
集合アルゴリズムよりも、効率が高くなりやすいことが知られています。
ただし、文字を集合させて文字列を作るような場合は例外です。
>>481 配列の場合、delete するとメモリー上に大きな空き領域が出来ますが、
それより大きなサイズの配列を new しようとすると、そこが再利用できません。
なぜなら、配列の場合、連続したメモリ領域が固まって必要になるため、
要素の個数が N だとすると、N 個全てが一度にまとまって入りきる領域を探す
必要になるためです。
ところが、リンクリストの場合、要素数 N が大きくなっても、バラバラな
領域に分散して格納することが出来ます。すると、とても高い確率で、
分断化された空きメモリが再利用されることになります。
>>481 「2回に1回」と書きましたが、実際にはもっと確率は高いです。
リンクリストを使っている場合、要素を全部 delete したような場合は、開放された
空きブロックは、余り断片化せずに、比較的高い確率で結合され、大きな空きブロックに
なるためです。空きメモリは、元の要素のサイズの複数個分以上になっている確率が
高くなります(複雑ですが、管理領域のサイズもこれに加わります。)。
この性質があるため、現実には、小さいサイズのオブジェクトを要素とする集合
が多種類有った場合、それを好きに new, delete した場合、50% よりずっと高い確率で
断片化空きメモリーは再利用されます。
>>483 誤解無きように細くしておくと、「50% より大きい」というのは、
「断片化された空き領域が再利用される確率」
のことで、「断片化率」ではありません、。断片化率はもっと
小さな値になり、条件によりますが、例えば、数%~10%程度
が目安になります。最悪のケースだともっと大きいのですが、
ケースバイケースで適切なデータ構造(集合アルゴリズム)を
使っているとこの程度に収まります。また、適切なデータ構造を
選択することはそんなに難しいわけではありません、。
>>475 既に、Windows95くらいの時期のメモリ容量で、C/C++のメモリ断片化は
問題が無い程度になっていました。実際には、MS-DOSの時代でも既に
問題なかったのですが。
とにかく、今の若い人の目線で言えば、古代ともいえるくらい古い時代に
既に C/C++ のメモリー断片化問題は問題が無い程度にハードウェアが
発達済みなのです。PC-8801 の 8BIT 時代には問題があったので、
N88-BASIC を筆頭に、GarbageCollection 方式をとっていましたが、
それは、若い人には「超古代文明」時代でしょう。
>>485 また誤解が入りそうなので細くしておきます。
N88-BASIC などが GarbageCollection を使っていたのは、本当に
マシンのメモリが少ないのでデータをぎゅーぎゅー詰めに隙間無く
入れることが重要だったためです。
一方、JavaやC#がGarbageCollection を使っているのは、どちらかと
いうと、「メモリー開放の自動化」のためです。参照カウンタだけで
は、循環参照問題が生じるため、時々、広い範囲のメモリブロックを
巡回して、循環参照していても本当に使って無い場合を厳密に見つけ出して、
徹底的に開放することを行います。
そのため、メモリーの断片化問題とはまた違う意味で、メモリー開放の
自動化には、GarbageCollection が必要となっています。
N88-BASIC 時代と、現在の Java, C# とでは、同じ GarbageCollection
でも主な役割が違うと考えられます。もちろん、断片化を防ぐ役割も同時に
果たしてくれますが。
>>486 誤字訂正: 細く ---> 補足
・BASIC言語にはポインタが無かったので、循環参照問題は有りませんでした。
・BASIC言語における GarbageCollection は、主に文字列領域の開放のためです。
A$="HELLO WORLD" と入れた後、A$="" とした時、元の文字列に使っていた
領域は、しばらく経った後に GarbageCollection で開放される仕組みでした。
ですので、文字列を余り使わなければ GarbageCollection も余りおきませんでした。
なお、DIM A(100) のように確保した配列は、余り開放することは有りませんでしたが、
開放した場合も、しばらく後に GarbageCollection の対象になっていたと思われます。
リンクリストってシーケンシャルアクセスで毎回キャッシュミスするから、 配列の代わりに全面的に使ったりしたら断片化とか最早どうでもいいレベルでパフォーマンス低下するぞ
>>488 リンクリストでシーケンシャルアクセスする場合、キャッシュ以前に
ポインタをたどるようにアクセスしないといけないのですが、
最近、配列と同じような通し番号方式でアクセスしようとする人が
多くなっています。ライブラリなどは、以前にアクセスした番号が
k の場合、そのポインタを覚えておいて、プログラマが k + 1 の番号
をアクセスしようとした場合、後続のノードへのポインタをたどる
ことで高速化している場合があるので、特に問題が無い場合がありますが、
それを深く理解せずに、本当に先頭のノードからたどってしまった場合、
本来なら O(N)で済むところが、O(N^2) になってしまいます。
>>489 C/C++ でのリンクリストは、場所を覚えるのは通し番号ではなく、ポインタ
で行うことが基本です。ところが、最近、通し番号で覚えてしまうプログラムを
書く人が増えているように感じます。それは、キャッシュのために遅くなっているの
ではなく、計算オーダーが完全に違ってくるために遅くなるため、ただごとではない
遅さを招きます。
>>487 循環参照問題の有無はポインタ(アドレス)とは関係ないでしょ。
ハッシュテーブルで要素Xが既存要素Yと衝突した場合でもXを格納したい場合は リハッシュかリストになる キモス リハッシュで容量をちゃんと使い切るには相当にハッシュ関数を考えねばならない上に 衝突データを取り出すのに何回リハッシュしたかを見ながら要素をたどっていく必要があり、 ハッシュの検索性を帳消しにしてしまいかねない よってリストのが圧倒的に簡単で速い
>>493 ある
ガベージコレクト対象データでもって他のガベージコレクト対象データを指し示すような
再帰構造が表現不可能なら循環参照は当然起きない
N88-BASICの文字列はキャラクターの集まりであって他の文字列を指し示したりできないから、
相当の無能か悪意を伴って設計しない限り、文字列メモリのガベージコレクションで
循環参照は起こしようが無い(やるべきことは素のmalloc/freeに他ならない
>>496 >>487 で自分で書いているように配列がガーベジコレクションの対象になっているなら、循環参照は起こり得るんでないの?
まだやってたのか うんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんち うんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんち うんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんち うんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんち うんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんち うんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんちうんち
C++20あたりになるともうついていけそうにないな。
conceptの仕上がり次第だろうな Cのrestrictもそうであるように うるさすぎると嫌気がさすやつが続出する
実際にコードを書いてないやつほど仕様を知っててアホみたいなこだわりを見せる ってことが常態化してる。 そろそろロクでもない結末を迎える。
並列処理じゃないですかねこれからは マルチなコアをもりもり使えないと
>>502 仕様を知ってるのは良いけど
コードを書いてない人は気にするところがズレてる
コンパイラやパーサーを作っているか、本を書こうとしている人だとすれば 隅々まで仕様を知る必要があるから、単なる自己満足の言語ヲタクとは 限らない。
コンパイラやパーサを作ってる人よりも 本やブログを書くだけの馬鹿のが変な仕様にこだわってるのが問題。 後者は単なる自己満足の言語ヲタクと変わらん。 端的にカスでいなくなった方がいい存在と思う。
>>506 自慢するために言語ヲタクになっている人は困るけど、本やブログを書く人は
貴重なので、情報収集のため5chでもなんでも使ってもいいと思うんだよ。
現場でガリガリ書いてる奴らが本を書かないのが悪いんだろ えっ、ブラック労働環境で疲弊してて書く余裕がないって?w
ブログはともかく5chの情報を元に本を書くとか 勘弁してくれ
>>508 解説本みたいなのは読まんな
規格書、データシート、仕様書、リファレンスマニュアル
こんなのは5chを参考にするはずがない
>>509 全く知識が足りて無い場合、知ってる人に聞くと大幅な時間短縮になる事がある。
>>508 現場でガリガリって、コンパイラ開発してるとこのか?
そうでなければ普通言語の仕様なんか気にしてねーんだよ
むしろ仕様というか規格に詳しくないと使えない言語とか実用性無いわ
>>508 あとお前が知らんだけで、各分野の経験豊富な人がいくらでもその分野のコードを書くための本出してる
言語オタクには気付かんだろうけど
>>911 全く知識が無い人が本を書く????
何の本?
アンカーミス?
>>514 考えてみれば、本を書く人はここでは聞かないかも。
Stroustrap の本とか高いし、cpprefemceは分かりにくいし、誰かに 聞いてみたくなる気持ちは分かるがな。
>>513 C++のコンパイラ分野でいいので2~3冊あげてみ
けっ 言語についていけねえうえに ろくな業績も出せてねえ真性ゴミクズが 書いたコードの量が多いんだと 精一杯のブラフで自我を保とうと必死こく 究極にくだらねえ茶番だろうが
禿4はわかりやすかったけど、もう少し突っ込んだ話が読みたかったな。
禿4は量が少ないわけではないがc++を今からやるとしたら最低限ああなるだろ。 あれ以下に減らすのは実際無理。
>>518 そういう意味で言ったんじゃないんだが
>>519 >けっ 言語についていけねえうえに
>ろくな業績も出せてねえ
こういう前提はどっから来てんのかね
>>502 ,506 ,512みたいなことを言われるとそういう過剰反応するやつよく見かけるけど
>精一杯のブラフで自我を保とうと必死こく
>究極にくだらねえ茶番だろうが
鏡見た方がいいよ
>>524 違うんなら証拠出してみろよ
言ってることが薄っぺらくてゴミクズにしか見えねえが
そういう俺にお見それしましたと言わしめる内容がおまえにあるか?
身バレするようなことでなくて結構だ
話している内容に深みを感じるかどうかだ
もう一度言う、おまえの言葉にはそれがまるでない
>>524 > そういう意味で言ったんじゃないんだが
意味わからん
本を出してるって言うなら具体的に挙げられるよね?
>>525 お前も感情的に攻撃的に相手を罵ってるだけで、中身空っぽに見えるぞ。
お前の自己評価はもっと高いのかもしれないけど端から見たらただのバカだよ。
「現場でガリガリ」って可愛い表現だなw アマチュア精神がにじみ出てる
お前らがC++高等テクニックww持ってるのは分かったから まずまともな設計上げてこいやww
経験マウント vs 知識マウント 実に人格障害のC++erらしいスレだ
>>535 多分、C++の仕様が異常なほど膨れ上がってること、JavaScriptやWebGL、
AjaxやC#なども勉強しなくてはならない事が多くなったことなどもあって、
プログラムを沢山しながら仕様にも詳しい人は壊滅状態であることは想像に難くない。
>>536 というか、普通にプログラムしていても、HTML、CSS、HTTP などの仕様はもちろん
のこと、Androidやるなら、Java、Kotlin、NDK、iOSやるならSwift、
それに加えて、C#なら、WinFoms、WPFなどもあり、さらに、WSL、
PowerShellにbashやApacheの設定方法、ライセンス各種の勉強などなど、
やることが多くなってきている。本当は、React、Blazor、Vue.js、node.js
Electron、flutter、wxWidget、Qt、GTK。別に全部やる必要はないが、
予備知識として知ってないと技術資料も理解しにくいことが多くなってきた。
自分の得意分野以外は浅く予習しておいて使うときになって覚えて使わなくなったら忘れてる
>>537 Python、Rust、Lua、curl、ant、gradle、git、github、wget なども知ってない
と話が理解できないことも多くなっている。
今時コードだけでプログラミングするもんでもあるまい C++使いならフロントはばっさり切り捨ててAWSとGCPにスキルを振ったほうが一貫性があり無駄の少ないスキルセットになる
std::cout での出力フォーマット指定に関して教えてください。
cout.flag( ios::uppercase | ios::hex ) やら cout << setfill('0') とか
cout << scientific << setprecision(10) とかとか
大半の指定が 1回 数値 を出力した後も その状態が保持されたままなのに
cout << setw(24) による出力幅指定は その都度指定しないと忘れてしまう挙動になっています。
その都度指定する必要は他にもあるのか。それと、
http://www.cplusplus.com/reference/iomanip/setw/ みたいな仕様を見て、どう読み取ればそれが正しい挙動であると分かるのか教えてほしいです。
ある個人ブログには setfill も毎回出力する度に指定する必要があるのだと書かれていましたが、
自分の環境では setfill は状態が保持されました。
フロントエンドは本当に時間の無駄 ましてC++プログラマならほとんど領域が被らないから単なる二足のわらじ状態で非効率なだけ
>>529 読解力が無いのか
>>508 と同じく言語オタクだから気づかないのかわからんが
>>508 と
>>512-513 読み直してくれる?
C++の言語仕様を詳しく解説する本を、コンパイラ”以外の開発に携わってる”人間が書いてくれると
思ってる方がおかしいんだよ
>>508 の目には純粋にC++関連の本しか映ってないんだろう
C++を前提としてるがC++そのものでなくその分野の専門的な知識を教えてる技術書がどれだけあると思ってんだ
>>525 >えっ、ブラック労働環境で疲弊してて書く余裕がないって?w
こんな腐りきった発言する思い上がったゴミアマチュアに教えてやることなど何もない
お前が使ってるその箱で動いてるソフトは誰が書いてくれてると思ってんだ
そもそも現場の奴らは、現場のやり方しか身につける必要ないだろw
>>545 各分野にコンパイラ開発は入らんのか?
まあお前の好きな分野でいいから具体的な本の名前挙げてくれ
>>548 挙げたらどうなんの?お前には興味ない内容だと思うけど
「ド素人が言ってんだろ」と思ってるんだろうけど、お前の誤解を晴らすためになんで自分の分野晒さなきゃいけないの?
本の名前挙げたら謝るの?
>>546 実際そうだと思うよ
>>512 にも書いたけど、仕事でやってる人もフリーソフト開発者も
規格読んだことある人なんか皆無だと思うよ
他に勉強しなきゃいけないこと山ほどあるし、仕様(新しいのも含め)は必要なときにググって確認するだけ(
>>538 も言ってるけど)、むしろそうであるべき
それを「言語についていけない」なんて貶せるやつの神経がわからん
>>519 とか、ソフト開発もメタプログラミングも出来ないレベルのド素人だろ?
何調子乗ってんの?自分はついていけてんの?w
開発力も無いし言語を活かせてもないのに、実際にC++を実用してる人を貶すとか
頭おかしい真似してるから言語オタクって言われるんだよ
(C++専門のライターも最近そういう傾向あるけど)
>>547 それはそれでどうかと思うけど
>>541 直接的な回答でない上に長々しい文章で気が引けるけど…。
『プログラミング言語C++』第4版の38章「入出力ストリーム」で
「width(n)の呼出しは、その直後に行われる<<による出力だけに影響を与える」
と書いてあるね(p. 1094)。
setw() は「次の出力のフィールド幅をn文字とする」(p. 1096 の下の表)
表の説明で“次の出力の”と限定されてるのはsetw()だけ。
で、一般的に書式指定やマニピュレータのうち、
どれが「一度指定したら別の指定をするまで有効」で、
どれが「指定された次の出力だけ有効、その後デフォルト状態に戻る」なのか、
N3337 の 27.5.3.2 周辺を見ても分からなかった。
基本的には
http://www.cplusplus.com/reference/iomanip/setw/ よりも
少ない記述内容だし、「この指定は直後の一回の出力に限り有効」みたいな
補足の説明も見当たらない。
ISOやJISの規格に詳しい人が「素人め、ここに載ってるんだよ」と
ズバリ指摘してくれるのを期待して、調べた限りを投稿してみた。
>>549 他の分野の人にどういう説明してるのかを知りたかっただけなんだけどね
まあ
>>525 が言うように薄っぺらな知ったかが吠えてるだけってわかったからもういいやw
>>541 setfill() じゃなくて setw() の話だけど、古い本に
「setw()の幅指定は、永続的に有効な実装と、直後の出力1回だけ有効な実装との
両方が存在するので、移植性を考えれば毎回指定する方が安全」とか載ってた。
もしかすると過去には「setfill() は1回だけ有効」な実装が存在したのかも知れん。
その後、規格で挙動が厳密に定められたのか、
今でも実装によって動作が違っても構わない(規格に明記されていない)のか、
肝心なその点は分からん。
>>552 言ってる意味がわからんが
煽れば何か教えてもらえると思ってるアホだろ
今までお前に何度も言ったと思うが、邪魔だから出てってくれ
>>550 他に勉強しなきゃいけないことって具体的に何だ?
インターフェースだの通信規約だの法務だのを
規格を避けて勉強なんかできるのか?
そういうおまえ自身は本当に勉強してるのか?
>>555 一連の流れ読んでから言えよ
C++の規格や仕様の話だボケ
>>556 おまえこそどーに目ぇつけとんのやあんだら
C++以外の規格なら読むんだって話じゃねえだろうがよ
>>557 >C++以外の規格なら読む
誰がそんなこと言った?
他に勉強しなきゃいけないこと、に含まれてるだろうが
自分の勘違い棚に上げるなよ
>>557 550は規格を読んだことがあるやつは皆無と言ったんだよ
それがC++だけにせよ規格全てにせよ
おかしい主張であることに変わりはない
自分の発言を読み返してみな
俺がわざわざ頓珍漢とか言ってやることもない
お前はC++の標準ライブラリ等の仕様の確認に毎回規格書読んでんの?
>>551 ,
>>553 ありがとうございます。
今「C++ポケットリファレンス」を見たら
ほかのマニピュレータと異なり、std:setw()は例外的に効果が持続しません。
一度std::setw を指定した出力が行われると効果は解除されます
(std::setw(0)を呼び出した状態になります)。
とありました (p.250)。
それと...
$ man std::setw
~
The width property of the stream will be reset to zero (meaning "unspecified") if ~
ちゃんと書いてますね。何より先に man を見るべきでした。
とはいえ setw は "例外的" なのだとちゃんと教えてくれる本は助かるなあと思いました。
それから man の最後には
http://cppreference.com へのリンクがありました。
あまり www.cplusplus.com との違いを意識した事はなかったのですが、
公式仕様として参照するべきなのはそっちのようですね。
同じ内容の日本語版は
https://ja.cppreference.com/w/cpp/io/manip/setw で見れました。
>>561 え? ・・・そうだけど?
規格票というか、正確にはドラフトな
何かおかしいか?
それ無駄に時間かかってるんじゃないの よくクビにならないな
1.禿でも判るC++入門 2.判ると禿げるC++入門 3.禿専用C++
>>554 煽る以前に
>>513 からはペラッペラの内容しかでてこないことはわかったからお前が出てけよw
>>561 必要なら読むだろ
流石に毎回じゃないけど
そもそもお前は規格も読まないでテキトーにコード書いてるのか?
>>569 >流石に毎回じゃないけど
なら黙ってろ
規格の原文読まない=テキトーにコード書く、なのかお前の中では
思い上がりすぎだろ
いや、きちんと仕事したくて 伝聞に頼らず一次ソースを確認するんだよ
実用コード書くより机上の空仕様書描くのが好きな人なんやろな
>>570 > 規格読んだことある人なんか皆無だと思うよ
とか言うバカに言われてもなぁ
知識がペラッペラすぎるw
「きちんと仕事したくて伝聞に頼らず一次ソースを確認」 なんか胡散臭くなってきたな・・・・ 「仕事でやってる人もフリーソフト開発者も」のどちらにも当てはまらないのに噛み付いてきたんだろうな エアプログラマの相手してスレ無駄遣いした、すまんかった
ソフトエンジニアでC++の規格書を読む人なんてほとんどいないよ そんなのを読んでも良い設計にはつながらない
規格書で確認しないと書けない/読めないようなコードは 基本的には悪いコード
規格書ではなく規格票な つまらん齟齬を避けたいのも 規格票を読む目的の1つだ
>>578 でも最近、特に海外の方で自分が知っている素朴な C++ とは全く違う
書き方をしている C++ コードを良く見かけるようになったので、
新しい仕様を学ばないと理解できなくなってきた。
STLを深く使うと C++ とは思えないようなコードになるので。
フロント周りは全くついていけない コロコロと次から次へ節操なく移り変わって馬鹿じゃねえの、とつい老害的思考に
C++20でコンセプトやモジュールやコルーチン記法が入ってきたら、そういう古兵にはもはやC++には見えんだろうなぁw
フロント企業が一般消費者と直接取引する会社で、バックが暴力団じゃなかったっけ。
企画書を読まないとわからないコードなんかあると思ってるのか? 読むべきはcppreferenceのようなアホにも分かるように優しく解説してくれてる文書 分からないことがあれば必要なキーワードを検索欄にぶち込んだらすぐに分かるようにできている
プロでもアマチュアでもいいんだよ 初心者でも学生でもいいんだよ ただし 身の程知らずのド素人が知ったふうな口を利いてるとさすがに叩かれるよ
>>577 > ソフトエンジニアでC++の規格書を読む人なんてほとんどいないよ
お前の周りはそうなんだろうな
> そんなのを読んでも良い設計にはつながらない
読んだことない奴はそう言うよなw
>>578 お前規格票に何を書いてるのか知らんだろ
まあそのまま沈んどけ
ていうかC++のスレでこんな流れが加速するなんて 思ったよりC++erて数いたんだなぁ、というのが素朴な感想
> 思ったよりC++erて数いたんだなぁ、というのが素朴な感想 C++erというよりここは単に無職と学生サンのすくつでしょw
c++11以降みたいなああいうコード書きたいなら変な見栄はらずにpythonでもrubyでもやってたらいいんだよ。
C++コンパイラやSTL準拠ライブラリを作る仕事に関わってたら規格書を読まないとどうにもならないと思うけど、 そうじゃない人は市販のC++入門で十分じゃないかな。
>>596 金型の会社に出向いて定期的に講座やってるらしいね
金型の演算ってそんなC++が効くものなんだ
CGALみたいに幾何分野でバリバリ使われるのは知ってるけど、設計の分野も同じなんかな
てか規格通りにまともに動くなんてのは例外ってことは 普通にc++を仕事で使ってりゃ分かるもんだがな。 その時点で江添みたいに実際の仕事で使ってないのが丸分かりになる。
>>598 どこからそんなアホな決めつけしてるんだよ…
もしかして会社からセミナーとかにも行かせてもらえないような底辺なのか?w
必要なら読むし必要じゃないならないなら読まないってだけのことだろ。 そんなん場合によるっつーつまらん結論しかないと思うが。
実の無い(楽しそうでもない)話をつづけられるよりはクソ正論で鎮火してくれたほうがマシに思う。 件の人たちはそれで鎮火するような人でもないんだろうけど。
互いに見下しあい罵倒しあってこそC++er ここは不毛なマウント取り合戦の場C++スレ 鎮火する必要なし
すまんが、レベルの低い人から見ると、レベルの高い人が気軽に話した 内容が「マウントをとられた」と思ってしまうんだと思う。 そういうつもりで言ってなくても。 これは、公立の小学校でよく起きる現象で、問題になっている。
>>611 蛇足だが、これは欧米諸国でよく知られた現象。
アメリカで記名製掲示板が流行るのは、匿名性掲示板ではどうしても
それが起きてしまうので、それをよく分かった上でやっているのかも
知れない。それだけの理由ではないだろうけど。
>>609-610 この流れを評するのに「不毛」って言葉を選ぶのはC++らしいね。
「マウント」も落語「頭山」を想起させる。
しかしあれだな、C++ほどハゲがよく似合う言語を知らない
江添亮のC++入門 (webドラフト版?
https://ezoeryou.github.io/cpp-intro/# 再帰関数 )
を読んでます。
>例えば以下は階乗を計算する再帰で書かれたループだ。
> int factorial( int n ) { ...
> return n * factorial(n-1) ;
> ...
>このコードは末尾再帰になっている。
>末尾再帰は非再帰のループに機械的に変換できる特徴を持っている
これ factorial(n-1) が返ってきたらスタックに積んである n を掛けないといけませんよね。
厳密には末尾再帰とは言えない気がします。
そういうの無しに「直帰でコール元に値を渡せる場合」に末尾再帰と言えるのだと思ってたんですが、
私の理解が間違っているのでしょうか?
まあ今のコンパイラーは賢いので細かい事気にする必要ないのかもしれませんが。
>>611 馬鹿ほどそれを気にするよな
判らなかったら調べれば良いのに
調べずに反論し始めるω
>>617 ですよね。
ちょっと気になってたのでスッキリしました。
簡単にループに出来るものはループで記述した方が良いよ 末尾再帰の場合もそうじゃない場合も 実行速度、使用リソース、 デバッグしやすさ、 スタック計算ツールなどツール類の使用、 などなどいろんな要素で
>>619 本当は、再帰呼び出しだとスタックサイズの制限により呼び出しの深さ(階数)
に制限が付いてしまう。ローカル変数を沢山使っている関数で、
1000万個のオブジェクトを再帰的に処理すると、スタックオーバーフロー
が出てもおかしくない。しかも、最近のマルチスレッド環境だと、
スタックのサイズはどうしても制限が強くなり勝ち。
「最近のマルチスレッド環境」はあまり関係ない 固定スタックサイズの組み込みCPUの方がヤバい PICみたいなハードウェアスタックだともっとヤバい
検討事項が増えるから仕事で再帰は使わんね。 理解できない人も多いし。
>>622 シングルスレッドだと、スタックは自動伸張することが可能だった。
ところが、32BIT のマルチスレッド環境だと仮想メモリ空間のアドレス
空間自体が不足してしまうので、それは難しい。
ただし、64BIT 環境だと仮想メモリ空間が大きいので余り問題にならない
かも知れない。
再帰の例でよくでてくるフィボナッチ数列の計算なら 再帰より for で二変数保持しながら計算した方が性能でも可読性でも上だろうな。
>>624 Windowsだとスタックサイズは32bitでも64bitでもデフォルト1MBだぞ
適当な事を言わないように
>>625 組み込み型サイズ程度だと普通にexpを使って計算する方が速い
多倍長の巨体な値でも
素直に1個ずつ計算すると非常に遅い
もっとずっと高速な方法がある
再帰をループに置き換えるので面倒なのは いろんな箇所でたくさん分岐するヤツ まあでも面倒ってだけで、 必ず再帰を使わずに記述出来る
treeを辿るコードなんかは再帰のが書きやすいわな。
treeをたどるコードは再帰コールするのが1箇所だからまだ楽な方
>>629 Tree は再帰でやるべきものの一つ。
スタックの制限も、Treeの「段数(階数)」自体が余り深くなりにくいので
問題が生じにくく、再帰でやっても問題ないものの一つでもある。
ただし、親子関係の深さ方向だけを再帰にし、兄弟方向は、単純な
ループを使うべき。
再帰にすべきかどうかはものによる 例えばstd::setの検索は普通ループを使う
フィボナッチとかで再帰 末尾再帰を捨てる(性能とスタック無駄遣いに目を瞑る)と可読性はかなりいいと思うんです。 int fibo(int n) { if (n<=2) return 1; else return fibo(n-1) + fino(n-2); } その場で使い捨てるようなプログラムにはアリだと思います。 でも末尾再帰を目指すと.. . . int fibo(int n, int a=1, int b=1){ if (n<=2) return b; else return fibo(n-1, b, a+b); } どうなんですかね. . .。Lisp脳だと forループより好まれるかもしれません。 ちゃんと末尾再帰最適化が効けば性能は良いのでしょう。
>>633 前半
見やすさはそれが一番だね
記述が定義通りなので
後半
それなら普通のループの方が分かりやすくないか?
あちら(Lisp)の世界ではそうでもないみたいですよ。
C++てparallel_forとか未だにないんだな、まぁTBB使えばあるけど標準規格には用意されてない 仕方がないんでPartitionerは自前で作ったが、そんな付け焼き刃用意したところで、 いちいち明示的に各スレッドの終了の待ちあわせせにゃならん。 挙げ句の果てに mtx.lock() ---- mtx.unlock() て orz クリティカルセクションはブロックで囲って lock(mtx){ } とでも書かせろや オートunlockとかしょーもないもんは用意してバカじゃねーのか しかも、未だにasync/await はなくて、C++20で実装て。 何が必要かわかってないのかC++規格作ってるアホ共 死ね
adync awaitなんてネイティブで実装しようとしたら面倒なのわかるだろうに それでもぶっこんでくるのだからc++11以降は完全にポリシー変更しているよね
>>637 std::for_each(std::execution::par, ...) じゃダメだったの?
ツリーの巡回はイテレータにするとスタックとキューを入れ替えるだけで深さ優先と幅優先を切り替えられますよ。 STLのスタックとキューはインターフェースが違うのでひと工夫必要ですが。 algorithmも使えてウマウマです。
おいおい そこはcpsで書いてマウント取るところだろ
>>637 お前のそのクソコードlockとunlockの間で例外投げたらあっという間にデッドロックだぞ
すぐにlock_guardに書き換えるか死ぬかどっちか選べ
状況説明: Visual Studio 2019 Version 16.4.0 で std::exception::what() の戻り値を無視すると以下のようなC4834の警告が出るようになった。 > warning C4834: 'nodiscard' 属性を持つ関数の戻り値を破棄しています なお、catchスコープでeについて何か書かないと以下の警告が出てしまう。 > warning C4101: 'e': ローカル変数は 1 度も使われていません。 今は以下のように記述して警告C4101が出ないようにしている。 try { // do something. } catch(std::exception& e) { e.what(); } 質問: C4101とC4834の両方とも出ないようにするにはどうしたらいい?
自己解決しました。 try { // do something. } catch(std::exception& e) { (void)e; }
catch(std::exception&) でええやん
>>645 ほんとうに例外を何も処理せず握りつぶしたいの?どんな状況?
>>649 マクロ切り替えでeを使うコードも使えるようにしておきたいので無名変数だと都合が悪い、という感じです。
VCは2019から返り値を捨てるコードに警告出すようになって鬱陶しい
[[nodiscard]]を確認せずに捨てる奴が悪い
>>651 std::exception& で受けると bad_alloc とか関係ない例外もまとめて無視しちゃいそうで、
それは「安全」なのか疑問。
>>655 どうせなにもできない事には変わりないので無視でいいかなと。
スレッド終了時にプログラム固有のリソース解放処理を確実にやりたい目的でのthrow&catchなのでC++標準ライブラリ自身の出す例外は無視、的な。
>>657 それだとほんとに何か問題があって例外が飛んでるときに気づけなくて危なさ沿う、という話。
struct thread_exit {} とか専用の例外をthrow&catchしとけば、目的を達成しながら問題検出もできそうな。
>>637 for_each(parあんじゃん
いちいち待ち合わせなんて
まだやってんの?
>>644 てめえの糞おつむでは未だにlock_guardなんか使ってんのかよww
んな互換性のためだけに残ってるコード人様に勧めてどーするつもりだ。
>>635 LISP では再帰で書くなどという俗説を信じるな。
もしかしてメンバ関数の定義で引数や戻り値に不完全型を使っても許されるようになりましたか? autoが許されるのだから、許されて良いような気がするのですが。
厳密にはわからんけど、クラステンプレートやメンバ関数テンプレートだと それらが実体化されるより前であれば不完全型は使えるはず(コンパイラによっても変わることあるけど autoも似たような理屈だと思う、宣言だけして関数定義より前で使うとエラーになるはず
https://ja.cppreference.com/w/cpp/language/function > 関数の引数の型および戻り値の型は、削除された関数を除き (C++11以上)不完全クラス型にできません。 完全性のチェックは関数の本体の文脈で行われます。
これはそういうことを言ってるんですかね。
関数本体内のコンテキストで完全型になっていれば良いのであれば、いろいろできるような気がする。 あんなことやこんなことが。
あーそういうことだね 関数定義前なら不完全でもいいってことだと思う すまんテンプレートには限らないぽいな
>>661 step =1000000;
for( double r2 = R2 - dev2; r2 < R2 + dev2; r2 += dev2 / step ){
}
こいつを並列化したいんだが、ループカウンタをintに変更するとしても、
2M ノードのvector確保するわけ?
ループカウンタ設定するために並列化要るがなw
単にループ回したいだけなのに巨大なメモリ要るてww
調べてみてもC#やtbbのparallel_for相当がないんだが
これら見ながら企画作ったC++規格策定メンバーってお前と同じパープリンじゃないのか?
>>671 おい、真面目に情報提供している者に対してパープリンとは何だ
俺だけじゃなく640もパープリン呼ばわりか
後出しという自分の落ち度を棚に上げて
そういう発言は5chのフランクさでは済まんぞ
>>661 もたいがい無意味に煽ってる書き込みだと思うがw
>>671 OpenMP & SIMD intrinsics
ヒノキの棒でぶっ叩けば人は死ぬし、皮の服は火焔や刃物を弾く。 どちらかというと上級者向けの装備だと思います。
operator[]で読み書きって毎回調べないとできず set()、val()とか関数で読み書きしてすますことが多いのだが 新文法などで簡単にやる方法わかりますか
なにいうとるのかわからん operator[]をどう実装してどこで使えばいいのか理解できてないという話なのか
>>682 ふつうの実装では、A[n]は参照しかできず
A[n] = の代入ができないという事
>>684 「参照」を返せばいいだけだが、そういうことではない?
まさか「参照」を知らないと言うわけではないよね。
ちょくちょく初心者質問スレに行った方が良い人までここに堂々と書き込むのが スレを妙な雰囲気にしてる
>>615 >>683 「余再帰」 corecursion って呼ぶのか。勉強になるわ。
江添さんのページを見てみたんだけど、
「このコードは末尾再帰になっている。」の行の前に
最初の return n * factorial(n-1) を返す関数を
末尾再帰に書き換えたコードの引用があるべきなのを
挿入し忘れたように思えるね。
・末尾再帰でないコード例を示す
・末尾再帰にするとこうなる ... コード欠落
・末尾再帰はループに書き換えられるよ
・ループにしたコード例
っていう流れで自然に読めるでしょ。
でもこのシグネチャのfactorialのままだと末尾再帰できなくね?
>>642 みたいになるかと。
>>685 たとえばbitsetを実装しようして、内部では32や64bitの整数へ保存するとして
参照だけではB[i]=1はできないかと
これのこと、毎回調べ直さないと作れない
プロキシ
実は、C++ でも、かなり無理やりですが、(見た目だけは)プロパティのようなことができたりします。 とりあえず、百聞は一見にしかずということで、以下の例を見てください。
利用側、すなわち、main の中では、 まるで普通の変数に対する代入・参照であるかのようなコードになっています。
このからくりは、 age の読み書きに、AgeProxy という名前の別のクラスを介することで実現します。 Age は AgeProxy 型の変数です。
AgeProxy の代入演算子(operator =)と int 型へのキャスト(operator int)を通して、 Person クラスの age 変数の読み書きをします。
ちなみに、こういう例のように、いったん別のクラスを通して値を読み書きしたりする方法を、 プロキシ(proxy: 代理)と呼びます。
まあ、このパターンは、利用側の見た目は綺麗になりますが、 実装は面倒ですし、実行効率もあまりよいとはいえません。
さらに言うと、プロパティを virtual 化しようとすると、 この例よりもさらに複雑な実装が必要になります。
こういう感じの話を振り返った上で、 改めて C# の「プロパティ」機能を見ると、 便利な機能だなぁとつくづく思います。
https://ufcpp.net/study/miscprog/accessor.html プロパティはコード上でフィールドのように扱えることよりもメンバとしてIDEが認識できるところに意味がある 最近はC#でもデザイナに頼らずに何でもコード上で済ませるスタイルが主流になりつつあり、プロパティの必要性は薄れている 初期化時にパラメータを纏めて渡したりするだけなら生フィールドで十分なわけだしな
proxyで別に実行効率は下がらんよね てかstd::vector<bool>は大昔から存在するし
>>684 ,
>>684 他言語での getter/setter メソッド的な事をやりたいのだろうなあと考えてみました。
例えば a[i] と書かれたら、 内部データ(typename T) への参照(T&) を返すのではなく
新たに内部クラス(fields: owner, index)を用意して、そのオブジェクトを作って返すようにします。
これに代入演算子(operator =) と キャスト演算子(operator T()) を実装すれば...
・a[7] = 99; //setter
・cout << a[7]; //getter
こうやって普通にアクセスできます。メソッドを分離したお陰で、
添え字アクセスによるデータベースのupdate / select みたいな事が可能になります。
代入演算子は最低二種類必要で
Inner& operator =(const T& value); // a[i] = value
Inner& operator =(const Inner& rhs); // a[i] = a[j]
二つ目を実装しないと暗黙のコピー代入演算子が作られてしまい
a[i] = a[j]; のような代入操作は実質空文化します。(owner/indexがコピーされるだけ )
素人の思いつきですがサクっと試したら機能しました。
もっとスマートなやりかたもあるでしょう。
意味の無い所で無駄にコードサイズを増やさなくても 普通にset/get関数で良いよ
bitsetは参照返すからset(1).set(2).set(10)などと連鎖できる。
>>672 なんだてめえパープリンの活け造りが
ぶち殺すぞ低脳野郎
ぶち殺し行ってやるから住所さらせや糞野郎
>>672 真面目に糞情報しか提供できない出来損ないならすっこんでろウスノロ
とにかくぶち殺しに行ってやるから住所晒せや
>>678 今ごろlock_guardて ID:zfbHpqVT 並の情弱かオマエww
パープリンどころかアホの活造り ID:zfbHpqVT パープリンどころかアホの活造り ID:zfbHpqVT パープリンどころかアホの活造り ID:zfbHpqVT パープリンどころかアホの活造り ID:zfbHpqVT パープリンどころかアホの活造り ID:zfbHpqVT 出てこい知障
そもそも10を代入して値が10にならないなら、意味的に組み込み型の整数とは違うのかもしれない。 整数ではないものを整数で代用したときに起きる問題なのかも。
>>683 江添なんて前からそんなもんだぞ。
人の間違いには厳しいが自分の間違いには逆ギレするような男だ。
>>707 全方面に厳しいって事?
自分にも他人にも。
「自分の間違い(に対する指摘)には逆ギレ」ってことでしょな。 書籍として印刷・発売する前にネット公開して広く意見を求める、 「お前らタダで読ませてやるから品質向上に協力しろや」方式と考えれば 誰にも損のないやり方だと思うけどね。 少なくとも俺にとってはありがたい。
なんかうちのVisual Studioだと iscntrl('\t') が非0(真)になるんだけど これって正しい?
isspace('\t')は非0(真)なので'\t'は空白のはずェ、 つかGoogle Testにかけたらこうじゃわ↓↓↓ TEST(stdlibTest, ctype) { ASSERT_FALSE(isspace('\0')); ASSERT_TRUE(isspace('\n')); ASSERT_TRUE(isspace('\r')); ASSERT_TRUE(isspace('\t')); ASSERT_TRUE(isspace(' ')); ASSERT_TRUE(iscntrl('\0')); ASSERT_TRUE(iscntrl('\n')); ASSERT_TRUE(iscntrl('\r')); ASSERT_TRUE(iscntrl('\t')); ASSERT_FALSE(iscntrl(' ')); }
盲目の為のロケールがあったら、ベル以外全部制御文字になるんだろか。
0x00から0x1fまでは全部制御文字で違和感ないけど。
printableってのは音声出力も含むのではなかろうか
盲人のブログラマーって普通にいるんだな なんかかっけーな
Visual Studio 16.4オンラインアプデしたら それまで使ってたParallel Studio2019 U5使えなくなった。 Visual C++でコンパイルできるがIntel Compilerはコンパイル失敗してしまう それと、 プロジェクトのプロパティからIntel Compilerは選択できるんだが、 プルダウンメニューからIntel Compilerを選択できないようになった。 Parallel Studio最インスコしてもコンパイルは失敗する。2019 U5 が16.4に対応してないとかないよね?
>>713 例によってロケール依存らしいが "C" だと
iscntrl() が真を返す値は 0x00-0x1f, 0x7f みたいね。
これまた例によって unsigned char 範囲と EOF 以外の値については未定義。
つうか、このくらいは5ちゃんねる以外から情報を探す方が
早くて確実じゃないかしら。
C++で作ったブラウザテニスゲーム(PWA仮対応):
https://yutakaaoki.github.io/demo_tennis/ Wasm+PWA+WebGL+"C++"
>>722 青木さんは何をしようとしてるんですか?
もっと早くは最速って意味ですか? それとも速くしたいって意味ですか?
インテリコード、ほんとに提案してくるね。 お前は次にこう書く・・・って。
>>723 C++ Nex という言語とそのIDEを作ってますが、マルチプラットフォームの
ツールキットも同時に作ってます。MacやiOSなどまで native 対応するのは
貧乏なので機材の関係で難しいので、wasm に対応することでひとまずは
凌ごうかと思いました。
ツールキットのソースをBSD/MIT系ライセンスで公開して、C++ Nex も
無料で使えることにして、みなさんのお力をお借りして native対応の
ツールキットに出来ればいいのですが。ひとまず、Windows/Wasm/Android
くらいまでなら対応できる目処は立ってます。iOSについては、swift
言語が出したオブジェクトファイルとリンクすることはWindows上でも
実験できそうなので、その基礎的な部分だけならMakefileなどの開発環境を
用意することはできそうです。
Mac miniがあれば、iOS native 対応も出来そうなんですが。
ウェブアセンブラは興味あるんだけど、イマイチ情報が。
高橋茉奈著やさしいウェブアセンブラが待たれる今日この頃。
>>730 ライセンスは、BSD, MIT, LGPL(静的リンクしてもGPL感染しない例外あり) の
どれかにするか迷っています。
>>721 >"C" だと
>iscntrl() が真を返す値は 0x00-0x1f, 0x7f
ほう、そんなことが規格のどこにかいてあるのですか
>>722 Android 4.4.2 Chromeで動作した
>>735 C++ の規格が引用してる C の規格じゃないかな。
質問のつもりで書いてるなら、あまりに態度が悪い気がするし、
「その投稿の内容は間違ってる」と主張したいなら、
もっと直接的・具体的に間違ってるという根拠を示すべきだと思うよ。
>>742 デタラメぬかしておいて根拠を求められたら示せないばかりか
オマエこそデタラメである根拠を出せとか、さすがですね
自己レスです
Visual Studio 16.4では
Intel Parallel Studio 2019 u5は動かないようです。
16.3に戻せないし
どーしよー
https://software.intel.com/en-us/forums/intel-c-compiler/topic/840467 POSIXには明確にCロケールの定義が書かれていた。
>>745 今のVSの最新版は人柱仕様であり、検証無しでプロダクション用をアップデートしてはいけません
勉強になったねー
昔からVSはそんなもんだ。 てかc++コンパイラなんて全部そんなもんだ。
>>745 リンク先に回避策があるって書いてあるやん
>>746 それはCの規格と必ずしもイコールではないがな。
POSIX には ISO C には無い追加の定めがあり、したがって POSIX にある定めは必ずしも ISO C 一般に言えることではないということです。
わかったはもうこれからはstd::isspace()とstd::iscntrl()を使うは
メンバ変数にstd::listを使うと移動コンストラクタがnoexceptに出来ないのですが。 こんな時はどうするのでしょう。
>>754 まず何を見て「出来ない」と言っているのかを明らかにします。
std::swapの特殊化がnoexceptです。 これを使いますか。
引数無しのコンストラクタがnoexceptじゃないから無理でした。
そもそも noexcept にする必要性が不明だし、呼び出してる関数が 全部 noexcept じゃなくても std::list 実装を限定してよかったり、特定実装での bad_alloc =即死の不都合が必要性と釣り合うなら noexcept にすることはできるし、 最大限の移植性も bad_alloc の通知も noexcept もすべて本当に必要なら >755 でポインタって答えも出てるのに。
自動でnoexceptに成らないなら、自分で望みのnoexceptの定義すりゃ良いだろうに 部品が例外投げるなら内部でcatchして適切に処理すればいい
途中でcコード通るとか何らかの理由があるんだろう。
ある一つの変数に対してstd::threadで作成したプロセスは値を更新し続けて、メイン関数の方では値を読み続ける場合は排他処理する必要はありませんか? メイン関数の方は必要なときだけ値が読めればいいので読みこぼしは無視していいです
>>765 変数が std::atomic<T> でなければ排他制御の必要があります。
>>765 atomicでないとだめ。プリミティブな型でもあやしい。
りーどらいとろっくするがよい。
基本型かつ確実にレジスタでなくメモリに書き出されているならそうだね std::atomcを使うのが無難 その条件ならmemory_order_relaxedを指定すればバリアのオーバーヘッドは避けられる 面倒だけどね
質問者じゃないけど 読みこぼしとかタイミングによるズレが問題ないとしても排他制御なしに読み書きする時点で未定義動作だからNG って認識でおk?
はい。
https://timsong-cpp.github.io/cppwp/n4659/intro.multithread#intro.races-20 > The execution of a program contains a data race if it contains two
> potentially concurrent conflicting actions, at least one of which is
> not atomic, and neither happens before the other, except for the
> special case for signal handlers described below. Any such data race
> results in undefined behavior.
言語仕様はそうだろうけど x86なら実際は多くの場合バリア不要だったりするから 最終的にどういうinstructionになっているのか知っておくと理解が深まる
x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ これ以外だったり同期が必要なければ 排他制御は不要 もちろん、 一連のデータリードでデータの一貫性が必要であれば一貫性確認の仕組みなり排他制御なりは当然必要だし、 コンパイラが読み書きを省略する可能性のあるコードであれば volatileを付けるなど、省略を防ぐ必要はある ymmレジスタを使えばアトミックな読み書きが出来るので 256bit以内なら一貫性も保てる マルチコアARMの場合は DMB命令を入れておけば確実 パフォーマンスに問題が無い箇所であれば、 移植性の為にも、素直にC++の排他制御を入れておこう!
>>773 個人的には絶対に移行したくないと思っている。
>>771 質問されたような簡単な場合であっても、少なくとも、80386系CPUでも、
物理CPUを2つ積んでいるようなマシンだと、色々な配慮が必要。
一つの理由は、CPUキャッシュが外部メモリに反映されていない場合が
あるため。
もう一つは、値の変化のタイミングがコードに書いた通りで無い事があり、
僅かにタイミングがずれることで、「すれ違い」現象の様なことが
おきることがある。これが起きると、変数の値をフラグ的に利用して
厳密に何かをやりたい場合に非常に致命的な問題を生じてしまうことがある。
これを避けるには、80386の設計者は、XOR交換命令を使うことを想定
していたらしい。
2つのスレッドでデータをやり取りする場合には色々と注意が必要で、
普通はデータが準備できたかどうかをCreateEvent(),SetEvent(),
WaitForSingleEvent()などで待機して処理するのが基本。
>>776 スマン。XOR交換命令ではなく、xchg命令だった。
goよりかはrustの方が全然マシやと思うぞ 最近go案件振られること多いけどC言語触ってるみたいで好きになれんわ~
>>776 xchgはsequential consistencyが必要な場合だよ
今回のように単にatomicにread/writeできればいいだけなら不要
お前さんも含めてよくわからん人は使わないのは正解
>>779 正直言って、俺は、lock, xchg, mfence, prefetch,
キャッシュ制御付き(?)mov各種(大量)
に付いてはちゃんと理解出来てないことは認める。
MFENCE PREFETCH MOVNTDQA LFENCE(?) XCHG LOCK prefix WC Memory ↑沢山あるけど、よく分からない。 xchgもちゃんと理解できてない。
MFENCE, LFENCE, SFENCE。 服のサイズみたいだ。分からん。
>>779 xchgは、2つ以上のCPUが1つの事柄に関する lock を同時に獲得しようとした時に
1 CPU だけが lock を獲得できて、他はすべて獲得できないようにするための
ためのようですね。今回とは余り関係ないようです。
>>777 XORを使った交換テクニックがあったのを思い出した
>>765 その場合でも排他制御は基本的には必要。
たとえば読み込んで範囲チェックをした後に値が変わってしまったらまずいでしょ。
別メモリにコピーを取っていてから処理しているつもりでも、最適化が気を利かして削除しちゃうこともあるだろうしね。
>>765 あとはアレだな、変数の構造にもよるけど、変数を読み込んでる最中に、上位ワードを読み込んだ後に値が変わって下位ワードだけ新しくなるなんてことも
可能性としては0とは言えない。
AVXを使えば256bitを1命令で AVX512を使えば512bitを1命令で 読み書き可能
x86系だとCMPXCHG命令 ARMだとLL, AC命令 がデータの一貫性確認に使える
> これを避けるには、80386の設計者は、XOR交換命令を使うことを想定 > していたらしい。 当たり前じゃね?アトミックな命令を使うのは基本だと思うが
xor rax,rbx xor rbx,rax xor rax,rbx これでswap rax,rbx相当ってことね
condition_variableで待機しているスレッドがない状態でnotify_allしたときの動作ってどうなりますか?
jsに対するTypeScriptみたいな感じで C++に対するRustっていう認識は間違ってるが それならC++に対するそれは何が適当なんかある?
allに該当する要素の数が0なのを特別視する必要はなさそう
非同期な操作やしその瞬間何も起きんなら単にスルーするだけ
>>797 Managed C++とかC++/CLIとか
>>801 それだと余計に変になっているので、JS ---> TypeScript の関係とは違う。
ていうかTypeScriptはJSが型があまりにもザルすぎて危険だよね、Javaやら C/C++ほど堅くないにしてもある程度の型はいるよね?っていう発想ででてきた ものだから C++ から寄せていくならむしろ型をユルくしてくパターンだな そんなクソ言語には興味がないので具体的に何?ときかれても知らんがな
JSが危険ってどういう事? C/C++は型がない=危険だけど JSなんかは型安全な言語だからちゃんと例外になって、 メモリ保護エラーとか起こすこと無いけど?
Treeの節(Node)は部分木を表すRangeだと考えて差し支えないですかね?
C++20のレンジってもしかしてDBのカーソルとかに応用できませんかね?
ビューで制限できるし遅延評価を目的としたストリームを代弁できるんじゃないかなって思ったのですが。
>>806 型も宣言も無い事が危険になることが多い。
例えば、関数を定義しても仮引数に型がないので、全く間違った実引数列
を指定してしまっても処理系がエラーを出してくれない。関数を修正して
仮引数列の真ん中あたりに新しい仮引数を一つ増やしたとする。
この場合、この関数を呼び出す側もちゃんと全て修正する必要がある。
Cだと型をチェックしてくれるので修正の仕方を間違うとエラーになって
くれることが多い。ところがJSだと間違っても全くエラーを出してくれない。
また、JSの場合、ローカル変数とグローバル変数を間違って使ってしまい、
グローバル変数にいれたつもりがローカル変数になってしまっていることがある。
また、変数を1文字間違えた場合も全くエラーにならず、新しいグローバル変数
が使用されたと解釈されてしまう。
どれも、C言語だとエラーになってくれるので安全だが、JSだと危険。
>>811 お前が型安全の意味を間違ってるってことはよく分かった。
メモリ保護エラーなど言語で解決されないエラー
(OSがトラップするエラー)になってしまうことを
型安全じゃないっていうんだよ
言語で例外になるならそれは型安全
boost.property_treeはノードはコンテナだって書いてる。 アルゴリズムイントロダクションにはポインタ三つ組みのツリー表現が紹介されてるけど、これがノードがコンテナ的な感じだろか。
>>812 ???
>>811 は型安全なんて一言も言ってないけど?
仮に、ノードにSTLのリストやベクターを持たせて子ノードを格納すると、別の部分木のイテレータが互換性を持たなくなる。 これはちょっとまずい。 ある部分木の途中からある部分木の途中までを注目することはよくあるから。
ノードの物理量が必ず同じであることを利用すれば、データ構造ヒープを木として使うのが良いんだろか。 これなら、メモリーの確保はSTLのベクターが使え、木全体でイテレータが互換性を持てる。
考えれば考えるほど、ノードに子ノード格納用のSTLコンテナを持たせるのは現実味がなく思える。
つまり、型安全はプログラムの健全性を担保するものではなく、C++は型安全とは言えないって事で良いのでは。
型が無いと僕たちには辛すぎるよね。 ミスを発見してくれないから。
型はまあ重要だけど型ガーばっか言ってる奴は揃ってバカだよな。
型が無いとinsertがinsert_from_intとかinsert_from_stringとか別々にしないといけなくなって、色々大変そう。 呼び出し側が責任を持つということになるのかも。
型演算をコンパイラに任せることが出来なくなって、すべてプログラミングしないといけなくなるのかな。
>>824 むしろ(静的)型なんて俺には不要だぜ、ベイビーって奴の方がアホっぽいけどなw
>>825-826 静的型付け 動的型付け
あたりでググってこい
機械語は変数に型がない。 命令で型を使い分ける。 その大変さを考えると型欲しいってなるのかも。
>>825 ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
用意して使うと言う発想はスクリプト言語的な発想。
そのようにした場合、コンパイラが厳密にどの関数を使うかが人間には
分からない事が多いので安全性を損なう場合が多い。
スクリプト言語は RAD言語なのため、できるだけ短い関数名で対処しようと
するが、それが思わぬ間違いを含みがち。
C言語が好かれているのは、どういう処理がされるかが人間が完全予測できる
ことで、「大体の動作」は好まれない。
>>826 型の違いでコードを自動変化させるという思想は、C++の中でも非常に最近に
なって STL (template) で流行りだしたもの。
もともとC言語に型が導入されたのは、プログラマのミスをコンパイラが発見して
エラーを出してくれるようにするためだった。C言語には関数の多態性(overload)
がない。なお、override と overload は別の概念なので、知らない人は検索して
欲しい。
#pragma omp parallel forで 自動分割され、各スレッドに割り当てられた ループの開始点と終了点を取得することできませんか?
>C言語には関数の多態性(overload)がない さらりと嘘をつくやつがおるな
オーバーロードあるか? ディスパッチの方法はいろいろあると思うが
>>830 > ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
> 用意して使うと言う発想はスクリプト言語的な発想。
え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
「同じ関数名の関数を複数用意」できるのは静的型付け言語の特徴だよ
>>839 > え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
関数は無理だがメソッドでいいならPowerShell
PowrShell は型付言語ですからね。 それぐらいでしょ?
用語としてメソッドと言ってるものでよければ Common Lisp もそうじゃね?
>>841 うん、1つあれば
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
の反例になるからね
>>843 そしたら、一つぐらいしか無いって俺は意見を訂正するだけなんだが、
お前も同じ関数名の関数を複数用意できるのはスクリプト言語では
PowerShellだけだって訂正するって話でいいの?
質問です template <typename T> constexpr inline T value; template <typename T> constexpr inline T value = (T)0; こうやって変数テンプレートの宣言と初期化を分離すると VC、clang(Xcode付属)ではエラーになるんですがwandboxで試すとエラーになりません 本来どっちの動作が正しいんでしょうか?
>>844 別にそれでいいよ
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
が無知からの発言と認めてもらえればいいだけだしw
>>846 これも通ってしまった。
#include <iostream>
template <typename T>
constexpr T value = 1;
template <typename T>
constexpr T value = 2;
template <typename T>
constexpr T value = 3;
template <typename T>
constexpr T value = 4;
template <typename T>
constexpr T value = 5;
template <typename T>
constexpr T value = 6;
int main()
{
std::cout << value<int> << std::endl;
}
実行結果。 Start 6 0 Finish 最後の定義が有効になってるように見える。
Wandbox C++ gcc HEAD 10.0.0 2019
ありがとうございます、その結果を見るとgccがおかしいぽいですね・・・ 宣言時に初期化は必須と考えて書いていこうと思います、ありがとうございました
>>846 診断メッセージをよく見ろよ
> error C2737: 'value': 'constexpr' オブジェクトは初期化する必要があります。
そもそも分離できないんだよ
いいか、constexprは翻訳時定数だぞ
それを翻訳段階9まで未解決のままにできると思うか?
>>854 なんでできるようにしないの?
そっちの方がおかしくね?
ん? 俺は江添じゃねえぞ 奴なら標準会員だから言ってみるのもいいが
>>854 >診断メッセージをよく見ろよ
見た上で言ってます(つまりgccまたはVC, clangのバグではないかということ
>いいか、constexprは翻訳時定数だぞ
それ以前にテンプレートなんですが
誰でも閲覧できる規格ドラフト見ればすぐにわかることをこんな掃きだめで聞いても
>>862 なんかとんがってんな
コンパイラのバグとまで言う根拠は何だ?
相場では規格票の条文だが
テンプレートなのは見ればわかるさ
だから何なのか説明をやめないでくれ
>相場では規格票の条文 通産省の癖の抜けない老人はご退場いただきたい
>>772 >x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ
別に。
コアAの読み書きをコアA自身が見る分にはそうかもわからんが
コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る
(アウトオブオーダー実行の影響で
安全に動かすには適切にメモリバリアで順序化する必要がある
>>868 read ==> read
read ==> write
は入れ替わらない
といってもロックレス何ちゃらぐらいの制御であればInterlockedCompareExchange()で済むから スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが
リードキューやコマンドキューにコマンドが入るのはアウトオブオーダープロセスの事後であるため そのような保証は無い
x86系は シングルコアのマルチスレッドアプリ の多くがそのまま動くように出来てる シングルコア時代が長かったから
>>865 >テンプレートなのは見ればわかるさ
>だから何なのか
普通に考えて、実体化がまだなのに定義(初期化)を強制される妥当な理由はない、ということ
確かにリンク先のインテルのマニュアルの
>8.2.3.2 Neither Loads Nor Stores Are Reordered with Like Operations
>Example 8-2. Stores Are Not Reordered with Older Loads
に
>Initially x = y = 0r1 = 1 and r2 = 1 is not allowed
と書いてあって
>>875 と同じことが書いてあるが疑わしい
マニュアルが間違っているのではないか、
ちな
>8byteのデータはアドレスが8の倍数のときにアライメントされている。
から安全に読み書きできるというのはi486みたいな古いプロセッサーだとかえって危険らしい
>8.1.1 Guaranteed Atomic Operations
を見たらワカル、
つか上のインテルのマニュアルには「投機的実行時中のメモリアクセスではメモリアクセス例外は発生しない」 旨が2箇所ぐらいに書かれているが、 ということはつまりアセンブリコード上A→BまたはA→Cというメモリアクセスが条件によってどちら片方だけ実行されることを意図したコードであっても A→B→Cというメモリアクセス順に成り得ることを意味し、他コアからもそう見えてしまうはずだが、 これをメモリアクセス順がreorderされていないうちに入れてしまうのはどうなのか、、、 マニュアル執筆者の国語の再教育が必要なのではないか
>>877 おまえさん、もしかして
テンプレートの宣言と定義と
オブジェクトの宣言と定義を
ごっちゃにしてないか?
int test;
int test = 5;
これは宣言と定義じゃなく定義の重複だぞ
お前なぁ x86のこと大して詳しくないのにしゃしゃり出てくるからそういう情けないこと言うはめになるんだよ x86でstd::atomicのmemory_orderを変えてバリア付きがどういうインストラクションになるか見てみな storeのseq_cst以外は素のmovだから(コンパイラ依存だから絶対ではない)
そりゃー間違ったマニュアルにしたがって実装したら間違った実装になり得る(キリ
ていうかアウトオブオーダー実行の影響がマルチコアCPUにおいても透過的だと認めやっても良いが、
>>879 の投機的実行の件はどうなんじゃ?
あるコアが投機的実行中に他のコアをストップさせるのでは何のための投機的実行かわからん…
>>877 × 普通に考えて
〇 俺の頭の中で
× 妥当な理由はない
〇 妥当な理由は思い当たらない
テンプレートなら初期化は不要という主張なら、
constexpr 変数の宣言と定義を分離できないことは納得してるのかな?
そうだとして、それをテンプレートの時だけ可能とすることに意義があると思うの?
特別ルールを設ければコンパイラ実装やプログラムの読み取りにコストがかかるから、
明確が意義がなければ特別ルールは無いのが妥当だと思うよ。
>>880 ,
>>883 マウント取るのが最優先でまともな回答できない(するつもりも無い)んなら黙っててくれ
>これは宣言と定義じゃなく定義の重複だぞ
externつけたら?
>それをテンプレートの時だけ可能とすることに意義があると思うの?
テンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる
さて、
>× 普通に考えて
>〇 俺の頭の中で
>× 妥当な理由はない
>〇 妥当な理由は思い当たらない
こんなゴミみたいな煽り入れてきたからには逃げるなよ
>>884 おまえさんの元の質問はこうだったな
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
どこにexternなんて書いてある?
マウントがどうたら気にするあまり後出しなんかしてるのはそっちだぞ
こっちはそんなこと微塵も考えちゃいねえよ失敬な
最初の口調に戻れよ
間違えた Xテンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる ○初期化に使われる定数式の評価を遅らせられる 言い換えれば、宣言と定義を分離できないならconstな変数テンプレートの宣言時には それに使う定数式内のすべての型が完全型であることを強制されてしまう =std::is_integral_v = std::is_integral<T>::valueでいえば is_integral構造体の方が取り回しがいい、ということ なんのために変数テンプレートが導入されたのか・・・・
>>885 自分が失敬だからこうなってるとは考えられないんだな
何様だよ、そもそも質問に答えてないだろうが
>>887 template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
を例示しての質問に対して
int test;
int test = 5;
という答えをしているぞ
valueがtestになったのは悪かったが
余計な飾りをとって問題の核心を指摘したんだよ
規格でそうなってる(テンプレートゆえの特例は無い)のが”わかってるなら”
最初からそう言ってくれれば済むんじゃないの?
>>854 を読み直せよ、テンプレートのことが完全にすっぽぬけた上に失礼な回答だろ
>コンパイラのバグとまで言う根拠は何だ?
とまで、って・・・・普通にありえるだろ、動作が違うんだから(未定義とかいう屁理屈は無しで)
で、
>>883 は逃げたの?
>>886 やっぱり constexpr 変数の宣言と定義を分離して何がしたいのか、
何ができるようになるのか、が見えてこない。ごめんね。
宣言だけ見える constexpr 変数への参照やポインタだけはとれるようになるけど、
それだともう constexpr である必要なくて const 変数でよさそうで、それならふつうに
宣言と定義は分けられるし。
ちなみにテンプレート実体化までテンプレート引数依存箇所の評価はされないから、
宣言と定義を分ける話を「評価を遅らせられる」と言い表しているのも何か間違ってそう。
「記述を遅らせられる」の間違い?
だめだこいつ 絶望的に人に者を尋ねる態度がわかってない 「言ってくれれば済む」とか図々しすぎ 技術的な議論がしたいがこいつ相手では 不必要にイラついちまって無理だわ 俺そんなに人間できてない
>>891 すまん、
>テンプレート実体化までテンプレート引数依存箇所の評価はされない
これ検証してみたらたしかにそうだった
手元のコードで完全型を要求されたから、初期化時に不完全型を使えないと思い込んでた
(おそらくconstexprな変数テンプレートの実体化が、必要な型の実体化より先に来てたっぽい
多分構造体か何かでワンクッション置けば解決できると思う)
これなら確かに分けられなくて問題無いね
>>892 >いいか、constexprは翻訳時定数だぞ
>それを翻訳段階9まで未解決のままにできると思うか?
>なんかとんがってんな
>後出しなんかしてるのはそっちだ
>余計な飾りをとって問題の核心を指摘したんだよ
さらには
>最初の口調に戻れよ
の上で
>技術的な議論がしたいがこいつ相手では
>不必要にイラついちまって無理だわ
よくそんなセリフが言えたもんだ
自己評価高すぎじゃない?wwww
意見が合うとか合わないとか以前の問題 根底的なメンタリティに欠陥がある相手とは話にならない
FYI
>>846 Bug 68012: g++ incorrectly accepts forward declaration of constexpr variable template
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68012 >>848 One definition rule
https://timsong-cpp.github.io/cppwp/n4659/basic.def.odr#1 > No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
>>895 わざわざありがとう、やっぱgccのバグだったのね
>>837 オーバーロード=多態性じゃないんで…
オーバーライドのことなら当然cで実現できる
>>898 どうやって?
いや、ディスパッチの方法はいろいろあると思うが
禿もそんなことを言いながら virtualの導入には当初反対から出発したんだよな
>>899 その話題QZ相手にやったばかりなんで自分で調べて
>>898 overload は、同じ関数名で仮引数の型が違う関数を作れるという多態性のことですよ。
ツリーのイテレータがあるとして、イテレータが返すのはノードじゃなくて、ノードの持つ値ですよね? すると、イテレータは立体機動出来ないといけなくなるけど、begin().begin()とか変ですよね? begin().parent()とか。
イテレータが返すじゃなくて、イテレータの逆参照が返すかな。
コレクションとしては子孫ノード全部を列挙できればよくて、ツリー構造に沿った操作が行いたいなら それに加えて直接の子ノードのみを列挙するイテレータが用意できればいいだろう。
何が子ノードのみを列挙するイテレータを返すかがよくわからない。 ノードの値がイテレータを返すことはできないので、ノードが子ノードを指すイテレータを返すとすると、イテレータの逆参照はノードを返すことになる。 これは意味論的にちょっと違うかなって。 コレクションにおいて位置はイテレータで示されるので、立体的な位置を持つツリーでは、イテレータ自身が立体機動出来て、巡回能力を持つイテレータは、reverse_iteratorのように外部に用意されれば良いのかなと思ったんだけど。 たとえば、レベルオーダーや深さ優先の巡回イテレータがあるとすると、普通に考えるとスタックやキューが内部に必要にある。 というわけでコピーのコストがあるので、これを標準には出来ないんじゃないかなって。
子ノードを指すイテレータの逆参照が子ノードを返すとすると、*node.begin()は子ノードを返す。 **node.begin()は最初の子ノードの値を返すことになるんだけども。 イテレータの逆参照がノードを返す場合、初期化子リストが素直に実装出来てイイんだけども、イテレータの逆参照が値を返さないのが腑に落ちない感じ。
>>903 こらこらoverloadは多態じゃない多重定義だ
多態はpolymorphism間違えるな
イテレータは演算子の実装を求められてるわけではなく、その演算子を呼び出した時の効果を求められてるだけなので、++(int)はスタックをコピーしない方法を考えた。
そこは値じゃなくてノードを返すイテレータでいいんじゃね? 必要ならイテレータ自体を拡張してもいいだろうけど、この場合はあまり応用できそうもないし。
まずイテレータで何を抽象化したいかを明確にしなよ ノードを意識させたいのか?
STL風ツリーって検索しても絶対出てこないし、CIAが絡んでるような気がしてきた。
そこがわかんないんだよねえ。 禿4とか読んでると、イテレータは位置を意味してるように思うんだけど。
ツリー構造 範囲が広すぎて 汎用化すると使い勝手が悪くなるからしない ってだけかと
recursive_directory_iteratorとかね
いや立体がどうたら言ってるから じゃあrecursive_directory_iteratorを使うユーザーのコードは いちいち多重ループだの再帰だのといった処理になるのかって 思ってさ
ツリーは、あるノードの親が知りたいときもあるはず。
ごちゃごちゃ考える前にイテレータの本分を決めなよ begin()からend()まで++で走らせた時にどうなってほしいの? 話はそれからだ
一般にtreeの探索順序はアルゴリズムと深く結びついてるし、 そこ凝りだすと沼だぞ。
関数ポインタをシリアライズしてファイルとして保存し、 ファイルからその関数ポインタを利用できる形に復元する方法ってあるのでしょうか?
関数だろうが変数だろうがポインタはただの整数値でしょ
>>923 環境や「利用」の仕方を具体的に限定すればやりようはあるかもね。
次に(別のプロセスで)ファイルを読み込んだときに、 元の関数を同じ番地で参照できると限らんしな。 関数ポインタの配列のインデクスなら大丈夫だろうだけど。
C++20以降のvector/stringとか 使われる時にconstexprであることを妨げないようにするために付いてるんだと思う
デストラクタがデフォルトでvirtualじゃないのは設計不良ではあるまいか
あえてベースの方のメソッドを呼びたいなんてことあるのかね?
>>931 C++では基本的にゼロコストでできるところはそうできるようにするポリシーだからvirtualが必要なときだけvirtualを明示的に指定させる、というのをどこかで読んだ気がする
virtualでなかったら継承禁止にしても良かったんじゃないかとは思う
そうするとメタプログラミングに色々と支障が出たはずだし STLも結構継承使ってるから実現出来なかったかコスト増えてるよ
デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ baseのポインタを使うことすらないようなもの(CRTPなど)までvirtualになるのは どうなんだろうか
unique_ptr使えばvirtualにする必要無いのでは?
>>938 んなこたーない。
shared_ptr<Base>{new Derived} なら virtual デストラクタ不要になるから、間違えて覚えてるだけでは?
>>937 >デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ
mjk、
セオリーとして覚えてる人多いけど、何故なのかまで考えてない人が多い例の一つだね 要するにdeleteする基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ 末端のデストラクタを呼べれば、そこから基底のデストラクタを呼んでいくのは何が基底かわかりきってるから自動で出来る
>>941 >基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ
mjk、
永遠の初心者です、お願いします
1. 式で if 文を表現したいときは条件演算子(三項演算子 ?: )が使えますが、同じく式でループ構造を表す方法は C++11 以後にありますでしょうか?
2. 1 の質問の理由としては、C++ は Java とちがって uper() がなく、派生クラスのコンストラクタの基底クラス初期化部分に式しか書けません、ここにループを書くとすれば「コンストラクタ用メンバ関数(メソッド)」を置いていますがいかにも無様だと思っています…
3. ある既存のクラスに皮をかぶせて機能アップを図るとき、もとのクラスの派生クラスとして機能アップ部分を既述することは、よくある定石でしょうか、それともあまりしないことでしょうか?
---
以上3点の質問は以下のプログラムを書いていて感じました
お題は「エラトステネスのふるい」、ただし、当初、まっとうにふるいを書いた後、機能アップ項目として
篩部分に格納する数は 2n + 1 奇数に限定する、あるいは 6n + 1, 6n + 5 の形のみに限定する
等を元の篩に対して派生クラスとして記述しました
https://ideone.com/YPlfsC >>943 ラムダ式の出番かな?
void test(bool flag) { flag ? []{ for(int i = 0; i < 10; ++i) cout << i; } : throw 1; }
エラストテネス 6n+1, 6n+5だけ保持とかってみんな考えるよね ちなみに 巨大なテーブル作成時のパフォーマンスを上げるなら キャッシュが効くよう分割処理するのが非常に効果的 スレッド分割の為にいずれにしろ分割処理は作る事になる
>>943 初期化部分に複雑な処理をベタ書きする方が無様だと思うよ。
初期化リストの中にそんなごちゃごちゃしたこと書きたい?
ワイが思うだけなので世間でどう思われてるかは知らんけどとりあえずひとつの意見として。
>>939 親クラス(Base)のデストラクタに virtual 付けなくても...
{
shared_ptr<Base> obj( new Derived() );
} // ~Derived() called, then ~Base() called.
~Derived() はコールされるんですね... 確認してみて驚きました。
これができる仕組みを誰か教えてください。
スマートポインタのオブジェクトは子クラスの事何も知らないのに
どうして ~Derived() のコールが可能なのでしょうか?
>>950 まだ仕組みのとこまでですが理解できました。ありがとうございます。
質問ですが構造体Fooの内側に構造体Barが定義されているという入れ子になった構造体において、 Fooの外のコードでFoo::Barのサイズをsizeof()で知りたいとき、以下は正しい? 1. C++だとsizeof(Foo::Bar)と書いたらおk 2. CまたはC++でもC互換構文の範疇で済ます場合、次のどちらかの方法でしか書けない (1) Foo::Barのインスタンスyが存在するスコープ内で、sizeof(y)と書く (2) Fooのインスタンスxが存在するスコープ内において、Foo::Bar型のメンバyをFooが持つ (Foo::yが定義されている)という条件の下で、sizeof(x.y)と書く
ふとオモタがインスタンスの必要性は無くせるかもしれん Foo::Bar型のメンバFoo::yが定義さえされておれば、Fooのインスタンスが無くても sizeof(((Foo*)0)->y) と書けばC言語で逝けるかもしれん… スゲー気持ち悪いコードだが、、、、
>>951 あくまでコンパイル時の型で決まるだけだから要注意
例えば
class A;
class B : public A;
A* p = new B();
std::shared_ptr<A> a(p);
これだとBのデストラクタは呼ばれない
なんでそんな中途半端な機能を わざわざコストをかけて入れたんだろう
>>953 Linuxカーネルとかそういう感じのマクロ満載だよ
C言語はそういうもん
>>943 思い出した。
gcc や clang の拡張で良ければ複文が式になる。
だいぶん昔からある機能。
#include <vector>
#include <iostream>
int main() {
std::vector<int> foo(({int i; for(i=0; i<3; i++); i;}));
std::cout << foo.size() << std::endl;
return 0;
}
>>944 ,945,948,959
コメントありがとうございます!
>>944 ,959
まずgcc拡張
>SieveDerived(int n) : Sieve<T>(({int r; while((r = index(n)) == 0) n--; r;})) { } /* HERE!! */
で問題なく動作しました
すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました
次にラムダ式で定義して即評価する方法がみつかりました
>SieveDerived(int n) : Sieve<T>([](int n)->int{int r; while ((r = index(n)) == 0) n--; return r;}(n)) { } /* HERE!! */
これがやりたかった!とても満足しています、ありがとうございました!
今までは関数オブジェクトの糖衣構文としてしかみていなかったラムダ式を、自分の希望にあわせて(あるいはねじまげてでも)採用し、表現できるようになったのは一歩理解が深まったかと考えています
>>948 >初期化リストの中にそんなごちゃごちゃしたこと書きたい?
クラスのメソッド=メンバ関数には、クラスの提供する機能として独立性の高いもの、少なくとも二箇所で同じような処理がダブっているもの、あるいは主観的には「lemma」として成り立つものを書きたいと考えていました
一箇所でしか使わないものでも lemma 性があるのならば private メソッドとして書くのもありかと思っていますが、今回の場合は、他におなじような処理をおこなっている場所はなく、かといってメソッドとして立てるほどのことでもないので、
複数個所からコールできるメソッドにはしたくなかった、という主観がありました、そういう性質の記述ならば初期化リストにごちゃごちゃ書くのもありかと、読み手には他からコールされ得ないことが自明である点からしても
https://ideone.com/y3ROXS lambdaの即時評価はjsだと多用されているイメージ ブロックスコープないからね
>>960 > すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました
30 年以上の実績があってもなお仕様に入らない程度に駄目なんだよ。
プライベートメンバの単体テストってみんなどうしてるのかな。
#if 0 friend test; #endif
#ifndef NDEBUG friend struct test; #endif
namespace Method{ namespace Detail { template<typename ReturnType, typename ... ArgTypes> struct MethodRegister{}; } } // 文字列で呼び出すための関数を登録するためのマクロ #define METHOD_REGISTER_WITH_NAME( NAME, FUNC, RETURNTYPE, ... ) \ namespace Method { namespace Detail { \ template<> struct MethodRegister<RETURNTYPE, __VA_ARGS__> { \ using Functional = std::function<RETURNTYPE(__VA_ARGS__)>; \ MethodRegister() { \ MethodContainer::GetInstance().Register<RETURNTYPE, __VA_ARGS__>( #FUNC, Functional( static_cast<RETURNTYPE(*)( __VA_ARGS__ )>( FUNC ) ) ); \ } \ ~MethodRegister() { \ MethodContainer::GetInstance().Unregister( #FUNC ); \ } \ }; \ static MethodRegister<RETURNTYPE, __VA_ARGS__> sMethodRegister##FUNC; \ } } void HOGE(){ std::cout << "Hello World!" << std::endl; } void HOGE( std::string text ){ std::cout << text << std::endl; } METHOD_REGISTER_METHOD( HOGE, void ); METHOD_REGISTER_METHOD( HOGE, void, std::string ); こういった形で関数を登録する用のクラスを生成し、変数として生成して管理の自動化を行いたいのですが、 関数のオーバーロードを対応しようとした所、クラスの再定義や変数の再定義、管理クラスへの重複登録等 多数の問題が出て詰まってしまいました。 こういった問題を対処するにはどうすればよいのでしょうか?
>>966 >>967 リリース時に消す必要あんの?
>>963 まあ、
({int r; while((r = index(n)) == 0) n--; r;})
の最後の
r;
というのが限りなく非文法的ですし
プライベートメンバをテストしたくなったらそのロジックのみを非メンバ関数に切り出してテストしてるな。 まぁ、特に支障がなければ単純にpublicにするだけの時もあるけど。
templateでアクセスすると合法的にプライベートメンバにアクセスできる
テストのテストが必要になるような意味のわからないテストコードはアウト テストコードは実行せずに人が読んで理解できなければいけない
>>978 どんな感じか見せていただけないでしょうか。
>>971 絶対必要でもないが
少なくともデバッグ用であることくらい
アピールしたい
//よりNDEBUGという特定ワードを使う点にも拘りがある
>>979 例えばテストコードの中にループや条件分岐があるようなものはアウト
ループは許してもらえませんか? データの並びとか検査したいんで。 条件分岐はたぶんないと思います。
テスト用にいろんな複雑なテストも入れてるけど まずいのか?
Debugビルドしたら遅すぎて検証できなくて詰んだ
典型的な糞テストは、テスト対象の出力がハッシュや現在時刻などのような予測しづらいものに依存している場合に、 テストコードにテスト対象自体のロジックと似たものを書いてしまっているケースだな 原則的には、期待する出力は全てハードコードするのが正しい 難しいなら一度試しにテスト対象を実行して目視テストし、その結果をハードコードしたほうがマシ
>>982 Parameterized Testsがあれば十分じゃね?
>>986 期待する出力をハードコードするから
テストで「○○以上であること」って書くこと無いよね?
こういうテストケースある?言い換えるとそういうマッチャーって必要?
>>987 それはまた別の話
ここで言ってるのは単体テストレベルの話だぞ
クラスとかの勉強入る前にC言語でしっかり文字列処理出来るようになったほうがいい?
>>995 strcpyなんて古い関数は21世紀では使えないぜ。std::stringでOK.
C言語でしっかり文字列処理出来るようになったほうがいい? → いい C++でC言語の文字列処理する? → しない
>>987 逆にそういう不確定な部分とロジック部分を切り分けるのが単体テストの目的でもある。
単体テストはどんだけ単純でわかりやすいコードでテストパターンを網羅するかが肝 Google TestとかTest::MoreとかJUnit使ったらワカル
このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 41日 12時間 33分 22秒
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ちゃんねる
lud20250421023100caこのスレへの固定リンク: http://5chb.net/r/tech/1573094136/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。 TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「C++相談室 part146 ->画像>1枚 」 を見た人も見ています:・C++相談室 part154 ・C++相談室 part152 ・C++相談室 part148 ・C++相談室 part165 ・C++相談室 part157 ・C++相談室 part164 ・C++相談室 part126 ・C++相談室 part156 ・C++相談室 part153 ・C++相談室 part149 ・C++相談室 part158 ・C++相談室 part155 ・C++相談室 part151 ・C++相談室 part124 ・C++相談室 part134 ・C++相談室 part145 ・C++相談室 part133 ・C++相談室 part143 ・C++相談室 part131 ・C++相談室 part137 ・C++相談室 part144 ・C++相談室 part136 ・C++相談室 part132 ・C++相談室 part117 ・C++Builder相談室 Part21 ・0からの、超初心者C++相談室 ・【初心者歓迎】デジタル一眼質問・購入相談室 170+ ・C♯相談室 Part20 ・C言語相談室(上級者専用) ・Mac G5 中古買入相談室 ・屯田五目須のお悩み相談室 ・河田さんによる人生相談教室 ・MFC相談室 mfc23d.dll ・C#, C♯, C#相談室 Part79 ・自営業 悩みごと相談室 16 ・C#, C♯, C#相談室 Part75 ・C#, C♯, C#相談室 Part91 ・C#, C♯, C#相談室 Part97 ・C#, C♯, C#相談室 Part96 ・C#, C♯, C#相談室 Part91 ・C#, C♯, C#相談室 Part94 ・自営業 悩みごと相談室 52 ・C#, C♯, C#相談室 Part98 ・C#, C♯, C#相談室 Part93 ・0からの、超初心者C#相談室 ・0からの、超初心者C言語相談室 ・C#, C♯, C#相談室 Part95 ・自営業 悩みごと相談室 49 ・自営業 悩みごと相談室 41 ・自営業 悩みごと相談室 46 ・自営業 悩みごと相談室 45 ・C#, C♯, C#相談室 Part94 ・自営業 悩みごと相談室 51 ・自営業 悩みごと相談室 47 ・自営業 悩みごと相談室 48 ・【不倫.浮気】お悩み相談室 ・【男飯】Rickの相談室【言霊】 ・ライダーマンのお悩み相談室 ・[特設]サマータイム対応相談室 ・[特設]サマータイム対応相談室 ・【イエス』ユダの相談室【口寄せ】 ・★★★ゲイの生活相談室★★★ ・★★★ゲイの生活相談室3★★★ ・★★★ゲイの生活相談室2★★★ ・cygwin + mingwn + gcc 相談室 ・■コンサル田中の経営相談室。■
04:51:15 up 65 days, 5:50, 0 users, load average: 8.57, 9.06, 9.34
in 2.4375669956207 sec
@2.4375669956207@0b7 on 062117