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

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

6
C ++でジェネリック構造体を比較する方法は?
構造体を一般的な方法で比較したいのですが、次のようなことをしました(実際のソースを共有できないため、必要に応じて詳細を尋ねます)。 template<typename Data> bool structCmp(Data data1, Data data2) { void* dataStart1 = (std::uint8_t*)&data1; void* dataStart2 = (std::uint8_t*)&data2; return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0; } 2つの構造体インスタンスに同じメンバーが含まれている場合(ただし、Eclipseデバッガーで確認しました)でもfalseを返す場合があることを除いて、これはほとんど意図どおりに機能します。いくつか検索した後memcmp、使用された構造体が埋め込まれているために失敗する可能性があることを発見しました。 パディングに無関心なメモリを比較するより適切な方法はありますか?使用する構造体を変更することはできません(使用しているAPIの一部です)。使用する多くの異なる構造体にはいくつかの異なるメンバーがあるため、一般的な方法で個別に比較することはできません(私の知る限り)。 編集:残念ながら、C ++ 11を使用しています。これは以前に言及したはずです...

2
どのようにconst exprを非常に速く評価できますか
コンパイル時に評価されるconst式を試してみました。しかし、コンパイル時に実行すると信じられないほど高速に見える例を試してみました。 #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); } int main () { long int res = fib(45); std::cout << res; return 0; } このコードを実行すると、実行に約7秒かかります。ここまでは順調ですね。しかし、私long int res = fib(45)がconst long int res = fib(45)それに変更するとき、それは1秒もかかりません。私の理解では、コンパイル時に評価されます。 しかし、コンパイルには約0.3秒かかります コンパイラーはこれをどのように迅速に評価できますか?しかし、実行時はそれよりはるかに時間がかかりますか?私はgcc 5.4.0を使用しています。
13 c++  const  constexpr 

4
C ++ 11でStoreLoadバリアを実現する方法は?
古典的な問題の変形を解決する移植可能なコード(Intel、ARM、PowerPC ...)を記述したいと思います。 Initially: X=Y=0 Thread A: X=1 if(!Y){ do something } Thread B: Y=1 if(!X){ do something } ここでの目標は、両方のスレッドがやっているような状況を避けるためですsomething。(どちらも実行しなくても問題ありません。これは1回だけ実行するメカニズムではありません。)以下の私の推論に欠陥がある場合は、修正してください。 私は次のようにmemory_order_seq_cstアトミックstoresおよびloads を使用して目標を達成できることを認識しています。 std::atomic<int> x{0},y{0}; void thread_a(){ x.store(1); if(!y.load()) foo(); } void thread_b(){ y.store(1); if(!x.load()) bar(); } {x.store(1), y.store(1), y.load(), x.load()}イベントにはいくつかの単一の合計順序が必要であり、プログラムの順序「エッジ」に同意する必要があるため、これは目標を達成します。 x.store(1) 「TOは前に」 y.load() y.store(1) 「TOは前に」 x.load() foo()呼び出された場合、追加のエッジがあります: y.load() 「前に値を読み取る」 y.store(1) bar()呼び出された場合、追加のエッジがあります: …

3
200000以上の要素を含む2つの配列要素の最小積を見つける最速の方法
アレイがありa[n]ます。番号nは当社が入力します。私は、最小限の製品を見つける必要があるa[i]とa[j]場合を: 1) abs(i - j) > k 2)a[i] * a[j]最小化されている これが私の解決策です(非常に素朴です): #include <iostream> using namespace std; #define ll long long int main() { ll n,k; cin >> n >> k; ll a[n]; for(ll i=0;i<n;i++) cin >> a[i]; ll mn; bool first = true; for(ll i=0;i<n;i++) { for(ll j=0;j<n;j++) { if(i!=j) …

4
cppreferenceでの緩和された順序付けの説明に誤りはありますか?
cppreference.comのドキュメントstd::memory_orderには、緩和された順序付けの例があります。 ゆるやかな注文 タグ付けさmemory_order_relaxedれたアトミック操作は同期操作ではありません。同時メモリアクセスに順序を課すことはありません。原子性と変更順序の一貫性のみが保証されます。 たとえば、xとyが最初はゼロの場合、 // Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D は、r1 == r2 == 42を生成することを許可されています。なぜなら、Aはスレッド1内でBの前にシーケンスされ、Cはスレッド2内でDの前にシーケンスされるからです。 xの変更順序でCの前に表示されます。yに対するDの副作用はスレッド1の負荷Aに見え、xに対するBの副作用はスレッド2の負荷Cに見える可能性があります。特に、これはDがCの前に完了する場合に発生する可能性があります。スレッド2、コンパイラの並べ替えまたは実行時のいずれかが原因。 「Cはスレッド2内でDの前にシーケンスされます」と書かれています。 評価順にあるsequenced-beforeの定義によれば、AがBの前にシーケンス化されている場合、Aの評価はBの評価が始まる前に完了します。Cはスレッド2内でDの前に順序付けられているため、Dが始まる前にCを完了する必要があるため、スナップショットの最後の文の条件部分は決して満たされません。

