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

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

1
Linuxで正確なCPUキャッシュ階層情報をプログラムで取得する
Linux上の現在のCPUのデータキャッシュ階層の正確な説明を取得しようとしています。個々のL1 / L2 / L3(およびおそらくL4)データキャッシュのサイズだけでなく、それらが分割または共有される方法もコア。 たとえば、私のCPU(AMD Ryzen Threadripper 3970X)では、各コアには独自の32 KBのL1データキャッシュと512 KBのL2キャッシュがありますが、L3キャッシュはコアコンプレックス(CCX)内のコア間で共有されます。つまり、それぞれ16 MBの8つの異なるL3キャッシュがあります。 このWindows上のCPU-Zのスクリーンショットの「キャッシュ」セクションは、基本的に私が探しているものです。 Windowsでこれらの情報を取得しても問題ありませんGetLogicalProcessorInformation()。 ただし、Linuxでは、sysconf()L1およびL2データキャッシュのコアごとのキャッシュサイズ(_SC_LEVEL1_DCACHE_SIZEおよび_SC_LEVEL2_DCACHE_SIZE)、またはL3キャッシュの合計サイズ(_SC_LEVEL3_CACHE_SIZE)のどちらかしか表示されないようです。 編集:VMWareでの lstopoの出力。仮想マシンには8つのコアがあります。L1およびL2キャッシュ情報は問題ありませんが、L3キャッシュサイズが正しくないようです。

1
sqrtsd命令のレイテンシが入力に基づいて変化するのはなぜですか?Intelプロセッサ
まあ上でインテル固有のガイドには、「sqrtsd」と呼ばれる命令は18サイクルのレイテンシーを持っていることが述べられています。 私はそれを自分のプログラムでテストしました。たとえば、0.15を入力として受け取った場合は正しいです。しかし、256(または任意の2 ^ x)の数をとると、レイテンシはわずか13になります。なぜですか? 私が持っていた1つの理論は、13は「sqrtss」のレイテンシであり、「sqrtsd」と同じですが32ビット浮動小数点で行われるため、プロセッサは256ビットが32ビットに適合し、そのバージョンを使用することを理解するのに十分スマートであるということです一方、0.15は有限の方法で表現できないため、完全な64ビットが必要です。 私はインラインアセンブリを使用してそれをやっています、これはgcc -O3と-fno-tree-vectorizeでコンパイルされた関連部分です。 static double sqrtsd (double x) { double r; __asm__ ("sqrtsd %1, %0" : "=x" (r) : "x" (x)); return r; }

2
分解されたバイナリ爆弾フェーズ3のロジックを理解する難しさ
バイナリ爆弾ラボから次のアセンブリプログラムがあります。目的は、explode_bomb関数をトリガーせずにバイナリを実行するために必要なキーワードを決定することです。このプログラムのアセンブリの分析についてコメントしましたが、すべてを一緒に結合するのに問題があります。 必要な情報はすべて揃っていると思いますが、それでも実際の根本的なロジックを確認できず、行き詰まっています。どんな助けにも感謝します! 以下は、逆アセンブルされたプログラム自体です。 0x08048c3c <+0>: push %edi 0x08048c3d <+1>: push %esi 0x08048c3e <+2>: sub $0x14,%esp 0x08048c41 <+5>: movl $0x804a388,(%esp) 0x08048c48 <+12>: call 0x80490ab <string_length> 0x08048c4d <+17>: add $0x1,%eax 0x08048c50 <+20>: mov %eax,(%esp) 0x08048c53 <+23>: call 0x8048800 <malloc@plt> 0x08048c58 <+28>: mov $0x804a388,%esi 0x08048c5d <+33>: mov $0x13,%ecx 0x08048c62 <+38>: mov %eax,%edi 0x08048c64 …

