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

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

3
C ++でのstd :: resize(n)とstd :: shrink_to_fitの違いは?
私はこれらの声明に出くわしました: resize(n)–「n」要素が含まれるようにコンテナのサイズを変更します。 shrink_to_fit()–サイズに合わせてコンテナの容量を減らし、容量を超えるすべての要素を破棄します。 これらの機能に大きな違いはありますか?彼らはc ++のベクトルの下に来る

1
`string.assign(string.data()、5)`は明確に定義されていますか、それともUBですか?
同僚はこれを書きたかった: std::string_view strip_whitespace(std::string_view sv); std::string line = "hello "; line = strip_whitespace(line); 戻るstring_viewと私はアプリオリに不安になり、さらにここでのエイリアシングはUBのように見えました。 line = strip_whitespace(line)この場合、と同等であると確信できますline = std::string_view(line.data(), 5)。私はそれが呼び出すと信じてstring::operator=(const T&) [with T=string_view]と同等になるように定義されている、line.assign(const T&) [with T=string_view]と等価になるように定義され、line.assign(line.data(), 5)これを実行するために定義されています: Preconditions: [s, s + n) is a valid range. Effects: Replaces the string controlled by *this with a copy of the range [s, s …

1
std :: vectorがアライメントされたメモリを割り当てるための最新のアプローチ
次の質問には答えが古いしかし、関連、およびユーザーからのコメントされたマルク・Glisseは十分に議論されていない可能性があり、この問題に対する17 ++ C以来の新たなアプローチがあることを示唆しています。 すべてのデータにアクセスしながら、SIMDでアライメントされたメモリを適切に動作させようとしています。 Intelでは、タイプのfloatベクトルを作成し__m256、サイズを8分の1に削減すると、メモリが整列されます。 例えば std::vector<__m256> mvec_a((N*M)/8); 少しハックな方法で、ベクトル要素へのポインタを浮動小数点にキャストできます。これにより、個々の浮動小数点値にアクセスできます。 代わりに、私std::vector<float>はを正しく調整して、__m256segfaultingなしで他のSIMDタイプにロードできるようにしたいと思います。 私はaligned_allocを調べてきました。 これにより、正しく整列されたCスタイルの配列が得られます。 auto align_sz = static_cast<std::size_t> (32); float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float)); ただし、これをどのように行うかわかりませんstd::vector<float>。のstd::vector<float>所有権を与えるmarr_a ことは可能ではないようです。 カスタムアロケーターを作成する必要があるという提案をいくつか見ましたが、これは多くの作業のように思われ、おそらく最新のC ++にはもっと良い方法がありますか?

1
山かっこのGCCの実装には次のものが含まれます。なぜそれは以下に説明されているとおりでなければならないのですか?
このドキュメントのセクション2.6計算済みインクルードには、次の段落があります。 行が<トークンで始まり、>トークンを含むトークンストリームに展開される場合、<と最初の>の間のトークンが結合されて、含まれるファイル名が形成されます。トークン間の空白は1つのスペースに削減されます。その後、最初の<の後のスペースは保持されますが、閉じる>の前のスペースは無視されます。CPPは山かっこインクルードのルールに従ってファイルを検索します。 これは実装で定義されていることはわかっていますが、なぜGCCにとってこのようにする必要があるのですか?上記の強調表示された文を具体的に参照しています。 編集 上で引用したものの前の3番目の段落が次のことを言っていることに気づきました。 マクロを定義するときは注意が必要です。#defineテキストではなくトークンを保存します。プリプロセッサは、マクロがの引数として使用されることを知る方法がない#includeため、ヘッダー名ではなく通常のトークンを生成します。文字列定数に十分近い二重引用符を含むインクルードを使用する場合、これが問題を引き起こすことはほとんどありません。 ただし、山括弧を使用すると、問題が発生する可能性があります。 ここでどんな問題が指摘されているか知っていますか?
11 c++  c  gcc  language-lawyer 