2
ラムダでstatic_assertを指定したconstexprの場合、どのコンパイラが正しいですか?
static_assertでa if constexprを使用する場合は、条件をいくつかのテンプレートパラメータに依存させる必要があります。興味深いことに、コードがラムダでラップされている場合、gccとclangは一致しません。 次のコードはgccでコンパイルされますが、clang if constexprがtrueでなくても、clangはアサートをトリガーします。 #include <utility> template<typename T> constexpr std::false_type False; template<typename T> void foo() { auto f = [](auto x) { constexpr int val = decltype(x)::value; if constexpr(val < 0) { static_assert(False<T>, "AAA"); } }; f(std::integral_constant<int, 1>{}); } int main() { foo<int>(); } ここでライブ例。 それは簡単に置き換えることによって固定することが可能False<T>でFalse<decltype(x)>。 だから問題は:どのコンパイラーが正しいのか?の状態static_assertはに依存しているので、gccは正しいと思いますTが、よくわかりません。

1
MSVCのコンパイラのバグの可能性
次のコードは、gccとclang(および他の多くのC ++ 11コンパイラ)でコンパイルされます。 #include <stdint.h> typedef int datatype; template <typename T> struct to_datatype {}; template <> struct to_datatype<int16_t> { static constexpr datatype value = 1; }; template <typename T> class data { public: data(datatype dt = to_datatype<T>::value) {} }; int main() { data<char> d{to_datatype<int16_t>::value}; } (ほぼ)最新のMSVCでコンパイルする場合 > cl .\test.cpp /std:c++latest …
13 c++  c++11  visual-c++ 

1
コンテナに32を超える要素がある場合にのみ、なぜstd :: sortによってswapが呼び出されるのですか?
こんにちは私は簡単な質問があります: class A { public: A(int); A(const A&); A& operator=(const A&); ~A(); private: int* ptr_; friend bool operator<(const A&, const A&); friend void swap(A&, A&); }; A::A(int x) : ptr_(new int(x)) {} A::A(const A& rhs) : ptr_(rhs.ptr_ ? new int(*rhs.ptr_) : nullptr) {} A& A::operator = (const A & rhs) …
13 c++  std  swap 

2
含めるヘッダーファイルを決定する方法
以下の(非常に単純な)コードがあるとします。 #include <iostream> int main() { std::cout << std::stoi("12"); } これは、g ++とclangの両方で正常にコンパイルされます。ただし、次のエラーによりMSVCでコンパイルできません。 エラーC2039: 'stoi':は 'std'のメンバーではありません エラーC3861: 'stoi':識別子が見つかりません 私はそれstd::stoiが<string>ヘッダーの一部であることを知っています。おそらく前者の2つのコンパイラーはその一部としてインクルードし<iostream>、後者はインクルードしません。C ++標準[res.on.headers]に準拠 C ++ヘッダーには、他のC ++ヘッダーが含まれている場合があります。 私にとって、これは基本的に3つのコンパイラすべてが正しいと言います。 この問題は、TAがコンパイルしていないとマークした私の生徒の1人が提出したときに発生しました。もちろん行って修正しました。しかし、私はこのような今後の事件を防ぎたいと思います。では、3つの異なるコンパイラーでコンパイルして毎回チェックするのではなく、どのヘッダーファイルをインクルードするかを決定する方法はありますか? 私が考えることができる唯一の方法は、すべてのstd関数呼び出しに対して適切なインクルードが存在することを確認することです。しかし、何千行もある既存のコードがある場合、これを検索するのは面倒な場合があります。クロスコンパイラの互換性を確保するためのより簡単な/より良い方法はありますか? 3つのコンパイラの例:https : //godbolt.org/z/kJhS6U
13 c++ 