2
複数の引数を持つkvmハイパーコール
私は現在、kvmを使用して小さなハイパーバイザーとカーネルを構築しようとしていますが、複数の引数を持つハイパーコールが正しく機能するように努力しています。 これが私が試したものです: // guest.c #define KVM_HYPERCALL vmcall // #define KVM_HYPERCALL vmmcall // #define KVM_HYPERCALL ".byte 0x0f,0x01,0xd9" // #define KVM_HYPERCALL .byte 0x0f,0x01,0xc1" static inline long kvm_hypercall4(int nr, unsigned long p1, unsigned long p2, unsigned long p3, unsigned long p4) { long ret; asm volatile(KVM_HYPERCALL : "=a"(ret) : "a"(nr), "b"(p1), "c"(p2), "d"(p3), …

3
文字列内から整数を抽出するにはどうすればよいですか?
私は割り当てに取り組んでおり、その一部として文字列から整数を抽出する必要があります。 atoi()関数を使用しようとしましたが、常にを返します0。そのため、に切り替えましたstrtol()が、それでもを返します0。 目標は、文字列から整数を抽出し、それらを引数として別の関数に渡すことです。これらの値を使用して一部のデータを更新する関数を使用しています(update_stats)。 私はC言語でプログラミングするのはかなり初めてですが、これは私の試みでした。 void get_number (char str[]) { char *end; int num; num = strtol(str, &end, 10); update_stats(num); num = strtol(end, &end, 10); update_stats(num); } これの目的は文字列内にあります"e5 d8"(たとえば)私はその文字列から5とを抽出8します。 文字列の形式は常に同じです。 これどうやってするの?

2
スパース下三角線形システムの後方解決の最適化
主対角線上にゼロがあるnxn下三角行列Aの圧縮スパース列(csc)表現があり、bを (A + I)' * x = b これは私がこれを計算するために持っているルーチンです: void backsolve(const int*__restrict__ Lp, const int*__restrict__ Li, const double*__restrict__ Lx, const int n, double*__restrict__ x) { for (int i=n-1; i>=0; --i) { for (int j=Lp[i]; j<Lp[i+1]; ++j) { x[i] -= Lx[j] * x[Li[j]]; } } } したがって、bは引数を介して渡さxれ、ソリューションによって上書きされます。Lp、Li、Lxそれぞれスパース行列の標準CSC表現の行、インデックス、及びデータポインタです。この関数はプログラムの一番上のホットスポットで、次の行があります。 x[i] -= Lx[j] * …

4
「戻る」コマンドなしで戻る
gccでコンパイルされたCプログラミング言語、WSLのターミナルbash 配列内で最小の数を見つけるために再帰関数を記述しましたが、これは問題なく機能します。 /*01*/ int minimo(int array[], int n) /*02*/ { /*03*/ static int min = 0; /*04*/ /*05*/ if (n == N) /*06*/ { /*07*/ return array[n-1]; /*08*/ } /*09*/ else /*10*/ { /*11*/ min = minimo(array, n+1); /*12*/ if(array[n]<min){ /*13*/ min = array[n]; /*14*/ } /*15*/ } /*16*/ } …

2
配列の最初の要素の前のポインタ
Cでは、ポインターが同じ配列またはその配列の終わりを過ぎた1つの要素を参照する場合、演算と比較は明確に定義されていると言われています。次に、配列の最初の要素の前の1つはどうですか?私がそれを逆参照しない限り、それは大丈夫ですか? 与えられた int a[10], *p; p = a; (1)書くことは合法--pですか? (2)p-1式を書くことは合法ですか? (3)(2)が問題ない場合、それを主張できp-1 < aますか? これには実際的な懸念があります。reverse()で終わるC文字列を逆にする関数を考え'\0'ます。 #include <stdio.h> void reverse(char *p) { char *b, t; b = p; while (*p != '\0') p++; if (p == b) /* Do I really need */ return; /* these two lines? */ for (p--; b …

2
va_list引数は実際にはva_listではありません
このコードをコンパイルしようとすると #include <stdarg.h> void bar_ptr(int n, va_list *pvl) { // do va_arg stuff here } void bar(int n, va_list vl) { va_list *pvl = &vl; // error here bar_ptr(n, pvl); } void foo(int n, ...) { va_list vl; va_list *pvl = &vl; // fine here va_start(vl, n); bar(n, vl); va_end(vl); …

