タグ付けされた質問 「c++」

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

20
一方(1)対 for(;;)速度の違いはありますか?
ロングバージョン... より速いwhile (1)Perlスクリプトでの私の使用を見て、同僚が今日主張しましたfor (;;)。インタプリタが違いを最適化することを期待して、それらは同じであるべきだと私は主張しました。ループの反復と同じ数のwhileループで1,000,000,000を実行し、その間の時間を記録するスクリプトを設定しました。それほど大きな違いはありませんでした。私の同僚は、教授がwhile (1)比較1 == 1をしているfor (;;)ので、そうではないと彼が言ったと言った。C ++での100倍の反復回数で同じテストを繰り返しましたが、違いはごくわずかでした。ただし、これは、スクリプト言語と比較してコンパイルされたコードがどれだけ高速になるかを示すグラフィックの例でした。 短縮版... 抜け出すために無限ループが必要な場合に、while (1)よりも優先する理由はありますfor (;;)か? 注:質問から明確でない場合。これは、友人同士での純粋に楽しい学術的な議論でした。これは、すべてのプログラマーが悩むべき超重要な概念ではないことを認識しています。私(そして他の人も)がこの議論からいくつかのことを学んだ素晴らしい答えをすべてありがとう。 更新:前述の同僚は、以下の返答を検討しました。 埋もれる場合に備えて、ここに引用されています。 AMDアセンブリプログラマからのものです。彼は、Cプログラマ(人々)は自分のコードが非効率であることを理解していないと述べました。彼は本日言ったが、gccコンパイラーは非常に優れており、彼のような人々を廃業させた。たとえば彼は言って、while 1vs について教えてくれましたfor(;;)。私は今それを習慣から使用していますが、gccと特にインタープリターは最適化されているため、これらの両方の日に同じ操作(プロセッサーのジャンプ)を実行します。

7
標準化委員会が注目するエキゾチックなアーキテクチャ
CおよびC ++標準では、言語の実装の多くの側面が定義されたままであることを知っています。それは、他の特性を持つアーキテクチャがある場合、その標準に準拠するコンパイラを作成することが非常に困難または不可能だからです。 40年前は、どのコンピュータにも独自の仕様があったことを知っています。ただし、今日使用されているアーキテクチャについては知りません。 CHAR_BIT != 8 signed は2の補数ではありません(Javaでこれに問題があったと聞きました)。 浮動小数点はIEEE 754に準拠していません(編集:「IEEE 754バイナリエンコーディングではない」という意味です)。 私が尋ねている理由は、C ++が固定サイズの型などの他の低レベルの側面を義務付けないのは良いことだと人々によく説明するためです†。「他の言語」とは異なり、正しく使用するとコードが移植可能になるので良いです(編集:符号+大きさのアーキテクチャでの2の補数演算など、マシンの低レベルの側面のエミュレーションを必要とせずに、より多くのアーキテクチャに移植できるため) 。しかし、私は自分が特定のアーキテクチャを指すことができないのは残念です。 だから問題は:どのアーキテクチャが上記の特性を示すのか? † uint*_tはオプションです。
154 c++  c  architecture 

11
文字列定数から「char *」へのC ++非推奨の変換
私はクラスを持っています private char str[256]; そしてそれのために私は明示的なコンストラクタを持っています: explicit myClass(const char *func) { strcpy(str,func); } 私はそれを次のように呼びます: myClass obj("example"); これをコンパイルすると、次の警告が表示されます。 文字列定数から 'char *'への非推奨の変換 なぜこうなった?



4
「long long」=「long long int」=「long int long」=「int long long」ですか?
私は両方を発見long int longし、int long long変数の型用にコンパイルすることができます。間に違いがありlong int long、int long long、long longとlong long int? 一般に、同じ数の型は同じlongですか? 1長い: long l; int long il; long int li; 長い2: long long ll; int long long ill; long int long lil; long long int lli; また、上記が正しい場合、次の宣言も同じですか? long long* llp; int long long* illp; long int long* lilp; …
153 c++  syntax  long-integer 

4
操作は「false <true」で明確に定義されていますか?
C ++仕様は以下を定義していますか? ブール型パラメータの「小なり」演算子の存在。 4つのパラメーターの順列の結果? つまり、次の操作の結果は仕様で定義されていますか? false &lt; false false &lt; true true &lt; false true &lt; true 私のセットアップ(Centos 7、gcc 4.8.2)では、以下のコードは私が期待するものを吐き出します(Cの履歴でfalseを0として、trueを1として表す): false &lt; false = false false &lt; true = true true &lt; false = false true &lt; true = false ほとんどの(すべての)コンパイラーが同じ出力を出すと確信していますが、これはC ++仕様によって規定されていますか?または、難読化されていますが、仕様に準拠したコンパイラは、trueがfalseよりも小さいと判断できますか? #include &lt;iostream&gt; const char * s(bool a) { …

