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

Cは、オペレーティングシステム、ゲーム、その他の高性能作業に使用される汎用のコンピュータープログラミング言語です。

16
今日、ソフトウェアプロジェクトにCを使用しますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 はいの場合、どこで、なぜそれを使用しますか? いいえの場合、Cが受け入れられない理由を説明してください。

6
生徒にアロカを教えるべきですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 alloca現実の世界ではどれくらい広く使われていますか?alloca理にかなっているときに生徒に使用を教えるべきですか?または、絶対に使用しないように教える必要がありますか?C ++ RAIIのバックグラウンドから来るとfree、特に複数の出口点を持つ関数では、手動で呼び出す必要がないという考えは有望に聞こえます。
18 c  teaching 

2
Linux / BSDに汎用のバッチ処理システムコールがないのはなぜですか?
バックグラウンド: システムコールのオーバーヘッドは、主にユーザー空間からカーネル空間へ、およびその逆へのコンテキストの切り替えにより、関数呼び出しのオーバーヘッドよりもはるかに大きくなります(推定範囲は20〜100倍)。関数呼び出しのオーバーヘッドを節約するためにインライン関数が一般的であり、関数呼び出しはsyscallsよりもはるかに安価です。開発者が1つのsyscallでカーネル内の操作を可能な限り処理することにより、システムコールのオーバーヘッドの一部を避けたいと考えるのは理にかなっています。 問題: これは、のような(?余計な)システムコールをたくさん作成したsendmmsgを() 、recvmmsg()などのようにchdir、オープン、のlseekおよび/またはシンボリックリンクの組み合わせ:openat、mkdirat、mknodat、fchownat、futimesat、newfstatat、unlinkat、fchdir、ftruncate、fchmod、renameat、linkat、symlinkat、readlinkat、fchmodat、faccessat、lsetxattr、fsetxattr、execveat、lgetxattr、llistxattr、lremovexattr、fremovexattr、flistxattr、fgetxattr、pread、pwrite等... 現在copy_file_range()、読み取りlseekと書き込みsyscallを組み合わせたLinuxが追加されました。これがfcopy_file_range()、lcopy_file_range()、copy_file_rangeat()、fcopy_file_rangeat()およびlcopy_file_rangeat()になるまでの時間の問題です...しかし、X個の呼び出しの代わりに2個のファイルがあるため、X ^ 2になる可能性がありますもっと。わかりました、LinusとさまざまなBSD開発者はそこまで行きませんが、私のポイントは、バッチシステムコールがあれば、これらのすべて(ほとんど?) libc側にオーバーヘッドがある場合。 システムコールをバッチ処理するための非ブロッキングシステムコール用の特別なシステムコールスレッドを含む、多くの複雑なソリューションが提案されています。ただし、これらの方法は、libxcbとlibX11の場合とほぼ同じ方法で、カーネルとユーザー空間の両方にかなりの複雑さを追加します(非同期呼び出しにはより多くのセットアップが必要です) 解決?: 汎用バッチ処理システムコール。これにより、特殊なカーネルスレッドを使用することに伴う複雑さなしに、最大コスト(複数モードスイッチ)が軽減されます(ただし、その機能は後で追加できます)。 socketcall()syscallには、基本的にプロトタイプの基本がすでにあります。引数の配列を取ることからそれを拡張して、代わりに戻り値の配列、引数の配列へのポインター(syscall番号を含む)、syscallの数、およびflags引数などを取得します。 batch(void *returns, void *args, long ncalls, long flags); 大きな違いの1つは、前のsyscallsの結果を後続のsyscalls(たとえば/ で使用するためのファイル記述子)で使用できるように、引数はおそらくすべて単純化のためのポインターである必要があることです。open()read()write() 考えられるいくつかの利点: ユーザースペースの削減->カーネルスペース->ユーザースペースの切り替え 可能なコンパイラスイッチ-fcombine-syscallsは、自動的にバッチ処理を試行します 非同期操作のオプションフラグ(fdを返すとすぐに監視されます) ユーザースペースに将来の結合されたsyscall関数を実装する機能 質問: バッチ処理システムコールを実装することは可能ですか? 明らかな落とし穴がありませんか? メリットを過大評価していますか? バッチ処理システムコールの実装を気にすることは価値がありますか(Intel、Google、またはRedhatで働いていません)。 以前に自分のカーネルにパッチを適用しましたが、LKMLを扱うのは恐ろしいです。 歴史は、「普通の」ユーザー(git書き込みアクセスのない非企業のエンドユーザー)にとって何かが広く有用であっても、上流(unionfs、aufs、cryptodev、tuxoniceなど)に受け入れられることはないことを示しています。 参照: FlexSC:例外のないシステムコールを使用した柔軟なシステムコールスケジューリング 専用ユーザーおよびカーネルCPUを介したシステムコールのオーバーヘッドの回避

