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

Cは、システムプログラミング(OSおよび組み込み)、ライブラリ、ゲーム、クロスプラットフォームに使用される汎用プログラミング言語です。このタグは、ISO 9899標準で定義されているC言語に関する一般的な質問で使用する必要があります(特に指定のない限り、最新バージョン9899:2018。バージョン固有のリクエストには、c89、c99、c11などのタグも付けます)。CはC ++とは異なり、合理的な理由がない限り、C ++タグと組み合わせるべきではありません。


8
Cの構造体とポインタのmalloc
ベクトルの長さとその値を表す構造を次のように定義するとします。 struct Vector{ double* x; int n; }; ここで、ベクトルyを定義し、それにメモリを割り当てたいとします。 struct Vector *y = (struct Vector*)malloc(sizeof(struct Vector)); インターネットで検索したところ、xにメモリを個別に割り当てる必要があることがわかりました。 y->x = (double*)malloc(10*sizeof(double)); しかし、y-> xにメモリを2回割り当てているようで、1つはyにメモリを割り当て、もう1つはy-> xにメモリを割り当てているようで、メモリの浪費のようです。コンパイラが実際に何をするのか、yとy-> xの両方を初期化する正しい方法を教えていただければ幸いです。 前もって感謝します。

11
割り当てられたメモリでfree()を使用しないことは問題ありませんか?
私はコンピュータ工学を勉強していて、いくつかの電子工学コースを持っています。私はそれを使用して回避することができる(これらのコースの)私の教授の2から、聞いたfree()(後に機能をmalloc()、calloc()おそらく割り当てられたメモリ空間は、他のメモリを割り当てるために再び使用されることはありませんので、など)。つまり、たとえば、4バイトを割り当ててから解放すると、4バイトのスペースができて、再び割り当てられない可能性があります。つまり、穴ができます。 私はそれがおかしいと思います:あなたはそれを解放せずにヒープにメモリを割り当てるおもちゃではないプログラムを持つことはできません。しかし、私には、それぞれにmalloc()がなければならないほど重要である理由を正確に説明する知識がありませんfree()。 だから:使用せmalloc()ずに使用することが適切であるかもしれない状況はありfree()ますか?そうでない場合は、どうすればこれを教授に説明できますか?

11
符号なしバイトの飽和減算/加算
私は2つの符号なしバイトを持っている想像bしてx。bsubasb - xとbaddasを計算する必要がありb + xます。ただし、これらの操作中にアンダーフロー/オーバーフローが発生することは望ましくありません。例(擬似コード): b = 3; x = 5; bsub = b - x; // bsub must be 0, not 254 そして b = 250; x = 10; badd = b + x; // badd must be 255, not 4 これを行うための明白な方法には、分岐が含まれます。 bsub = b - min(b, x); badd …


15
Cに推奨されるgcc警告オプション[クローズ]
クローズ。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 6年前に閉鎖されました。 この質問を改善する -Wall以外に、他にどのような警告が役立つと思われますか? http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
83 c  gcc  compiler-errors 

5
「プラグマ」という言葉はどこから来たのですか?
だから私はプラグマが何であるか、そしてそれが何のために使われるかを知っています、しかし単語自体の意味は何ですか?私はコードで何度もそれを使用しましたが、その単語が実際に何を意味するのか、または何を表すのかを本当に知りませんでした。
83 c++  c  terminology  pragma 

9
C ++からCへの移行
C ++でのコーディングを数年行った後、私は最近、組み込み分野でCでのコーディングの仕事を提供されました。 埋め込みフィールドでC ++を却下することが正しいか間違っているかという問題はさておき、C ++にはいくつかの機能/イディオムがあります。ほんの数例を挙げると: 一般的なタイプセーフなデータ構造(テンプレートを使用)。 RAII。特に、複数のリターンポイントを持つ関数では、たとえば、各リターンポイントでミューテックスを解放することを覚えておく必要はありません。 一般的なデストラクタ。つまり、MyClassに対してd'torを1回作成すると、MyClassインスタンスがMyOtherClassのメンバーである場合、MyOtherClassはMyClassインスタンスを明示的に非初期化する必要はありません。そのd'torは自動的に呼び出されます。 名前空間。 C ++からCに移行した経験は何ですか? お気に入りのC ++機能/イディオムの代わりにどのCを見つけましたか?C ++に必要なC機能を見つけましたか?
83 c++  c 