2
C ++機能の影響を受けている、またはC ++機能から派生しているC機能はどれですか。[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5か月前に閉鎖。 元々Cの一部ではなかったが、C ++で/のために発明され、その利点のために後でCに採用された実際のC標準の機能は何ですか? 顕著な例の1つは、1行コメントです//。これは、最初はC ++から来たもので、後にCによって採用されました。 C ++の開発から明示的または暗黙的にもたらされた実際のC標準のその他の機能を知っていますか? 情報:もちろん、C ++はCから派生していることは知っていますが、派生したC ++の開発から採用された機能について考えていました。

4
構造体および構造体メンバーの配列要素
Cでの構造体宣言について質問したい。たとえば、 struct Person { char name[50]; int citNo; float salary; } prsn[20]; 何をし[20]ますか?どういう意味ですか?名前を20(50から)に制限しますか、それともprsnfrom prsn[1]を制限しprsn[20]ますか? そして、私がこのようなコードを書いた場合: struct Person { char name[50]; int citNo; float salary; }; struct Person prsn[20]; 同じことをしますか?
8 c  struct 

1
PyObjectにイテレータがあるかどうかをテストする方法
Pythonの拡張機能としてC関数を実装しています。の中ではabstract.h、私は次を見つけました: /* ==== Iterators ================================================ */ /* Takes an object and returns an iterator for it. This is typically a new iterator but if the argument is an iterator, this returns itself. */ PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *); /* Returns 1 if the object 'obj' provides iterator protocols, and 0 otherwise. …
8 python  c 

1
GCCアトミックビルトインに追加の「汎用」バージョンが必要なのはなぜですか?
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.htmlによると、 type __atomic_load_n (type *ptr, int memorder) (「ジェネリック」): void __atomic_load (type *ptr, type *ret, int memorder) その後 void __atomic_store_n (type *ptr, type val, int memorder) と(「ジェネリック」) void __atomic_store (type *ptr, type *val, int memorder) 等 後者のバージョンの総称は何ですか(それは前のバージョンの総称ではありません)、なぜそれらが必要なのですか?

2
`fcntl64`の代わりに古いlibc` fcntl`へのリンクを強制する方法は?
そうです(2018年8月発売)GLIBC 2.28は fcntlのにかなり積極的な変更を行いました。定義が変更され<fcntl.h>、外部関数ではなくなりました。なく、#definefcntl64。 その結果、このglibcを使用するシステムでコードをコンパイルした場合、つまりfcntl()を使用した場合、結果のバイナリは2018年8月より前のシステムでは実行されません。これは、さまざまなアプリケーションに影響します。 .fcntl()のマニュアルページは、サブ関数の小さなユニバースのエントリポイントであることを示しています。 https://linux.die.net/man/2/fcntl 必要なGLIBC関数の特定のバージョンをリンカーに伝えることができれば、すばらしいでしょう。しかし、私が見つけた最も近いものは、別の投稿への回答で説明されているこのトリックでした: 「.soファイル内の古いシンボルバージョンに対するリンク」への回答 これはもう少し複雑です。 va_listを取るa fcntlなしの可変vffcntl個です。このような状況では、可変個関数の呼び出しを転送できません。:-( 意図的に低い依存関係を持つ安定したコードがある場合、それを現在のUbuntuでビルドするのは失望です...そして、実行可能ファイルを1年前にリリースされた別のUbuntuで実行することを拒否します(ほぼその日まで)。これにはどのような手段がありますか?

3
struct tmはタイムゾーン情報をデータメンバーとして保存しますか
次のC ++コードを検討してください。 #include <ctime> #include <iostream> int main() { std::time_t now = std::time(nullptr); struct tm local = *std::localtime(&now); struct tm gm = *std::gmtime(&now); char str[20]; std::strftime(str, 20, "%Z", &local); std::cout << str << std::endl; // HKT std::strftime(str, 20, "%Z", &gm); std::cout << str << std::endl; // UTC return 0; } …
8 c++  c  ctime  time.h 

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