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

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

6
コンパイラーは、他のタイプのループと比較して、do-whileループに対してより優れたコードを生成しますか?
zlib圧縮ライブラリ(特にChromiumプロジェクトで使用されています)には、Cのdo-whileループがほとんどのコンパイラで「より良い」コードを生成することを示すコメントがあります。これが表示されるコードのスニペットです。 do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ https://code.google.com/p/chromium/codesearch#chromium/src/third_party/zlib/deflate.c&l=1225 ほとんどの(または任意の)コンパイラがより優れた(たとえば、より効率的な)コードを生成するという証拠はありますか? 更新: 元の著者の1人であるMark Adlerがコメントに少しコンテキストを与えました。

8
Cで端子幅を取得していますか?
Cプログラム内からターミナルの幅を取得する方法を探しています。私が思いついているのは、次のようなものです。 #include <sys/ioctl.h> #include <stdio.h> int main (void) { struct ttysize ts; ioctl(0, TIOCGSIZE, &ts); printf ("lines %d\n", ts.ts_lines); printf ("columns %d\n", ts.ts_cols); } しかし、私がそれを試すたびに、 austin@:~$ gcc test.c -o test test.c: In function ‘main’: test.c:6: error: storage size of ‘ts’ isn’t known test.c:7: error: ‘TIOCGSIZE’ undeclared (first use in this …
89 c  linux  terminal  width 

4
memmpyよりmemmoveが速いのはなぜですか?
memmove(3)で時間の50%を費やすアプリケーションのパフォーマンスホットスポットを調査しています。アプリケーションは、何百万もの4バイト整数をソートされた配列に挿入し、memmoveを使用してデータを「右に」シフトし、挿入された値のためのスペースを作ります。 メモリのコピーは非常に高速であると私は予想しており、memoveに多くの時間が費やされていることに驚きました。しかし、それからmemmoveは、メモリの大きなページをコピーするのではなく、タイトなループで実装する必要がある重複領域を移動するため、遅いと考えました。memcpyとmemmoveの間にパフォーマンスの違いがあるかどうかを確認するために、小さなマイクロベンチマークを書きました。memcpyが勝つことを期待しています。 私は2つのマシン(コアi5、コアi7)でベンチマークを実行し、memmpyがmemcpyよりも実際に高速であることを確認しました。古いコアi7では、2倍近くも高速です!今、私は説明を探しています。 これが私のベンチマークです。memcpyで100 mbをコピーし、memmoveで約100 mb移動します。ソースと宛先が重複しています。発信元と宛先のさまざまな「距離」が試されます。各テストは10回実行され、平均時間が印刷されます。 https://gist.github.com/cruppstahl/78a57cdf937bca3d062c Core i5(Linux 3.5.0-54-generic#81〜precise1-Ubuntu SMP x86_64 GNU / Linux、gccは4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)での結果です。角かっこ内の数値はソースと宛先の間の距離(ギャップサイズ): memcpy 0.0140074 memmove (002) 0.0106168 memmove (004) 0.01065 memmove (008) 0.0107917 memmove (016) 0.0107319 memmove (032) 0.0106724 memmove (064) 0.0106821 memmove (128) 0.0110633 MemmoveはSSEに最適化されたアセンブラーコードとして実装され、後ろから前へコピーします。ハードウェアプリフェッチを使用してデータをキャッシュにロードし、128バイトをXMMレジスタにコピーして、宛先に格納します。 (memcpy-ssse3-back.S、1650行目以降) L(gobble_ll_loop): prefetchnta -0x1c0(%rsi) prefetchnta -0x280(%rsi) prefetchnta -0x1c0(%rdi) …
89 c++  c  performance  memory 

3
「as-if」ルールとは正確には何ですか?
タイトルの通り、 「as-if」ルールとは正確には何ですか? 典型的な答えは次のとおりです。 プログラムの監視可能な動作を変更しない、あらゆるコード変換を許可するルール 時々、このルールに起因する特定の実装から動作を取得し続けます。何度も間違って。だから、このルールは正確には何ですか。この規格では、この規則がセクションまたは段落として明確に言及されていないため、この規則の範囲に正確に該当するものは何ですか?私には、標準で詳細に定義されていない灰色の領域のように見えます。誰かが標準からの参照を引用して詳細を詳しく説明できますか? 注:これはCとC ++の両方としてタグ付けします。これは、両方の言語に関連するためです。
89 c++  c  optimization  c++-faq  as-if 

4
PTHREAD_MUTEX_INITIALIZERとpthread_mutex_init(&mutex、param)
違いはありますか pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; または pthread_mutex_t lock; pthread_mutex_init ( &lock, NULL); 最初の方法のみを使用しても安全ですか? 注:私の質問は、ほとんどの場合、せいぜい数台のクライアントをサーバーに接続して、ワーカースレッドでの問い合わせを解決するだけの非常に小さなプログラムに関係しています。
89 c  ubuntu  pthreads  mutex 