3
関数から一意のvoidポインターを返す
void *CIの関数からを取得するには、次のようにします(非常に基本的な例)。 void *get_ptr(size_t size) { void *ptr = malloc(size); return ptr; } 使用時に同じ結果を得るにはどうすればよいstd::unique_ptr<>ですか?
11 c++  c  unique-ptr 

1
constexprコンストラクターで配列を初期化することは正当ですか?
次のコードは正当ですか? template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; Clangはそれを受け入れますが、GCCとMSVCはそれを拒否します。 GCCのエラーは次のとおりです。 main.cpp:15:18: error: 'constexpr foo<N>::foo() [with int N = 5]' called in a constant expression 15 …

1
等しい接頭辞と接尾辞を順次削除する効率的な文字列切り捨てアルゴリズム
テストあたりの制限時間:5秒 テストあたりのメモリ制限:512メガバイト s長さの文字列n(n≤5000)が与えられます。この文字列のサフィックスでもある適切なプレフィックスを選択し、選択したプレフィックスまたは対応するサフィックスを削除できます。次に、結果の文字列に同様の操作を適用できます。そのような操作の最適なシーケンスを適用した後に達成できる最終的な文字列の最小の長さはどれくらいですか? 入力 各テストの最初の行にsは、小さな英語の文字で構成される文字列が含まれています。 出力 単一の整数を出力します—そのような操作の最適なシーケンスを適用した後に達成できる最終的な文字列の最小の長さ。 例 +-------+--------+----------------------------------+ | Input | Output | Explanation | +-------+--------+----------------------------------+ | caaca | 2 | caaca → ca|aca → aca → ac|a → ac | +-------+--------+----------------------------------+ | aabaa | 2 | aaba|a → a|aba → ab|a → ab | +-------+--------+----------------------------------+ | abc | …

1
gccのis_nothrow_constructibleの実装でstatic_castが必要なのはなぜですか?
GCC実装から取得した、type_traitsなぜstatic_castここで必要なのですか? template <typename _Tp, typename... _Args> struct __is_nt_constructible_impl : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {}; template <typename _Tp, typename _Arg> struct __is_nt_constructible_impl<_Tp, _Arg> : public integral_constant<bool, // Why is `static_cast` needed here? noexcept(static_cast<_Tp>(declval<_Arg>()))> {};

3
コンパイラが生成した関数を見つける方法は?
コンパイラが生成した関数、3つのルールと5つのルールについて知っています。実際のシナリオでは、コンパイラによって生成された関数(コンストラクタ、代入演算子、デストラクタ)のどれが実際にコンパイラによって作成されたかを正確に把握するのは簡単なことではありません。 特定のクラスのコンパイラー生成関数をリストする方法はありますか? 私は主にVisual Studio 2019とXcodeに興味がありますが、一般的なソリューションがさらに歓迎されます。
11 c++  c++11 

1
修飾されていないsort()— std :: arrayではなくstd :: vectorで使用するとコンパイルされるのはなぜですか、どのコンパイラが正しいのですか?
呼び出すときstd::sort()にstd::array: #include <vector> #include <array> #include <algorithm> int main() { std::vector<int> foo{4, 1, 2, 3}; sort(begin(foo), end(foo)); std::array<int, 4> foo2{4, 1, 2, 3}; sort(begin(foo2), end(foo2)); } gccとclangの両方で、並べ替えのエラーが返されますstd::array-clang エラー:宣言されていない識別子 'sort'の使用; 「std :: sort」という意味ですか? std::sort(begin(foo2), end(foo2))問題を修正するための変更。 MSVCは、上記のコードを記述どおりにコンパイルします。 なぜ治療の違いの間std::vectorとstd::array、どのコンパイラが正しいですか?
11 c++  c++17 

