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

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

2
安全な暗号化キーのstd :: arrayにカスタムアロケーターを使用できますか?
私std::arrayは完全にスタックに割り当てられていることを知っていますが、この質問は2つのことを必要とするセキュリティの懸念によって動機付けられています: のデータはstd::array破棄時にゼロ化またはランダム化されます のデータはロックstd::arrayされるため、クラッシュやスワップメモリ​​のいずれでもディスクに移動することはありません 通常、でstd::vectorの解決策は、これらのことを行うカスタムアロケータを作成することです。ただし、の場合std::array、これを行う方法がわからないため、この質問についてもわかりません。 私ができる最善のことはこれです: template <typename T, std::size_t Size> struct SecureArray : public std::array<T, Size> { static_assert(std::is_pod<T>::value, "Only POD types allowed") static_assert(sizeof(T) == 1, "Only 1-byte types allowed") virtual ~SecureArray() { std::vector<uint8_t> d = RandomBytes(Size); // generates Size random bytes std::memcpy(this->data(), d.data(), Size); } } ただし、これには明らかにメモリロックが欠けstd::arrayてstd::arrayおり、そもそも使用することで得られるパフォーマンススキームが複雑になります。 より良い解決策はありますか?

4
自然言語からC ++式へ
割り当て: 以下の自然言語式をC ++式に変換します。すべての変数が負でない数値またはブール値(値trueまたはfalse)であると仮定します。 自然言語: aとbの両方が偽であるか、cが真であるが、両方ではない。 私の解決策: (a==0 && b==0)xor(c==1) 教授のソリューション: (!a && !b) != c 質問: 「not-a」と「not-b」と言って、最初の括弧を少し理解したと思います。abが最初はゼロ以外であると仮定すると、aとbは間違っていると思います。正しい? しかし、「cに等しくない」と言っている部分はどうでしょうか。 教授の解決策が理解できません。誰かが私のために解決できますか? お手伝いありがとう!
9 c++  logic 

1
「前に強く起こる」とはどういう意味ですか?
C ++ドラフト標準では、「前に強く起こる」というフレーズが何度か使用されています。 例:終了 [basic.start.term] / 5 std :: atexitへの呼び出し([support.start.term]を参照)の前に、静的ストレージ期間を持つオブジェクトの初期化が強く発生した場合、std :: atexitに渡された関数の呼び出しオブジェクトのデストラクタを呼び出す前にシーケンス化されます。std :: atexitの呼び出しが静的ストレージ期間のオブジェクトの初期化が完了する前に強く発生する場合、オブジェクトのデストラクタの呼び出しは、std :: atexitに渡される関数の呼び出しの前にシーケンスされます。std :: atexitへの呼び出しがstd :: atexitへの別の呼び出しの前に強く発生する場合、2番目のstd :: atexit呼び出しに渡される関数の呼び出しは、関数に渡される前にシーケンスされます最初のstd :: atexit呼び出し。 データレース [intro.races] / 12で定義 評価Aは、評価Dの前に強く発生します。 (12.1)AがDの前にシーケンスされる、または (12.2)AがDと同期し、AとDの両方が順次一貫したアトミック操作([atomics.order])である、または (12.3)評価BとCがあり、AはBの前にシーケンスされ、Bは単にCの前に発生し、CはDの前にシーケンスされる、または (12.4)AがBの前に強く発生し、BがDの前に強く発生するという評価Bがあります。 [注:非公式に、AがBの前に強く発生する場合、AはすべてのコンテキストでBの前に評価されるように見えます。excludeが操作を消費する前に強く発生します。—エンドノート] なぜ「以前に強く起こる」ことが導入されたのですか?直感的に、その違いと「以前の出来事」との関係は何ですか? ノートの「AはすべてのコンテキストでBより先に評価されるように見える」とはどういう意味ですか? (注:この質問の動機は、この回答の下でのPeter Cordesのコメントです。) 追加の標準草案(Peter Cordesに感謝) 順序と一貫性 [atomics.order] / 4 すべてのmemory_order :: seq_cst操作(フェンスを含む)には、次の制約を満たす単一の合計順序Sがあります。まず、AとBがmemory_order :: seq_cst操作で、AがBの前に強く発生する場合、AはSでBの前に発生します。 Bの前に、Sが満たすには、次の4つの条件が必要です。 (4.1)AとBが両方ともmemory_order …

1
他のスレッドでそのconcurrent_vectorを反復しながら、concurrency :: concurrent_vector :: push_backを呼び出すことは、同時実行安全ですか?
push_back、begin、endはhttps://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/concurrent-vector-class?view=vs-2019#push_backでコンカレントセーフとして説明されてい ます ただし、以下のコードはアサートしています。要素が追加されたが、まだ初期化されていないためと考えられます。 struct MyData { explicit MyData() { memset(arr, 0xA5, sizeof arr); } std::uint8_t arr[1024]; }; struct MyVec { concurrency::concurrent_vector<MyData> v; }; auto vector_pushback(MyVec &vec) -> void { vec.v.push_back(MyData{}); } auto vector_loop(MyVec &vec) -> void { MyData myData; for (auto it = vec.v.begin(); it != vec.v.end(); ++it) { auto …

3
foo(void)とfoo(void *)
機能的および構文的に言えば、プロトタイプの関数とには違いがint foo(void)ありint foo(void *)ますか? 私は、例えば、違いを知って、int bar(int)そしてint bar(int *)-そのうちの一つがintを探している、と他のはint型のポインタを探しています。void同じように動作?


1
別のスレッドからフラッターエンジンメソッドを呼び出す方法
Linuxのフラッターデスクトップを使用しています。MarkTextureFrameAvailableエンジンによって再レンダリングされるテクスチャをマークすることになっていると呼ばれるメソッドを呼び出しています。私はビデオプレーヤーをプログラミングしているのでMarkTextureFrameAvailable、プレーヤーのスレッドから呼び出す必要があります。問題は、エンジンがエンジンMarkTextureFrameAvailableを作成したスレッドから(およびその他のエンジンメソッドを)呼び出すように強制することです。 エンジンへのすべての呼び出しは、呼び出しが作成されたのと同じスレッドから行われているかどうかを常に確認するシェルで終了することがわかります。 task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread() (https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838) これは、フラッターエンジンを作成する方法です。 int main(int argc, char **argv) { //.. flutter::FlutterWindowController flutter_controller(icu_data_path); // Start the engine. if (!flutter_controller.CreateWindow(800, 600, "Flutter WebRTC Demo", assets_path, arguments)) { return EXIT_FAILURE; } // Register any native plugins. FlutterWebRTCPluginRegisterWithRegistrar( flutter_controller.GetRegistrarForPlugin("FlutterWebRTCPlugin")); // Run until the window is closed. flutter_controller.RunEventLoop(); return EXIT_SUCCESS; } ご覧のとおり、エンジンを作成するスレッドはブロックされます。flutter_controller.RunEventLoop();これは、メインのスレッドから強制的に実行されるイベントディスパッチャーを配置できる唯一の場所です。私はこの考えが好きではありません。RunEventLoopWithTimeout存在していても、タイムアウトを設定し、MarkTextureFrameAvailable呼び出しのキューにチェックインし続ける必要があります。これは最適ではないと思います。 ではMarkTextureFrameAvailable、メインスレッドからどのように呼び出す必要がありますか? …

1
このC ++ AtomicInt実装は正しいですか?
前提:私はARM組み込み(ほとんどベアメタル)環境で作業していますが、C ++ 11(も)さえ使用できないので、「標準のC ++のみを使用するstd::atomic<int>」などの回答は避けてください:できません。std::atomic<int> このAtomicIntのARM 実装は正しいですか?(ARMアーキテクチャがARMv7-Aであると想定) 同期の問題が発生していますか?それはvolatile必要/便利? // File: atomic_int.h #ifndef ATOMIC_INT_H_ #define ATOMIC_INT_H_ #include <stdint.h> class AtomicInt { public: AtomicInt(int32_t init = 0) : atom(init) { } ~AtomicInt() {} int32_t add(int32_t value); // Implement 'add' method in platform-specific file int32_t sub(int32_t value) { return add(-value); } int32_t inc(void) { …

3
list :: empty()マルチスレッドの動作?
さまざまなスレッドが要素を取得するためのリストがあります。リストが空のときに保護しているmutexをロックしないようにするために、ロックするempty()前にチェックします。 呼び出しがlist::empty()100%正しくない場合でも問題ありません。同時list::push()およびlist::pop()コールのクラッシュまたは中断を回避したいだけです。 私はVC ++とGnu GCCが時々empty()間違って、何も悪いことはないと思い込んでも大丈夫ですか? if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes mutex.lock(); if(list.empty() == false){ // check again while locked to be certain element = list.back(); list.pop_back(); } mutex.unlock(); }

3
C ++ 14でのInitキャプチャによるC ++ Lambdaコードの生成
特にC ++ 14で追加された一般化されたinitキャプチャで、キャプチャがラムダに渡されるときに生成されるコードコードを理解/明確化しようとしています。 以下にリストする以下のコードサンプルを提供してください。これは、コンパイラーが生成するものについての私の現在の理解です。 ケース1:値によるキャプチャ/デフォルトによる値によるキャプチャ int x = 6; auto lambda = [x]() { std::cout << x << std::endl; }; 次と等しい: class __some_compiler_generated_name { public: __some_compiler_generated_name(int x) : __x{x}{} void operator()() const { std::cout << __x << std::endl;} private: int __x; }; そのため、複数のコピーがあります。1つはコンストラクターパラメーターにコピーし、もう1つはメンバーにコピーします。これは、ベクターなどの型にはコストがかかります。 ケース2:参照によるキャプチャ/デフォルトの参照によるキャプチャ int x = 6; auto lambda …
9 c++  lambda  c++14  move 

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
ユーザー提供のstd :: allocator特殊化
::std名前空間内のクラステンプレートは、通常、ユーザー定義型のプログラムに特化できます。私はこのルールに例外を見つけませんでしたstd::allocator。 それで、std::allocator私は自分のタイプに特化することを許可されていますか?また、許可されている場合、std::allocatorの主なテンプレートのすべてのメンバーを提供する必要がありstd::allocator_traitsますか? このプログラムを検討してください #include<vector> #include<utility> #include<type_traits> #include<iostream> #include<limits> #include<stdexcept> struct A { }; namespace std { template<> struct allocator<A> { using value_type = A; using size_type = std::size_t; using difference_type = std::ptrdiff_t; using propagate_on_container_move_assignment = std::true_type; allocator() = default; template<class U> allocator(const allocator<U>&) noexcept {} value_type* allocate(std::size_t n) { if(std::numeric_limits<std::size_t>::max()/sizeof(value_type) …
8 c++  c++17  allocator 

2
std :: dequeは実際には最初に一定時間の挿入を持っていますか?
標準は言う: 両端キューは、ランダムアクセス反復子(27.2.7)をサポートするシーケンスコンテナーです。さらに、最初または最後の一定時間の挿入および消去操作をサポートします。途中で挿入と消去には線形時間がかかります。 ただし、同じ条項にも次のように記載されています。 この条項のすべての複雑さの要件は、含まれているオブジェクトに対する操作の数に関してのみ記述されています。[例:vector<vector<int>>含まれるそれぞれのコピーの複雑さvector<int>自体は線形であるにもかかわらず、タイプのコピーコンストラクターは線形の複雑さを持っています。—最後の例] これは、たとえば両端キューに既に存在するsと挿入される新しいオブジェクトに対して一定数以上の操作を実行しない限り、最初の挿入にdeque<int>線形時間がかかることを意味するのではありませんか?intint たとえば、「サイズKのベクターのベクター」を使用して両端キューを実装するとします。最初にK回挿入するたびに、新しいサイズKのベクトルを最初に追加する必要があるため、他のすべてのサイズKのベクトルを移動する必要があります。これは、最初の挿入の時間の複雑さが償却されたO(N / K)であることを意味します。ここで、Nは要素の総数ですが、Kは定数なので、これは単なるO(N)です。しかし、これは規格で許可されているようです。サイズKのベクトルを移動してもその要素は移動せず、「複雑さの要件」は含まれているintオブジェクトの「操作の数に関してのみ述べられている」ためです。 規格はこれを本当に許可していますか?それとも、より厳しい要件、つまり、含まれているオブジェクトに対する一定数の操作に加えて一定の追加時間があると解釈する必要がありますか?

1
ポインターを使用して読み取り専用フィールドを変更できますか?しかし、なぜ?
私はC ++の出身で、C ++とC#のポインター間で非常に異なる動作を見つけます。 意外にも、このコードはコンパイルできます...そしてさらに...完全に動作します。 class C { private readonly int x = 0; unsafe public void Edit() { fixed (int* p = &x) { *p = x + 1; } Console.WriteLine($"Value: {x}"); } } これは私を非常に困惑させます、C ++でもconstオブジェクトを保護するメカニズムがあります(constC ++ではreadonlyC#ではなくC#とほぼ同じですconst)、ポインターを介してconst値を任意に変更する十分な理由がないためです。 さらに調べてみると、C#にはC ++の低レベルのconstポインターに相当するものはなく、次のようになります。 readonly int* p C#の場合。 その場合、pはポイントされたオブジェクトのみを読み取ることができ、それに書き込むことはできません。 また、constオブジェクトの場合、C#はアドレスを取得する試みを禁止しました。 C ++では、これを変更しようとするconstと、コンパイルエラーまたは未定義の動作になります。C#では、これを利用できる可能性があるかどうかわかりません。 だから私の質問は: この動作は本当に明確ですか?C#では知っていますが、C ++にはUBのような概念はありません …

1
C ++でのif / elseブランチのコンパイル時の削除
次のコードサンプルでは、ifステートメントはboolコンパイル時定数であるテンプレートパラメーターに依存しています。コンパイラはこのコードを別の方法で処理します。 MSVCはリンクエラーで失敗します(これは私が予想したことです)。elseブランチのテンプレート関数にはtrueテンプレートパラメーター値の特殊化がないため(呼び出されることはありません)。 GCCとClangはどちらも問題なくコンパイルされ、実行時の動作は正しいです。これはif、コンパイル時にステートメントを評価し、リンクする前に未使用のブランチを削除するためです。 問題は、どの動作が標準に準拠しているか(または、未定義の動作であり、どちらも独自の方法で正しいか)です。 #include <iostream> template<const bool condition> struct Struct { void print() { if (condition) { std::cout << "True\n"; } else { printIfFalse(); } } private: void printIfFalse(); }; template <> void Struct<false>::printIfFalse() { std::cout << "False\n"; } int main() { Struct<true> withTrue{}; withTrue.print(); Struct<false> withFalse{}; withFalse.print(); return …

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