8
「while(1);」を最適化する C ++ 0x
更新されました、以下を参照してください! C ++ 0xを使用すると、コンパイラーが次のスニペットの「Hello」を出力できるようになる #include &lt;iostream&gt; int main() { while(1) ; std::cout &lt;&lt; "Hello" &lt;&lt; std::endl; } スレッドと最適化機能に関係しているようです。しかし、これは多くの人を驚かせる可能性があるようです。 許可するためにこれが必要だった理由について誰かが良い説明をしていますか?参考までに、最新のC ++ 0xドラフトは次のように述べています。6.5/5 forステートメントの場合のfor-init-statementの外側のループ ライブラリI / O関数を呼び出さない。 揮発性オブジェクトにアクセスまたは変更しない、および 同期操作(1.10)またはアトミック操作(29節)を実行しない 実装は終了すると想定できます。[注:これは、終了が証明できない場合でも、空のループの削除などのコンパイラ変換を可能にすることを目的としています。—エンドノート] 編集: この洞察に満ちた記事は、その標準テキストについて述べています 残念ながら、「未定義の動作」という言葉は使用されていません。ただし、標準で「コンパイラはPを想定している可能性があります」と記載されている場合は常に、not-Pプロパティを持つプログラムはセマンティクスが未定義であることを意味します。 それは正しいですか、コンパイラは上記のプログラムの「バイ」を出力することを許可されていますか? ここにはさらに洞察に満ちたスレッドがあります。これはCへの類似の変更に関するもので、上記のリンクされた記事を書いた人によって開始されました。他の有用な事実の中で、それらはC ++ 0xにも適用されると思われる解決策を提示します(更新:これはn3225ではもう機能しません-下記を参照してください!) endless: goto endless; コンパイラはループではなくジャンプなので、それを最適化することはできません。別の男はC ++ 0xとC201Xで提案された変更を要約します ループを書き込むことによって、プログラマがアサートされているいずれかのループは、可視挙動を有するもの(実行I / O、アクセス揮発性オブジェクト、または実行同期または原子操作)をしていること、 またはそれが最終的に終了すること。副作用のない無限ループを作成してその仮定に違反すると、コンパイラーに嘘をついてしまい、プログラムの動作は未定義になります。(運が良ければ、コンパイラーが警告するかもしれません。)この言語は、目に見える動作なしで無限ループを表現する方法を提供していません(提供していませんか?)。 2011年3月31日にn3225で更新:委員会はテキストを1.10 / 24に移動し、 実装は、すべてのスレッドが最終的に次のいずれかを実行すると想定する場合があります。 終了、 …

6
C ++がLR(1)パーサーで解析できないのはなぜですか?
私はパーサーとパーサージェネレーターについて読んでいて、このステートメントをウィキペディアのLR解析ページで見つけました。 多くのプログラミング言語は、LRパーサーのバリエーションを使用して解析できます。注目すべき例外の1つはC ++です。 なぜそうなのですか?C ++の特定のプロパティにより、LRパーサーで解析できなくなりますか? Googleを使用して、CはLR(1)で完全に解析できることがわかりましたが、C ++ではLR(∞)が必要です。