2
C ++の偽のコピー操作を見つける方法は?
最近、私は次のことをしました struct data { std::vector<int> V; }; data get_vector(int n) { std::vector<int> V(n,0); return {V}; } このコードの問題は、構造体が作成されるときにコピーが発生し、解決策は代わりにreturn {std :: move(V)}を書き込むことです。 このような偽のコピー操作を検出するリンターまたはコードアナライザーはありますか?cppcheck、cpplint、clang-tidyのいずれも実行できません。 編集:私の質問を明確にするためのいくつかのポイント: コンパイラエクスプローラを使用したためにコピー操作が発生し、memcpyへの呼び出しが表示されることがわかっています。 コピー操作が発生したことは、標準のyesを確認することで確認できました。しかし、私の最初の間違った考えは、コンパイラーがこのコピーを最適化するというものでした。私は間違っていた。 clangとgccの両方がmemcpyを生成するコードを生成するため、これは(おそらく)コンパイラーの問題ではありません。 memcpyは安いかもしれませんが、メモリをコピーしてオリジナルを削除する方がstd :: moveでポインタを渡すよりも安い状況は想像できません。 std :: moveの追加は基本的な操作です。コードアナライザーがこの修正を提案できると思います。

2
Tは `std :: declval <T>`で使用される完全な型である必要がありますか?
この例を見てみましょう(ここから来ます): #include &lt;type_traits&gt; #include &lt;iostream&gt; template &lt;typename U&gt; struct A { }; struct B { template &lt;typename F = int&gt; A&lt;F&gt; f() { return A&lt;F&gt;{}; } using default_return_type = decltype(std::declval&lt;B&gt;().f()); }; int main() { B::default_return_type x{}; std::cout &lt;&lt; std::is_same&lt; B::default_return_type, A&lt;int&gt;&gt;::value; } それはgcc9.2でエラーなしでコンパイルしますが、gcc7.2とclang 10.0.0 Bは完了していないことについて不平を言います。Clangsエラーは: prog.cc:11:58: error: member access into …

1
C ++ 17での初期化後にインライン変数を変更できますか?
私のシナリオは以下です(それはclangでは機能しましたがgccでは機能しませんでした) liba.hpp: inline int MY_GLOBAL = 0; libother.cpp:(dll) #include "myliba.hpp" void myFunc() { // MYGLOBAL = 28; } someexe.cpp: RunAppThatUsesBothLibAandLibOther(); 問題は、インライン変数が実行時にすでに変更されていたため、28を期待した場所でインライン変数が0を示していたことです。MSVCはこれに同意しませんが、clangは私が期待することを行います。 問題は、私のシナリオでは、実行時にインライン変数を変更できるかどうかです。(変数をインライン展開することで問題を解決しました。)
11 c++  visual-c++  dll  clang  c++17 

5
ループ内のローカルオブジェクトのデストラクタは、次の反復の前に呼び出されることが保証されていますか?
ループがあり、このループ内で新しいスタック変数を作成すると(ヒープ上に割り当てず、ループ本体内で宣言された変数を保持する変数ではありません)、このオブジェクトのデストラクタは、次の反復が始まる前に呼び出されることが保証されます。コンパイラによるループの展開はそれについて何かを変更しますか?
11 c++  destructor 

1
std :: function const correctness
次のような呼び出し可能なタイプがあるとします。 struct mutable_callable { int my_mutable = 0; int operator()() { // Not const return my_mutable++; } }; メンバー変数を変更するmutable_callable非定数があることに注意してくださいoperator()..... ここstd::functionで、自分のタイプからout を作成するとします。 std::function&lt;int()&gt; foo = mutable_callable{}; 今私はこれを行うことができます: void invoke(std::function&lt;int()&gt; const&amp; z) { z(); } int main() { invoke(foo); // foo changed.....oops } 今、私の知る限りstd::functionsがoperator()あるconstごとに: https://en.cppreference.com/w/cpp/utility/functional/function/operator() だから、私の直感は、あなたがこれを行うことができないはずだということです... しかし、次に見て:https : //en.cppreference.com/w/cpp/utility/functional/function/function これは、呼び出し可能な型に定数があるかどうかに制約を課していないようですoperator()...... だから私の質問はこれです:それstd::function&lt;int()&gt; const&amp;は本質的にそれと同じものであると仮定するのは正しいですstd::function&lt;int()&gt;&amp;が、実際には2つの動作に違いはありません......そしてそれが事実である場合、なぜそれがconst正しくないのですか?

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