問題タブ [placement-new]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++の「配置新規」による動的割り当て
質問:動的サイズの配列を作成するために「配置新規」を使用するにはどうすればよいですか?より具体的には、事前に割り当てられたメモリから配列要素にメモリを割り当てる方法。
私は次のコードを使用しています:
これにより、final_array *(配列ポインター)がvoid_array*によって予約されている場所から割り当てられることが保証されます。しかし、final_array要素はどうですか?事前に割り当てられたメモリからも割り当てられるようにしたい。
PS:タイルアーキテクチャを制御できるAPIを使用していると言わざるを得ません。mallocとまったく同じように機能する機能がありますが、割り当てられたメモリのプロパティを制御できるなど、他の機能もあります。したがって、基本的に行う必要があるのは、そのmallocのような関数を使用して、目的のプロパティ(たとえば、どのメモリバンクから、どこにキャッシュするかなど)でメモリを割り当てることです。
c++ - new および private コンストラクターの配置
プレースメント new を使用するカスタム メモリ アロケータがあります。次に、プライベート コンストラクターを持つクラスがあり、メモリ アロケーターを使用しようとすると、コンストラクターがプライベートであると不平を言います。
これは、新しい配置を使用してメモリを割り当て、コンストラクターを呼び出す関数です。
割り当てたいクラスは次のとおりです。
前述のように、エラーはerror C2248: 'Mesh::Mesh' : cannot access private member declared in class 'Mesh'
これを回避する良い方法はありますか?
c++ - std::vector に大量のメモリを直接読み込む方法は?
ファイルから取得した巨大な連続配列x
がfread
あります。
このチャンクを にドロップするにはどうすればよいstd::vector<>
ですか? 言い換えれば、私は結果をstd::vector<>
配列ではなく入れることを好みますが、結果の C++ コードは、チャンクを配列に直接ドロップするこの単純な C バージョンと同じくらい効率的であることを望んでいます。
調べてみると、placement-new を何らかの形で使用する必要があるのではないかと思いますが、呼び出しの順序と所有権の問題についてはよくわかりません。また、アライメントの問題について心配する必要はありますか?
with をテストしていますがT = unsigned
、どの POD 構造体でも機能する合理的な解決策を期待しています。
c++ - 新規および初期化されていない POD メンバーの配置
C++ 標準は、初期化されていない POD メンバーが新しい配置後に以前の値を保持することを保証しますか?
より正確には、次のアサートは C++11 に従って常に満たされるのでしょうか?
答えは C++03 でも同じですか?
c++ - C++11 クラス メンバ配列サイズ constexpr 前方宣言
いくつかのヘッダーを、使用後にインクルード チェーンから除外したいと考えています。私が知っていることから、c ++ 11には除外「header.h」はありません。
疑似コード 希望的観測:
問題が明らかになる私の例は次のとおりです。これは深刻な問題ではないと主張しないでください。この例は、最小限の抽象言語の使用を示すために分割されています。昔ながらの解決策とその欠点についても説明します。
古いスタイルのソリューション
justanotherheader.h:
justanothercppunit.cpp:
私の現在の解決策
justanotherheader.h:
justanothercppunit.cpp:
したがって、上記のコードは機能しています。利点は次のとおりです。複雑さを隠し、実行時に動的なメモリの間接参照がありません。は?つまり、配置 new により、オブジェクト全体をスタックに配置でき、すべてのメンバーアドレスがコンパイル時に認識されます。私の試みは、不透明なポインターのインターフェイス設計を使用しながら、最高のパフォーマンスを実現することです。
「このパフォーマンス上の利点は、考える努力に値しない」と考える場合。その質問を残してください。
私の期待される解決策
justanotherheader.h:
justanothercppunit.cpp:
私の現在のソリューションでは、sizeof(bulkywrap_pImpl) を確認し、UNKNOWNSIZE を手動で調整する必要があります。現在、編集ユニットから他のユニットに情報を取得することはできないと思います。これは通常、正当な理由で意図されていることを知っていますが、これにより c++11 の可能性が制限されます。
私は指摘したい:
情報天気と、標準でこれが許可されていない理由を見つけるのを手伝ってください。
しかしさらに、コンパイル時にリテラル定数をコンパイルユニットから別のコンパイルユニットにエクスポートする方法の解決策を見つけたいと思います。これは単なるリテラルであるため、すべてのステートメントと式は影響を受けません。したがって、コンパイルは配列のサイズがどこから来るかに依存しません。
私の提案は、ISO-jtc1-sc22-wg21 とコンパイラの開発者にいくらかの作業をもたらしますが、すべての定義が同じ変換単位に表示される必要があるため、テンプレートと constexpr の間に関連する違いは見られません。これにより、モジュラー プログラミングとクリーンなインターフェイスが偽物になります。
いいえ: プリプロセッサ マクロ、動的な新しいメンバー関数または仮想メンバー関数を使用したくありません。クラスのサイズは const であるため、最大の const-correctness が重要です。
助けてください
c++ - テンプレート配置新規およびデストラクタ
なぜそれがコンパイルされないのですか?
私が明らかに達成したいのは、生のメモリ配列で新しい配置を呼び出すことです(コンストラクターをokと呼ぶ必要があります)。次に、配列内のアイテムのデストラクタとコンストラクタを呼び出します。問題は、アイテムがテンプレートであるため、使用する場合
コンパイラは、「T()」と「〜T()」の代わりに「FooBar()」と「〜FooBar()」を見つけることを期待しています。それを行うための特定の構文はありますか?
C++11ではなくC ++03を使用しています
c++ - コピーコンストラクタを回避するための新しい配置
独自のメンバーの1つへのポインターを含む単純なクラスがあります。
私はこのようなコードを持っています:
xが再割り当てされたときに、戻り値の最適化が行われない場合x.pVal
、一時のメンバーを無効に指すのではないかと心配しています。X(2)
これを修正するためのコピーコンストラクターを作成できることに気付きました。ただし、最初にメモリ内の適切な場所にオブジェクトを作成するのではなく、最初にコピーを実行するのは無駄に思えます。
ここで配置の新しい演算子を使用するのは合理的ですか?それとも、これはデストラクタに意図しない結果をもたらしますか?
c++ - ブーストのload_construct_data:新しい配置の問題
Boostを使用して、デフォルト以外のコンストラクターを使用して派生ポインタークラスをシリアル化しようとしています。
コンパイル中にエラーが発生します:
に含め<new>
ましたDerived.h
が、何かするのを忘れた気がします。これが私が持っているコードの大まかな見積もりです。
仮想関数とデフォルト以外のコンストラクター(Base.h内)を持つ基本クラスがあります
派生クラスがあります(Derived.hに)
そして、main.cppのどこかに、派生クラスを保存してロードしたいと思います。そのため、最初に述べたコンパイルエラーにより、先に進むことができません。
私が欠けているもののヒントはありますか?
c++ - std::list で新しい配置
内部でのみ呼び出す(二重)リンクリストを実装しようとしてplacement new
います。すべてのメモリを次のような割り当てられたプールに向けます。
最初は、事前に割り当てられたメモリ プール (を管理するクラス) へのポインターを受け取る独自のクラスを実装するつもりでした。ただし、 で同じ結果を達成できないことを最初に確認したいと思いますstd::list
。特に、この SO の質問に対する David Rodríguez の回答の 3 番目のセクションが心配です。
コンポーネント ノードでandstd::list
を呼び出す必要があるのは理にかなっていますが、すべてのノードがカスタム プールに割り当てられるように、この動作を変更したいと考えています。したがって、私の質問は次のとおりです。new
delete
placement new
次のように指定する方法はありますかplacement new
std::list
:
また、カスタム アロケータを使用してノードを割り当てる必要があるため、すべてが厳密に自分のメモリ プール内に格納されます。
(注shared_ptrs
:カスタムメモリプールでもそれらが必要な場合は、カスタム割り当て/削除関数を使用する必要があることを認識しています。)
c++ - そのような代入はC ++で良い考えですか
多くのクラスには、代入演算子 (operator=) がデストラクタと同じコードであり、コピー コンストラクタのコードと非常によく似ています。
では、そのような方法で割り当てを実装することは良い考えですか?