7
boost :: threadとboost :: mutexを同等のc ++ 11に置き換えるのは賢明ですか?
動機:私が検討している理由は、私の天才プロジェクトマネージャーが、ブーストは別の依存関係であり、「あなたはそれに依存している」ために恐ろしいと思っているためです(ブーストの品質について説明しようとしましたが、しばらくしてから断念しました:( )。私がそれをしたい小さな理由は、人々がコードを書き始めるので、私はc ++ 11の機能を学びたいということです。 #include&lt;thread&gt; #include&lt;mutex&gt;同等のものの間で1:1のマッピングがありますか? boostのものをc ++ 11の ものに置き換えることをお勧めしますか?私の使用法は原始的ですが、stdが何を後押しするのか提供しない例はありますか?または(冒とく)その逆ですか? PS私はGCCを使用しているため、ヘッダーがあります。


14
C / C ++でのNULLポインターのチェック[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5年前休業。 この質問を改善する 最近のコードレビューでは、寄稿者がNULLポインターのすべてのチェックが次の方法で実行されるように強制しようとしています: int * some_ptr; // ... if (some_ptr == NULL) { // Handle null-pointer error } else { // Proceed } の代わりに int * some_ptr; // ... if (some_ptr) { // Proceed } else { // Handle null-pointer error } 「このポインターがNULLではないことを確認してください」と明示的に言っているという意味で彼のやり方はもう少し明確であることに同意しますが、このコードに取り組んでいる誰もがポインター変数をifステートメントは暗黙的にをチェックしていNULLます。また、2番目の方法では、ilkのバグが発生する可能性が低くなります。 if (some_ptr = NULL) これは、見つけてデバッグするための絶対的な苦痛です。 …

13
num ++は 'int num'に対してアトミックですか?
一般ためにint num、num++(又は++num)、リード・モディファイ・ライト動作として、ある原子ではありません。しかし、GCCなどのコンパイラが次のコードを生成することがよくあります(ここで試してください)。 に対応する5行目num++は1つの命令なので、この場合num++ はアトミックであると結論付けることができますか? もしそうなら、それは、そのように生成num++されたデータレースの危険なしに同時(マルチスレッド)シナリオで使用できることを意味します(つまり、たとえば、それを作成する必要がなくstd::atomic&lt;int&gt;、関連するコストを課します。とにかくアトミック)? 更新 この質問はインクリメントがアトミックであるかどうかではないことに注意してください(そうではなく、それが問題の最初の行でした)。それはかどうかだことができ、特定の場合で1命令自然の缶はのオーバーヘッドを回避するために悪用されるかどうか、すなわち、特定のシナリオでも接頭辞を。そして、受け入れられた回答がユニプロセッサマシンに関するセクションで言及しているように、この回答と同様に、そのコメントでの会話や他の人が説明しているように、それは可能です(ただし、CまたはC ++ではできません)。lock

6
main()が終了すると、切り離されたスレッドはどうなりますか?
私はそれを開始しているstd::threadと仮定しdetach()て、それstd::threadが一度それを表していたとしても、スレッドがスコープ外になったとしても、スレッドは実行を続けます。 さらに、プログラムには、切り離されたスレッド1に参加するための信頼できるプロトコルがないため、main()終了時に切り離されたスレッドが引き続き実行されると仮定します。 1.10と30.3のどちらにも適切な表現が含まれておらず、何が起こるかを説明している標準(より正確には、N3797 C ++ 14ドラフト)には何も見つかりません。 1別の、おそらく同等の質問は、「デタッチされたスレッドを再び結合できるか」です。これは、どのプロトコルを結合しようと考えている場合でも、スレッドがまだ実行されている間にシグナリング部分を実行する必要があるため、OSスケジューラが受信側がスレッドが実際に終了したことを確実に検出する方法がなく、シグナリングが実行された直後に、スレッドを1時間スリープさせることにしました。 が不足している場合はmain()デタッチスレッドが実行されているとすると、未定義の動作で、その後、任意の使用は、std::thread::detach()メインスレッドが終了したことがない場合を除き、未定義の動作です2。 したがって、main()デタッチされたスレッドを実行して実行すると、定義された効果が必要になります。問題は次のとおりです。(C ++標準では、POSIXではなく、OSドキュメントではありません...)定義されている効果です。 2切り離されたスレッドは結合できません(の意味でstd::thread::join())。デタッチされたスレッドからの結果を待つことはできますが(たとえば、からstd::packaged_task、またはカウントセマフォまたはフラグと条件変数によって)、それはスレッドが実行を完了したことを保証するものではありません。あなたがスレッドの最初の自動オブジェクトのデストラクタにシグナリング部分を入れない限り、確かに、そこになり、一般的には、その実行コード(デストラクタ)も後のシグナリングコード。OSがメインスレッドをスケジュールして結果を消費し、デタッチされたスレッドがデストラクタの実行を完了する前に終了する場合、^ Wisはどのように定義されますか?

11
RTTIの価格はどれくらいですか?
RTTIを使用することによるリソースへの影響があることは理解していますが、それはどれくらいの大きさですか?私が見たどこでも、「RTTIは高価です」とだけ言っていますが、実際には、メモリ、プロセッサ時間、または速度を保護するベンチマークや定量的なデータを提供するものはありません。 では、RTTIはどれほど高価なのでしょうか。RAMが4MBしかない組み込みシステムで使用する可能性があるため、すべてのビットがカウントされます。 編集:S.ロットの回答に従って、私が実際に行っていることを含めた方が良いでしょう。 私はクラスを使用して、さまざまな長さのデータを渡し、さまざまなアクションを実行できるため、仮想関数のみを使用してこれを行うのは難しいでしょう。数個dynamic_castのs を使用すると、さまざまな派生クラスをさまざまなレベルを通過させながら、まったく異なる動作をさせることで、この問題を解決できるようです。 私の理解から、dynamic_castRTTIを使用しているので、限られたシステムで使用するのがどれほど実現可能か疑問に思っていました。
152 c++  performance  rtti 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.