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

静的に型付けされた自由形式のマルチパラダイムでコンパイルされた汎用プログラミング言語であるC ++に関する質問。

7
ある行で変数を宣言し、次の行でそれを割り当てるのはなぜですか?
CおよびC ++コードでは、次の規則がよく見られます。 some_type val; val = something; some_type *ptr = NULL; ptr = &something_else; の代わりに some_type val = something; some_type *ptr = &something_else; 最初は、これはスコープの最上部ですべてのローカル変数を宣言しなければならなかった時代から残された習慣だと思っていました。しかし、私はベテラン開発者の習慣をすぐに却下しないことを学びました。だから、1行で宣言し、その後に割り当てる理由はありますか?
101 c++  c 

14
コンパイラの最適化に依存するコードを書くのは悪い習慣ですか?
私はいくつかのC ++を学習してきましたが、多くの場合、関数内で作成された関数から大きなオブジェクトを返す必要があります。参照渡し、ポインターを返し、参照型ソリューションを返すことはわかっていますが、C ++コンパイラー(およびC ++標準)が戻り値の最適化を許可していることも読んでいます。そのすべての時間とメモリを節約します。 オブジェクトが値によって明示的に返されると、構文がより明確になり、一般的にコンパイラはRVOを使用してプロセスをより効率的にするようになりました。この最適化に依存するのは悪い習慣ですか?ユーザーにとってコードがより明確で読みやすくなりますが、これは非常に重要ですが、コンパイラーがRVOの機会をつかむと仮定する必要がありますか? これはマイクロ最適化ですか、それともコードを設計するときに留意すべきことですか?
99 c++  performance 


8
最新のC ++はC#に取って代わりますか?Microsoftは開発者にC ++の採用を促していますか?[閉まっている]
最近のC ++の人気と、C#または他のCライクな言語からC ++への移行についての話を聞きます。 私はC ++ 11の機能について知っていますが、特にC#からC ++に移行した開発者からのあなたの経験を聞きたいです。 さらに重要なこととして、Microsoftは開発者にC ++の使用を促していますか?はいの場合、なぜですか?
91 c#  c++ 