1
バージョン間でC ++の式の型が変更されたのはなぜですか?
私はC ++の式のタイプを理解しようとしますが、C ++ドラフトを消化するのは非常に難しく、したがって他のリソースを好むので、読むほど混乱します。 C ++バージョン間の表現と定義が大幅に変更されています。 以下では、以下のドラフトを参照します。 C ++ 11 [ n3690 ](最終ドラフト) C ++ 17 [ n4659 ](最終ドラフト) C ++ 20 [ n4835 ](現在のドラフト) C++11 3.10左辺値と右辺値 ... prvalue(「純粋な」右辺値)は、x値ではない右辺値です。[例:戻り値の型が参照ではない関数を呼び出した結果は、prvalueです。12、7.3e5、trueなどのリテラルの値もprvalueです。—最後の例] C++17 3.10左辺値と右辺値 ... prvalueは、評価によってオブジェクトまたはビットフィールドを初期化するか、演算子のオペランドの値を、それが出現するコンテキストで指定されたとおりに計算する式です。 C++20 7.2.1値のカテゴリ* ... prvalueは、その評価がオブジェクトまたはビットフィールドを初期化する式、または演算子のオペランドの値を、それが出現するコンテキストまたはcv void型の式で指定されているように計算する式です。 言い回しの変更を理解し、いくつかの調整が行われますが、私にとっては定義全体が変更されます。誰かがこれを理解するのを手伝ってくれる?たとえば、prvalueがxvalueではないrvalueであるという文が削除されたのはなぜですか?または、なぜ役立つ例が削除されたのですか?
13 c++  c++11  c++14  c++17  c++20 

1
gccのあいまいな演算子
stlコンテナーの一部を印刷するための関数テンプレートを作成しました #include <iostream> #include <vector> #include <string> template <template <typename, typename> class C, typename T, typename A> std::ostream& operator<<(std::ostream& os, const C<T, A>& container) { for (auto& elem : container) { os << elem << " "; } return os; } int main() { std::vector<std::string> v { "One", "Two", "Three" …
13 c++  c++17 

2
Derived1 :: BaseとDerived2 :: Baseは同じ型を参照していますか?
MSVC、Clang、およびGCCはこのコードに同意しません。 struct Base { int x; }; struct Der1 : public Base {}; struct Der2 : public Base {}; struct AllDer : public Der1, public Der2 { void foo() { Der1::Base::x = 5; } }; ゴッドボルト GCC: <source>: In member function 'void AllDer::foo()': <source>:10:21: error: 'Base' is an ambiguous base …

1
異なるブロックの同じ名前のexternローカル変数が、c ++のコンパイラー間で異なるリンケージを取得するのはなぜですか?
externローカル変数 にどのリンケージが許可されているかを確認しているだけですが、コンパイラ間でいくつかの異なる動作があることがわかりました たとえば 、コメント変数で見られるように、以下のコードをテストした場合、変数varのリンケージは異なります // foo.cpp int var = 10; // external linkage // main.cpp #include <iostream> static int var = 100; // internal linkage int main() { extern int var; // internal linkage std::cout << var << std::endl; { extern int var; // g++: external linkage , clang++: internal …
12 c++  g++  clang++  extern  linkage 

1
`equality_comparable_with`は` common_reference`を必要とする必要がありますか?
コンセプトは、equality_­comparable_with<T, U>タイプのオブジェクトを宣言することを目的とTし、U互いに等しく比較することができ、それらがある場合、これは予想される意味を持ちます。それはいいです。 ただし、この概念もcommon_reference_t<T&, U&>存在する必要があります。主な推進力common_referenceとそれに付随する機能は、プロキシイテレータを有効にし、そのようなイテレータ間のreferenceとの関係を表す場所を設けることvalue_typeです。 それは素晴らしいことですが... a Tとa Uが互いに等しいかどうかをテストできるかどうかをテストすることとは何ですか?なぜ標準はそれTを必要とし、Uそれらを等しく比較できるようにするために共通の参照関係を持っているのですか? これは、論理的に比較可能な共通参照関係を合理的に持たない2つのタイプを持つことが非常に困難な、奇妙な状況を作り出します。例えば、vector<int>およびpmr::vector<int>論理的には同等であるべきです。しかし、そうでなければ関係のない2つのタイプの間に妥当な共通参照がないため、そうなることはありません。

1
プリミティブstatic_vector実装での未定義の動作の可能性
tl; dr:static_vectorの動作が未定義だと思いますが、見つかりません。 この問題はMicrosoft Visual C ++ 17にあります。この単純で未完成のstatic_vectorの実装、つまりスタック割り当て可能な固定容量のベクターがあります。これは、std :: aligned_storageとstd :: launderを使用するC ++ 17プログラムです。私はそれを問題に関連すると思われる部分にまで煮詰めようとしました: template <typename T, size_t NCapacity> class static_vector { public: typedef typename std::remove_cv<T>::type value_type; typedef size_t size_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; static_vector() noexcept : count() { } ~static_vector() …

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