1
Cコードループのパフォーマンス[続き]
この質問は、ここでの私の質問に続きます(Mysticalのアドバイスに基づいて): Cコードループのパフォーマンス 私の質問を続けると、スカラー命令の代わりにパック命令を使用すると、組み込み関数を使用するコードは非常によく似たものになります。 for(int i=0; i<size; i+=16) { y1 = _mm_load_ps(output[i]); … y4 = _mm_load_ps(output[i+12]); for(k=0; k<ksize; k++){ for(l=0; l<ksize; l++){ w = _mm_set_ps1(weight[i+k+l]); x1 = _mm_load_ps(input[i+k+l]); y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1)); … x4 = _mm_load_ps(input[i+k+l+12]); y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4)); } } _mm_store_ps(&output[i],y1); … _mm_store_ps(&output[i+12],y4); } このカーネルの測定されたパフォーマンスは、サイクルあたり約5.6 FP操作ですが、スカラーバージョンのパフォーマンスの正確に4倍、つまりサイクルあたり4.1,6 = 6,4 FPopsであると予想されます。 重み係数の動きを考慮に入れると(それを指摘してくれてありがとう)、スケジュールは次のようになります。 movssスカラーの重み値をXMMレジスタに移動し、shufpsこのスカラー値をベクトル全体にコピーするために使用する操作の後に追加の命令がありますが、スケジュールは変更されていないようです。mulps負荷から浮動小数点ドメインへの切り替え待ち時間を考慮に入れると、重みベクトルをしばらくの間使用する準備ができているようです。したがって、これによって余分な待ち時間が発生することはありません。 …

9
x << 1またはx << 10のどちらが速いですか?
私は何も最適化したくありません、私は誓います、私は好奇心からこの質問をしたいだけです。ほとんどのハードウェアには、単一のコマンドであるビットシフトのアセンブリコマンド(たとえばshl、shr)があることを私は知っています。ただし、シフトするビット数は重要ですか(ナノ秒単位、またはCPUタクト単位)。言い換えれば、次のいずれかがどのCPUでも高速ですか? x &lt;&lt; 1; そして x &lt;&lt; 10; そして、この質問で私を憎まないでください。:)
83 c++  c  performance  cpu  low-level 

3
CUDAがメモリを固定するのはなぜそんなに速いのですか?
CUDAデータ転送にピン留めされたメモリを使用すると、データ転送が大幅に高速化されます。Linuxでは、これを実現するための基盤となるシステムコールはmlockです。mlockのmanページから、ページをロックするとスワップアウトされないことが示されています。 mlock()は、addrから始まり、lenバイトまで続くアドレス範囲のページをロックします。指定されたアドレス範囲の一部を含むすべてのページは、呼び出しが正常に戻ったときにRAMに常駐することが保証されています。 私のテストでは、システムに数ギガの空きメモリがあったため、メモリページがスワップアウトされるリスクはありませんでしたが、それでもスピードアップが見られました。誰かがここで実際に何が起こっているのか説明できますか?、洞察や情報は大歓迎です。
83 c++  c  linux  cuda 

10
strcpyの代わりにstrncpyを使用する必要があるのはなぜですか?
編集:例のソースを追加しました。 私はこの例に出くわしました: char source[MAX] = "123456789"; char source1[MAX] = "123456789"; char destination[MAX] = "abcdefg"; char destination1[MAX] = "abcdefg"; char *return_string; int index = 5; /* This is how strcpy works */ printf("destination is originally = '%s'\n", destination); return_string = strcpy(destination, source); printf("after strcpy, dest becomes '%s'\n\n", destination); /* This is …

13
char配列を空にする方法は?
charmembers [255]のようなcharの配列があります。ループを使用せずに完全に空にするにはどうすればよいですか? char members[255]; 「空」とは、値が格納されている場合は格納されないことを意味します。たとえば、strcatを実行した場合、古い値は残らないはずです members = "old value"; //empty it efficiently strcat(members,"new"); // should return only new and not "old value new"
83 c  arrays  char 

7
可変数の引数をprintf / sprintfに渡す方法
一部のテキストをフォーマットする「エラー」関数を保持するクラスがあります。可変数の引数を受け入れてから、printfを使用してそれらをフォーマットしたいと思います。 例: class MyClass { public: void Error(const char* format, ...); }; Errorメソッドはパラメーターを受け取り、printf / sprintfを呼び出してフォーマットしてから、何かを実行する必要があります。すべてのフォーマットを自分で書きたくないので、既存のフォーマットの使用方法を試してみるのは理にかなっています。


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