8
関数をヘッダーファイルまたはソースファイルに文書化する方が良いでしょうか?
「ソース」ファイルと「ヘッダー」ファイル(主にCとC ++)を区別する言語では、ヘッダーファイルに関数を文書化する方が適切です。 (CCANから盗用) /** * time_now - return the current time * * Example: * printf("Now is %lu seconds since epoch\n", (long)time_now().tv_sec); */ struct timeval time_now(void); またはソースファイルで? (PostgreSQLから盗用) /* * Convert a UTF-8 character to a Unicode code point. * This is a one-character version of pg_utf2wchar_with_len. * * No …
86 c++  c  headers 

11
Javaの開発者は意識的にRAIIを放棄しましたか?
長年のC#プログラマーとして、最近、Resource Acquisition Is Initialization(RAII)の利点について詳しく知るようになりました。特に、C#のイディオムは次のとおりです。 using (var dbConn = new DbConnection(connStr)) { // do stuff with dbConn } C ++に相当するものがあります。 { DbConnection dbConn(connStr); // do stuff with dbConn } つまりDbConnection、usingブロックのようにリソースの使用を囲むことを覚えておくことは、C ++では不要です。これは、C ++の大きな利点のようです。あなたはタイプのインスタンスメンバを持つクラスを考えるとき、これは、より説得力があるDbConnectionたとえば、 class Foo { DbConnection dbConn; // ... } C#では、Foo IDisposableを次のように実装する必要があります。 class Foo : IDisposable { DbConnection dbConn; public void …
82 java  c#  c++  language-design 

15
JavaがC ++よりも高速になるのはなぜですか?
ベンチマークでJavaがC ++よりも優れている場合があります。もちろん、C ++のパフォーマンスが優れている場合もあります。 次のリンクを参照してください。 http://keithlea.com/javabench/ http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/ http://blog.cfelde.com/2010/06/c-vs-java-performance/ しかし、これはどのように可能ですか?解釈されたバイトコードは、コンパイルされた言語よりも高速である可能性があるということを、私の心を揺さぶります。 誰か説明してもらえますか?ありがとう!
79 java  c++  performance 

5
CおよびC ++用のパッケージ管理システムがないのはなぜですか?[閉まっている]
パッケージ管理システムが存在するプログラミング言語がいくつかあります。 TeXのCTAN PerlのCPAN Python用のPip&Eggs Maven for Java ハスケルのカバル Rubyの宝石 NodeJSのnpm フロントエンドJavascriptおよびCSSのバウアー C#のnuget PHPの作曲家 そのようなシステムには他の言語がありますか?CとC ++はどうですか?(それが主な質問です!)なぜそのようなシステムがないのですか?yum、apt-getまたはその他の一般的なパッケージ管理システム用のパッケージの作成は改善されていませんか?
78 c++  c  builds  packages 

20
最適化されたコードを読み取り可能なコードに置き換えても大丈夫ですか?
既存のコードを拡張/改善する必要がある状況に陥ることがあります。古いコードは非常にスリムですが、拡張するのも難しく、読むのに時間がかかります。 それを最新のコードに置き換えるのは良い考えですか? 少し前に私は無駄のないアプローチが好きでしたが、今では、より高い抽象化、より良いインターフェース、より読みやすく拡張可能なコードのために多くの最適化を犠牲にするほうが良いように思えます。 コンパイラも同様に良くなっているように見えるので、何も言わずstruct abc = {}にmemsetsに変わり、shared_ptrsは生のポインタをいじるのとほぼ同じコードを生成します。 それでも、スタックベースの配列や、いくつかのあいまいなロジックを持つ古いC関数が表示されることがありますが、通常はクリティカルパスにありません。 どちらかの方法でコードの一部に触れる必要がある場合、そのようなコードを変更することは良い考えですか?

12
手続き型プログラミングに対するオブジェクト指向プログラミングの利点は何ですか?
Cのような手続き型言語とC ++のようなオブジェクト指向言語の違いを理解しようとしています。私はC ++を使用したことはありませんが、2つを区別する方法について友人と話し合ってきました。 C ++には変数を定義するためのパブリックモードとプライベートモードだけでなく、オブジェクト指向の概念もあると言われています。Cにはないものです。Visual Basic.NETでプログラムを開発する際にこれらを使用する必要はありませんでした。これらの利点は何ですか? また、変数がパブリックであればどこからでもアクセスできると言われましたが、Cのような言語のグローバル変数とどのように異なるのかは明確ではありません。プライベート変数がローカル変数とどのように異なるのかも明確ではありません。 私が聞いたもう一つのことは、セキュリティ上の理由から、関数にアクセスする必要がある場合、最初に関数を継承する必要があるということです。ユースケースは、管理者がすべてではなく必要なだけの権限を持っている必要があることですが、条件付きでもうまくいくようです: if ( login == "admin") { // invoke the function } なぜこれが理想的ではないのですか? オブジェクト指向のすべてを行うための手続き的な方法があるように思えるのに、なぜオブジェクト指向のプログラミングを気にしなければならないのですか?

11
C ++ですべてのオブジェクトに対応するベースが推奨されない理由
Stroustrup氏は、「すべてのクラス(Objectクラス)に一意のベースをすぐに発明しないでください。通常、多くの/ほとんどのクラスでそれを使用せずに改善できます。」(C ++プログラミング言語Fourth Edition、Sec 1.3.4) 一般に、すべてを対象とする基本クラスが悪い考えであるのはなぜですか?また、いつ作成するのが理にかなっていますか?

3
PythonがC ++ではなくCで書かれているのはなぜですか?
でPythonのチュートリアル 1は、Pythonのオリジナル実装はCであることを読み取ることができます。 一方、Cで書かれたPython実装(...) PythonがC ++ではなくCで作成されたのはなぜですか? この決定の背景にある理由を知りたいのですが、その答えは歴史的な参考文献によって支持されるべきです(意見に基づくものではありません)。

6
`catch(…){throw; } `悪い習慣ですか?
... 再スローせずにキャッチするのは本当に間違っていることに同意しますが、次のような構造を使用すると信じています。 try { // Stuff } catch (...) { // Some cleanup throw; } RAIIが適用されない場合に受け入れられます。(質問しないでください...私の会社の全員がオブジェクト指向プログラミングを好むわけではなく、RAIIはしばしば「役に立たない学校のもの」と見られています...) 私の同僚は、どの例外がスローされるかを常に知っておく必要があり、次のような構造を常に使用できると言っています。 try { // Stuff } catch (exception_type1&) { // Some cleanup throw; } catch (exception_type2&) { // Some cleanup throw; } catch (exception_type3&) { // Some cleanup throw; } これらの状況に関して、十分に認められた良い慣行はありますか?
74 c++ 

19
なぜミクロのパフォーマンスと効率を気にする必要があるのですか?
C / C ++ページの多くの質問と回答、具体的または間接的にマイクロパフォーマンスの問題(間接関数と直接関数とインライン関数のオーバーヘッドなど)、またはO(N 2)vs O(N log N)アルゴリズムの使用100アイテムのリスト。 私は、問題がない限り、または問題があることがわかるまで、常にマイクロパフォーマンスを気にせず、マクロパフォーマンスにほとんど気を配らずに、コーディングしやすく、信頼性の高いコードを維持します。 私の質問は、なぜ多くのプログラマーがそんなに気にするのかということです。それはほとんどの開発者にとって本当に問題なのでしょうか、それについてあまり心配する必要がないほど幸運だったのでしょうか、それとも私は悪いプログラマーですか?

3
新しいコードのほぼすべての場所でC ++ 17の[[nodiscard]]を使用しない理由は何ですか?
C ++ 17には[[nodiscard]]属性が導入されており、プログラマーは、返されたオブジェクトが呼び出し元によって破棄された場合にコンパイラーが警告を生成する方法で関数をマークできます。同じ属性をクラスタイプ全体に追加できます。 私は元の提案でこの機能の動機について読んだことがあり、C ++ 20が属性をのような標準関数に追加することを知っていますstd::vector::empty。その名前は戻り値に関する明確な意味を伝えません。 これはクールで便利な機能です。実際、それはほとんど便利すぎるようです。私が読んだ[[nodiscard]]すべての場所で、人々はあなたがそれを選択したいくつかの関数または型に追加し、残りを忘れるかのように議論しています。しかし、特に新しいコードを書くとき、なぜ破棄不可能な値が特別な場合である必要がありますか?通常、破棄された戻り値はバグではなく、少なくともリソースの無駄ではありませんか? そして、コンパイラができるだけ多くのエラーをキャッチする必要があるというのは、C ++自体の設計原則の1つではありませんか? もしそうなら[[nodiscard]]、独自の非レガシーコードをほぼすべての非void関数とほぼすべてのクラスタイプに追加してみませんか? 私は自分のコードでそれをやろうとしましたが、非常に冗長で、Javaのように感じ始めることを除いて、うまく動作します。意図をマークする他のいくつかの場合を除いて、デフォルトで破棄された戻り値について コンパイラーに警告させるほうがはるかに自然に思えます[*]。 標準提案、ブログエントリ、Stack Overflowの質問、またはインターネット上の他の場所では、この可能性に関する議論がゼロであるため、何かが足りないはずです。 新しいC ++コードでは、なぜそのような仕組みが意味をなさないのでしょうか?冗長性は、[[nodiscard]]ほとんどどこでも使用しない唯一の理由ですか? [*]理論的には、[[maydiscard]]代わりに属性のようなものがありprintf、標準ライブラリの実装のように関数にさかのぼって追加することもできます。
70 c++ 

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