[解決済み] Malloc vs new -- 異なるパディング
質問
私は、高性能計算 (10^5 - 10^6 コア) 用に MPI を使用する私たちのプロジェクトのために、他の人の C++ コードをレビューしています。このコードは、異なるアーキテクチャ上の (潜在的に) 異なるマシン間の通信を可能にすることを目的としています。彼は、以下のような内容のコメントを書いています。
私たちは通常
new
とdelete
を使っていますが、ここではmalloc
とfree
. これは,コンパイラによってはnew
が使われると、異なるプラットフォーム間でデータを転送する際にエラーが発生するためです。このようなことはmalloc
.
これは、私が標準から知っていることとは一致しません。
new
対
malloc
の質問をします。
new/deleteとmalloc/freeの違いは何ですか?
は、コンパイラがオブジェクトのサイズを異なる方法で計算することができるという考えをほのめかしています (しかし、それではなぜ
sizeof
?).
malloc & placement new vs. new
はかなり人気のある質問ですが、ただ
new
がコンストラクタを使用している場合
malloc
は使用しませんが、これはこの件とは関係ありません。
mallocはどのようにアライメントを理解するのでしょうか?
は、メモリが適切にアラインメントされていることが保証されているのは
new
または
malloc
というのは、私が以前考えていたことです。
私の推測では、彼は過去のある時期に自分のバグを誤診して、次のように推論したのだと思います。
new
と
malloc
は異なるパディングの量を与える、私はそれがおそらく真実ではないと思います。しかし、私はGoogleで答えを見つけることができませんし、以前の質問にもありません。
助けてください、StackOverflow、あなたは私の唯一の希望です!
どのように解決するのですか?
IIRCは1つだけ厄介な点があります。
malloc
はどんな標準的な型に対しても整列されたアドレスを返すことが保証されています。
::operator new(n)
は任意の標準的な型に対してアラインされたアドレスを返すことだけが保証されています。
nより大きくない
であり、もし
T
が文字型でない場合は
new T[n]
に対して整列されたアドレスを返すことが要求されるだけです。
T
.
しかし、これはポインタの下位数ビットをフラグの格納に使用するような実装特有のトリックを行う場合、またはアドレスが厳密に必要以上にアライメントされていることに依存する場合にのみ関連しています。
オブジェクト内のパディングには影響しません。オブジェクトは、それが占めるメモリをどのように割り当てたかに関係なく、必然的にまったく同じレイアウトになります。したがって、この違いがデータ転送のエラーにつながるとは考えにくいのです。
そのコメントの著者がスタック上またはグローバル内のオブジェクトについて何を考えているか、彼の意見ではそれらが malloc のようにパディングされているのか、または new のようにパディングされているのか、何かしるしはありますか?それは、そのアイデアがどこから来たのかの手がかりを与えるかもしれません。
多分彼は混乱しているのでしょうが、多分彼の言っているコードは
malloc(sizeof(Foo) * n)
対
new Foo[n]
. という感じかもしれませんね。
malloc((sizeof(int) + sizeof(char)) * n);
vs.
struct Foo { int a; char b; }
new Foo[n];
つまり、もしかしたら彼は
と言い
"私は malloc" を使っていますが
というのは
"構造体を使う代わりに、手動でデータをアラインメントされていない場所にパックしています" を意味します。実際には
malloc
は構造体を手動でパックするためには必要ありませんが、そのことに気づかないのは混乱の度合いが小さいからです。必要なのは、ワイヤを介して送信されるデータのレイアウトを定義することです。実装によっては
構造体
が使用される場合、実装によってデータの詰め方が異なります。
関連
-
[解決済み] テスト
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] ビューのパディングとマージンの違いについて
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] mallocはアライメントをどのように理解しているのですか?
-
[解決済み】new/deleteとmalloc/freeの違いは何ですか?