4
GDB:変数が値と等しい場合に中断
変数が設定した値と等しいときにGDBにブレークポイントを設定させたいので、次の例を試しました。 #include <stdio.h> main() { int i = 0; for(i=0;i<7;++i) printf("%d\n", i); return 0; } GDBからの出力: (gdb) break if ((int)i == 5) No default breakpoint address now. (gdb) run Starting program: /home/SIFE/run 0 1 2 3 4 5 6 Program exited normally. (gdb) ご覧のように、GDBはブレークポイントを作成しませんでしたが、これはGDBで可能ですか?
89 c  gdb 

4
「揮発性」の定義はこの揮発性ですか、それともGCCにいくつかの標準的なコンプライアンスの問題がありますか?
(WinAPIのSecureZeroMemoryのように)常にメモリをゼロにし、その後メモリが二度とアクセスされないとコンパイラが考えたとしても、最適化されない関数が必要です。揮発性の完璧な候補のようです。しかし、実際にこれをGCCで動作させるのにいくつか問題があります。関数の例を次に示します。 void volatileZeroMemory(volatile void* ptr, unsigned long long size) { volatile unsigned char* bytePtr = (volatile unsigned char*)ptr; while (size--) { *bytePtr++ = 0; } } 十分に単純です。ただし、GCCを呼び出すと実際に生成されるコードは、コンパイラのバージョンと実際にゼロにしようとしているバイト数によって大きく異なります。https://godbolt.org/g/cMaQm2 GCC4.4.7および4.5.3は揮発性を決して無視しません。 GCC 4.6.4および4.7.3は、配列サイズ1、2、および4の揮発性を無視します。 GCC 4.8.1から4.9.2までは、配列サイズ1および2の揮発性を無視します。 GCC 5.1から5.3までは、配列サイズ1、2、4、8の揮発性を無視します。 GCC 6.1は、どの配列サイズでもそれを無視します(一貫性のためのボーナスポイント)。 私がテストした他のコンパイラー(clang、icc、vc)は、コンパイラーのバージョンと配列サイズを問わず、期待どおりのストアを生成します。したがって、この時点で、これは(かなり古くて深刻な?)GCCコンパイラのバグなのか、それともこれが実際に準拠した動作であると不正確になり、ポータブルを作成することが本質的に不可能になる、標準でのvolatileの定義なのか疑問に思います。 SecureZeroMemory」関数? 編集:いくつかの興味深い観察。 #include <cstddef> #include <cstdint> #include <cstring> #include <atomic> void callMeMaybe(char* buf); …
89 c++  c  gcc  standards 

3
スレッドセーフvsリエントラント
最近、「mallocスレッドは安全ですか?」というタイトルで質問しました。、そしてその中で私は「mallocはリエントラントですか?」と尋ねました。 私は、すべての再入可能性がスレッドセーフであるという印象を受けました。 この仮定は間違っていますか?

14
スタックは上向きまたは下向きに成長しますか?
私はcにこのコードを持っています: int q = 10; int s = 5; int a[3]; printf("Address of a: %d\n", (int)a); printf("Address of a[1]: %d\n", (int)&a[1]); printf("Address of a[2]: %d\n", (int)&a[2]); printf("Address of q: %d\n", (int)&q); printf("Address of s: %d\n", (int)&s); 出力は次のとおりです。 Address of a: 2293584 Address of a[1]: 2293588 Address of a[2]: 2293592 Address …
89 c  memory  stack 

9
Cでnanとinfを使用する方法は?
エラーが発生した場合にnanまたはinfを返すことができる数値メソッドがあります。テスト目的で、状況が正しく処理されていることを確認するために、一時的にnanまたはinfを返すように強制したいと思います。Cでnanとinfの値を作成するための、コンパイラに依存しない信頼できる方法はありますか? 約10分間グーグルした後、コンパイラに依存するソリューションしか見つけることができませんでした。
89 c  math 

2
vdsoとvsyscallとは何ですか?
やった sudo cat /proc/1/maps -vv 出力を理解しようとしています。予想どおり、多くの共有ライブラリがメモリマッピングセグメントにマッピングされているのがわかります。 7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00584000-7f3c00585000 rw-p …
89 c  linux  linux-kernel  kernel  vdso 

10
constとconstvolatileの違い
volatile新しい値が更新されるたびに変数を宣言する場合変数をとして 宣言するconst場合、その変数の値は変更されません それでは、上記のようにconst volatile int temp; 変数を宣言することの使用法は何tempですか? として宣言するとconst int tempどうなりますか?
89 c  embedded 

3
OpenGLでglOrtho()を使用する方法は?
の使い方がわかりませんglOrtho。誰かがそれが何のために使われるのか説明できますか? xy座標とz座標の範囲の制限を設定するために使用されますか? glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); これは、x、y、zの範囲が-1から1であることを意味しますか?
89 c++  c  opengl 

10
Cの関数に引数として配列を渡す
配列を引数として含む関数を作成し、次のように配列の値を渡して呼び出します。 void arraytest(int a[]) { // changed the array a a[0]=a[0]+a[1]; a[1]=a[0]-a[1]; a[0]=a[0]-a[1]; } void main() { int arr[]={1,2}; printf("%d \t %d",arr[0],arr[1]); arraytest(arr); printf("\n After calling fun arr contains: %d\t %d",arr[0],arr[1]); } 私が見つけたのは、arraytest()値を渡して関数を呼び出しているのに、の元のコピーint arr[]が変更されていることです。 その理由を教えてください。

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