6
長い「列」コードのために短い変数名を犠牲にしますか?
私は適切なプログラミングスキルを習得しようとするCSクラスのアマチュアプログラマーです。これが私のコードの見た目です。コードの端は103列まで拡張されています。 int extractMessage(char keyWord[25], char cipherText[17424], int rowSize, char message[388]) { int keyColumn = 0; int cipherColumn = 0; int offset = 1; int nextWord = 1; int lengthOfWord = 0; int lengthOfCipher = 0; lengthOfWord = length(keyWord); lengthOfCipher = length(cipherText); while (keyWord[keyColumn] != cipherText[cipherColumn]) { cipherColumn++; if (keyWord[keyColumn + …
17 c  coding-style 

2
隣接する文字列リテラルの連結について
CおよびC ++は、隣接する文字列リテラルを単一の文字列リテラルとしてコンパイルします。例えばこれは: "Some text..." "and more text" 以下と同等です: "Some text...and more text" C#やJavaなどの他のCファミリ言語では、これは構文エラーです(完全に問題ありません)。 CおよびC ++がこれを行う理由/歴史的理由は何ですか?

4
標準に準拠する必要がありますか?
Stack Overflowには、C標準について常に語る経験豊富な人々がいます。たとえ私のために働いていても、人々は非ポータブルなソリューションを好まないようです。わかりました、標準に従う必要があることを理解していますが、プログラマーの創造性に束縛をかけませんか? 標準に従うことから得られる具体的な利点は何ですか?特に、コンパイラは標準をわずかに異なる方法で実装する場合があるためです。

7
静的解析の落とし穴を避ける方法
私はジョエル・テストで少なくとも11点を獲得する会社で働いています。少なくとも紙の上では。 ただし、実際には、期待どおりに機能するものはなく、プロジェクトはDEFCON 1で半年間使用されています。今、私の同僚のほとんどは、日曜日の午後6時に帰宅できれば幸いです。 動作していないように感じた一見良いプラクティスの1つは、静的分析ツールの使用です。このプロジェクトは、gcc -Wall警告と独自の非常に高価な「C / C ++」ツールの両方を追跡します。 GCCの警告は、実際の(ほとんどの場合、不快ではない)バグを指すことはほとんどありません。 ただし、プロプライエタリなツールは、暗黙的なキャストや文字列リテラルのsizeof'ingなどをリストします。暗黙のキャストもスタイルブックでブラックリストに載っています。 標準的な慣行では、すべての警告を黙らせる必要があります。これにより、主に誤検知である警告が除外されることに注意してください。これは問題ではありません。 結果は次のとおりです。 人々はすべての右辺値とすべての引数に型キャストを追加し、プロセスで実際に問題のある型の不一致を隠します。 人々は1つのバグで紹介するか、別の問題のある言語機能を使用します(sizeofの代わりにstrlen、strcpyの代わりにstrncpyなど)。 警告は沈黙します。 バグレポートが開始されます。 主なポイントは、元のコードが機能しており、言語能力の範囲内で安全に遊んでいた人々によって書かれていたのに対し、修正はそうではなかったことです。 今、私はこの会社が救われるとは考えていません。ただし、「プロ」ツールを使用するためのより良い、できれば機能する方法があるかどうか、または私が将来決定を下す場合にそれらの使用を完全に避けるべきかどうかを知りたいです。 すべてのプログラマーが失敗することのない天才だとは限らないソリューション。なぜなら、そうであれば、そもそもツールを使用する必要がないからです。

8
組み込みデバイスでTDDを実行するにはどうすればよいですか?
プログラミングは初めてではなく、AVRで低レベルのCおよびASMを使用したこともありますが、大規模な組み込みCプロジェクトを回避することはできません。 RubyのTDD / BDDの哲学に退化されているため、このようなコードを作成してテストする方法を理解することはできません。私はそれが悪いコードだと言っているのではなく、これがどのように機能するのか理解していません。 低レベルのプログラミングにもっと入りたいと思っていましたが、これにどのようにアプローチするのか全く分かりません。それは私が慣れ親しんだまったく異なる考え方のように見えるからです。ポインターの計算やメモリの割り当ての仕組みを理解するのに問題はありませんが、Rubyと比較して複雑なC / C ++コードがどのように見えるかを見ると、信じられないほど難しいようです。 すでにArduinoのボードを注文しているので、低レベルCをさらに理解して、物事を適切に行う方法を本当に理解したいと思いますが、高レベル言語のルールは適用されないようです。 組み込みデバイスでTDDを実行したり、ドライバーやカスタムブートローダーなどを開発したりすることも可能ですか?

6
FortranコンパイラはCコンパイラよりも実際に高速なコードを生成しますか?
大学で勉強していたとき、Fortranコンパイラは同等のプログラムのCコンパイラよりも速いコードを生成するという考えをよく耳にしました。 主な理由は次のとおりです。Fortranコンパイラはコード1行あたり平均1,1プロセッサ命令を発行しますが、Cコンパイラはコード1行あたり平均1,6プロセッサ命令を発行します -正確な数字は覚えていませんが、アイデアは、Cコンパイラが著しく多くのマシンコードを出力し、そのためより遅いプログラムを生成するというものでした。 そのような比較はどの程度有効ですか?FortranコンパイラーはCコンパイラーよりも高速なプログラムを生成する、またはその逆と言えますか?なぜこの違いが存在するのですか?

2
C ++メソッドを、ポインター引数を持つC関数に変換することは受け入れ可能なパターンですか?
ESP-32でC ++を使用しています。タイマーを登録するとき、私はこれをしなければなりません: timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback); timer_args.arg = this; ここでタイマーが呼び出しますsoundCallback。 タスクを登録するときも同じこと: xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle); そのため、メソッドは個別のタスクで開始されます。 GCCは常にこれらの変換について警告しますが、計画どおりに機能します。 量産コードでは受け入れられますか?これを行うためのより良い方法はありますか?
16 c++  c  functions 

4
アセンブリからマシンコードへの移行方法(コード生成)
コードを機械コードにアセンブルするステップを視覚化する簡単な方法はありますか? たとえば、メモ帳でバイナリファイルを開くと、マシンコードのテキスト形式の表現が表示されます。私はあなたが見る各バイト(シンボル)がそのバイナリ値に対応するASCII文字であると仮定しますか? しかし、アセンブリからバイナリにどのように移行するのでしょうか。舞台裏で何が起こっているのでしょうか??

6
コードの複製はCで必要な悪ですか?
私はCを初めて使用しますが、一般的なデータ構造とCの一般的な記述に関して、コードの重複が必要な悪なのかどうか疑問に思っています。 hash mapたとえば、一般的な実装を記述しようとすることもできますが、最終結果は常に乱雑になります。また、この特定のユースケースだけに特化した実装を記述し、コードを明確に保ち、​​読みやすくデバッグしやすくすることもできます。後者はもちろん、コードの重複につながります。 一般的な実装は標準ですか、それともユースケースごとに異なる実装を作成しますか?

10
アルゴリズムプログラミングのためのC上のPythonの優先
私は少しアルゴリズムを勉強していて、SPOJ.pl TopCoderなどのサイトを見てきました。プログラマーは通常、ほとんどのアルゴリズムプログラミングコンテストでCまたはC ++を好むことがわかりました。 今、私は最近いくつかの問題を抱えています。私は少しのCとPythonの両方を知っています。コードを書き込もうとすると、ほとんどのアルゴリズムでCよりPythonを好むようです。CIでコードを書くために座るたびに、約15分後にあきらめます。これは面倒で、Pythonに移行する傾向があるためです。マトリックスポインターなどを渡すことは、無駄な時間の無駄であるように思われ、実際にアルゴリズム自体について考えるために利用できます。 今、私はCが非常に重要な言語であり、多くのプログラマーのパンとバターであ​​ることを多くの人々から知っています。 私が知りたかったのは、私のこのアプローチに欠点/結果/欠点などがあるかどうかでした。 これはPython対Cの議論ではありません。これは、使いやすさのためにCよりもPythonを好むというこの特定の慣行が、長期的には私や他のプログラマー/コンピューター科学者にどのように影響するかについての質問です。 私は、これらの言語を業界で使用したことのある人々から、および/または大規模なソフトウェア/ライブラリなどを開発したいのです。

2
最新のC ++パラダイムの概要 [閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 私は8〜10年前にC ++を広範囲に記述していました。それ以来、専門的な理由でC#に移行しました。しかし、時々私は次のような声明を見ます 「まだポインタ参照を手動で追跡している場合は、間違っています」 または 「C ++は、RAIIのような最新のコンセプトを使用しており、回復中のC開発者のようにメモリを手動で割り当てない限り、完全に安全です。」 どちらも10年前の標準的な手順でした。最近、C ++がかなり改善されているのを見てきました。特にC ++ 0xには、いくつかの新しい機能があるようです。「C / old C ++」プログラマーが「最新」のC ++パターンとプラクティスに追いつくための最適なリソースは何ですか?

8
C ++を使用し、言語固有の機能を使用しない場合、Cに切り替える必要がありますか?
趣味としてNESエミュレーターを開発しています。C ++を使用している理由は、私が主に使用している言語であり、ほとんどを知っており、ほとんどの言語が好きだからです。 しかし、プロジェクトにある程度前進したので、C ++の特定の機能をほとんど使用していないことに気付き、プレーンなCでも同じ結果を得ることができたはずです。テンプレート、演算子のオーバーロード、ポリモーフィズム、継承は使用しません。それで、あなたは何と言いますか?C ++のままにするか、Cで書き直す必要がありますか? パフォーマンスを上げるためにこれを行うことはありませんが、副作用として生じる可能性がありますが、それが必要ないのであれば、なぜC ++を使用する必要があるのでしょうか? 私が使用しているC ++の唯一の機能は、データとメソッドをカプセル化するクラスですが、構造体と関数でも同様に行うことができ、newとdeleteを使用していますが、mallocとfreeを使用することもできます関数へのポインタで達成できるコールバックのためだけに継承を使用します。 趣味のプロジェクトであり、締め切りがないので、書き直しが必要なオーバーヘッド時間と作業は問題ではなく、楽しいかもしれません。だから、質問はCまたはC ++ですか?
16 c++  c 

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